¿Hay alguna forma de decirle al kernel de Linux que solo use un cierto porcentaje de memoria para la memoria caché del búfer? Sé que /proc/sys/vm/drop_caches
se puede usar para borrar el caché temporalmente, pero ¿hay alguna configuración permanente que evite que crezca a más del 50% de la memoria principal?
La razón por la que quiero hacer esto es que tengo un servidor que ejecuta un OSD Ceph que constantemente sirve datos del disco y logra usar toda la memoria física como caché de búfer en unas pocas horas. Al mismo tiempo, necesito ejecutar aplicaciones que asignarán una gran cantidad (varios 10s de GB) de memoria física. Contrariamente a la creencia popular (vea el consejo dado en casi todas las preguntas relacionadas con el caché del búfer), la liberación automática de la memoria al descartar las entradas de caché limpias no es instantánea: iniciar mi aplicación puede tomar hasta un minuto cuando el caché del búfer está lleno ( *), mientras que después de borrar el caché (usando echo 3 > /proc/sys/vm/drop_caches
), la misma aplicación se inicia casi instantáneamente.
(*) Durante este minuto de tiempo de inicio, la aplicación falla en la nueva memoria pero pasa el 100% de su tiempo en el núcleo, según Vtune en una función llamada pageblock_pfn_to_page
. Esta función parece estar relacionada con la compactación de memoria necesaria para encontrar páginas enormes, lo que me lleva a creer que en realidad la fragmentación es el problema.
fuente
Respuestas:
Si no desea un límite absoluto, pero simplemente presiona el núcleo para que elimine los búferes más rápido, debe mirar
vm.vfs_cache_pressure
El rango va de 0 a 200. Muévelo hacia 200 para una mayor presión. El valor predeterminado se establece en 100. También puede analizar el uso de su memoria con el
slabtop
comando. En su caso, los valoresdentry
y*_inode_cache
deben ser altos.Si desea un límite absoluto, debe buscarlo
cgroups
. Coloque el servidor Ceph OSD dentro de un cgroup y limite la memoria máxima que puede usar configurando elmemory.limit_in_bytes
parámetro para el cgroup.Referencias
[1] - GlusterFS Linux Kernel Tuning
[2] - Guía de gestión de recursos RHEL 6
fuente
limit_in_bytes
set parece hacerlo. ¡Gracias!vfs_cache_pressure
solo borra cachés de dentry e inodo, y no tiene nada que ver con el caché de búfer.vfs_cache_pressure
arriba100
puede ayudar en caso de que no tenga suficiente RAM para su carga de trabajo. Reducirá el uso de RAM, pero en general provocará un rendimiento de E / S más pobre.No sé acerca de A%, pero puede establecer un límite de tiempo para que caiga después de x cantidad de minutos.
Primero en una terminal
Para borrar cachés actuales.
Haga que
cron-job
presione Alt-F2, escribagksudo gedit /etc/crontab
, luego agregue esta línea cerca de la parte inferior.Esto limpia cada 15 minutos. Puede configurarlo en 1 o 5 minutos si realmente lo desea cambiando el primer parámetro a * o * / 5 en lugar de * / 15
Para ver su RAM libre, excepto el caché:
fuente
3 > drop_caches
incluye el comportamiento desync
Creo que su presentimiento al final de su pregunta está en el camino correcto. Sospecho que A, la asignación de memoria compatible con NUMA migra páginas entre CPU o B, más probablemente, el código de desfragmentación de páginas enormes transparentes que intentan encontrar regiones contiguas y alineadas.
Se han identificado páginas enormes y páginas enormes transparentes para ambas mejoras de rendimiento marcadas en ciertas cargas de trabajo y responsables de consumir enormes cantidades de tiempo de CPU sin proporcionar muchos beneficios.
Sería útil saber qué kernel está ejecutando, el contenido de / proc / meminfo (o al menos los valores HugePages_ *) y, si es posible, más del callgraph de vtune profiler haciendo referencia a pageblock_pfn_to_page ().
Además, si puede darse el gusto, intente deshabilitar la desfragmentación de página enorme con:
(puede ser esto en su lugar, dependiendo de su núcleo :)
Por último, ¿esta aplicación está usando muchas decenas de gigas de ram algo que escribiste? ¿Que lenguaje?
Como usó el término "falla en las páginas de memoria", supongo que está familiarizado con el diseño operativo y la memoria virtual. Me cuesta imaginar una situación / aplicación que estaría fallando de manera tan agresiva que no se lee en muchas E / S, casi siempre desde el caché del búfer que estás tratando de limitar.
(Si tiene curiosidad, consulte los indicadores mmap (2) como MAP_ANONYMOUS y MAP_POPULATE y mincore (2) que se pueden usar para ver qué páginas virtuales tienen una página física asignada).
¡Buena suerte!
fuente
Si Ceph OSD es un proceso separado, puede usar cgroups para controlar los recursos utilizados por el proceso:
Cree un cgroup llamado como group1 con un límite de memoria (de 50 GB, por ejemplo, se admiten otros límites como CPU, por ejemplo, también se menciona CPU):
Luego, si su aplicación ya se está ejecutando, traiga la aplicación a este cgroup:
O ejecute su aplicación dentro de este cgroup:
fuente
tuned es un demonio de ajuste dinámico del sistema adaptativo que ajusta la configuración del sistema dinámicamente según el uso.
Consulte la documentación relacionada y los archivos de configuración.
Información adicional
El comando de sincronización vacía el búfer, es decir, obliga a que todos los datos no escritos se escriban en el disco, y se puede usar cuando se quiere estar seguro de que todo está escrito de forma segura. En los sistemas UNIX tradicionales, hay un programa llamado actualización que se ejecuta en segundo plano que hace una sincronización cada 30 segundos, por lo que generalmente no es necesario usar la sincronización. Linux tiene un demonio adicional, bdflush , que realiza una sincronización más imperfecta con mayor frecuencia para evitar la congelación repentina debido a la E / S de disco pesado que a veces causa la sincronización .
En Linux, bdflush se inicia por actualización. Por lo general, no hay razón para preocuparse por eso, pero si bdflush muere por alguna razón, el núcleo lo advertirá y debe comenzarlo a mano ( / sbin / update ).
fuente