46 votos

Efectos de la configuración de la vm.overcommit_memory

Mi VPS servidor web que se ejecuta en CentOS 5.4 (kernel de Linux 2.6.16.33-xenU) de forma irregular (como una vez al mes o menos un par de semanas) deja de responder debido a oom killer patadas en. Monitoreo del servidor muestra que no se ejecutan fuera de la memoria, cada tan a menudo.

He leído un par de blogs que apuntan a esta página que trata de configurar el kernel para administrar mejor de sobreasignación utilizando la siguiente configuración sysctl:

vm.overcommit_memory = 2
vm.overcommit_ratio = 80

Mi comprensión de este (que puede estar equivocado, pero no puedo encontrar una definición canónica de aclarar) es que esto impide que el núcleo de la sobre-asignación de memoria más allá de swap + 80% de la memoria física.

Sin embargo, también he leído algunas otras fuentes, lo que sugiere que estos valores no son una buena idea - aunque los críticos de este enfoque parece estar diciendo "no hagas las cosas para romper su sistema, en lugar de intentar este parche" en el supuesto de que la causalidad es siempre conocido.

Así que mi pregunta es, ¿cuáles son los pros y los contras de este enfoque, en el contexto de una Apache2 servidor web que aloja a unos 10 bajos sitios de tráfico? En mi caso particular, el servidor web tiene 512 mb de RAM, con 1024 mb de espacio de intercambio. Este parece ser el adecuado para la gran mayoría del tiempo.

38voto

Andriyev Puntos 9238

Configuración de overcommit_ratio a 80 no es probable que la acción correcta. Al establecer el valor de nada menos que 100 es casi siempre incorrecta.

La razón de esto es que las aplicaciones de linux asignar más de lo que realmente necesita. Dicen que asignar 8 kb para almacenar un par de cadenas de caracteres de texto. Bueno esa es varios KB no utilizados allí. Las aplicaciones hacen de este una gran cantidad, y esto es lo que sobreasignación está diseñado para.
Así que, básicamente, con la de sobreasignación en 100, el kernel no permitir que las aplicaciones para asignar más memoria de la que tiene (swap + ram). Configuración en menos de 100 significa que usted nunca tendrá que utilizar toda tu memoria. Si usted va a establecer esta configuración, se debe establecer superior a 100 porque el mencionado escenario, que es bastante común.

Ahora, en cuanto a tu problema con el OOM killer disparo, la configuración manual de sobreasignación no es probable que arreglar esto. La configuración predeterminada (heurística de determinación) es bastante inteligente.
Si usted desea ver si esto es realmente la causa del problema, mira /proc/meminfo cuando el OOM killer pistas. Si usted ve que Committed_AS está cerca de CommitLimit, pero free sigue mostrando la memoria libre disponible, entonces sí puede ajustar manualmente la sobreasignación para su escenario. Si este valor es demasiado bajo hará que el OOM killer para empezar a matar a las aplicaciones cuando usted todavía tiene un montón de memoria libre. Si el valor es demasiado alto puede causar al azar aplicaciones a morir cuando se trate de utilizar la memoria de ellos fueron asignados, pero no está realmente disponible (cuando toda la memoria en realidad acostumbrarse).

30voto

Alex North-Keys Puntos 318

Sección 9.6 "de Sobreasignación y OOM" en el doc que @dunxd menciona es especialmente gráfico sobre los peligros de permitir que de sobreasignación. Sin embargo, el 80 parecía interesante para mí, así que he realizado un par de pruebas.

Lo que he encontrado es que el overcommit_ratio afecta a la cantidad total de RAM disponible para TODOS los procesos. Los procesos de root, no parecen ser tratadas de manera diferente a los normales procesos de usuario.

Ajuste de la relación de a 100 o menos) debe proporcionar el clásico de la semántica, donde los valores de retorno de malloc/sbrk son fiables. La configuración de proporciones inferiores a 100 podría ser una manera de reservar más memoria RAM para que no se procesan actividades como el almacenamiento en caché y así sucesivamente.

Así que, en mi equipo con 24 Gb de RAM, con el swap desactivado, 9 GiB en uso, con top mostrando

Mem:  24683652k total,  9207532k used, 15476120k free,    19668k buffers
Swap:        0k total,        0k used,        0k free,   241804k cached

Aquí están algunos overcommit_ratio configuración y la cantidad de RAM que mi ram-consumidor programa podría agarrar (tocar cada página) - en cada caso, el programa salió limpiamente una vez malloc error.

 50    ~680 MiB
 60   ~2900 MiB
 70   ~5200 MiB
100  ~12000 MiB

La ejecución de varias a la vez, incluso con algunos como el usuario root, no cambia la cantidad total que consumen juntos. Es interesante que no era capaz de consumir los últimos 3+ GiB o, lo free no caer muy por debajo de lo que se muestra aquí:

Mem:  24683652k total, 20968212k used,  3715440k free,    20828k buffers

Los experimentos fueron desordenado - nada que usa malloc en el momento en que todos RAM está en uso tiende a bloquearse, ya que muchos programadores son terribles acerca de la comprobación de malloc fallas en C, algunos populares de la colección de las bibliotecas de ignorarlo por completo, y C++, y varios otros idiomas, son aún peores.

La mayoría de las primeras implementaciones de los imaginarios de RAM que vi fueron para manejar un caso específico, donde un solo gran proceso - decir el 51%+ de memoria disponible necesaria para fork() para exec() algún programa de apoyo, generalmente, mucho más pequeña. Sistemas operativos con copy-on-write semántica permitiría a la fork(), pero con la salvedad de que si la horquilla proceso que en realidad se trató de modificar demasiadas páginas de memoria (cada uno de los cuales habrá que crear una instancia como una nueva página independiente de la inicial enorme proceso) que acabaría muriendo. El proceso padre estaba en peligro si asigna más memoria, y puede manejar, en algunos casos solo por esperar un poco para algún otro proceso de morir, y luego continuar. El proceso hijo generalmente acaba de reemplazar a sí mismo con un (normalmente más pequeñas) del programa a través de la exec() y fue entonces libre de la condición.

Linux de sobreasignación concepto es un enfoque extremo que permite tanto el fork() a ocurrir, así como permitir que los procesos únicos de forma masiva overallocate. OOM killer-causado muertes ocurren de forma asincrónica, incluso a los programas que hacen de la manija de la asignación de memoria de forma responsable. Yo personalmente odio de todo el sistema de sobreasignación en general y el oom killer en particular -, se fomenta un diablo de mayo de enfoque de la atención a la gestión de la memoria que infecta a las bibliotecas y a través de ellos cada aplicación que los utiliza.

Yo sugeriría que la configuración de la relación de a 100, y tener una partición swap, así que generalmente sólo terminan siendo utilizado por grandes procesos - que a menudo son sólo utilizar una pequeña fracción de la parte de sí que se pone a macerar en swap, y así proteger la gran mayoría de los procesos desde el OOM killer misfeature. Esto debería mantener su servidor web seguro de muerte al azar, y si fue escrito para manejar malloc de forma responsable, segura, incluso de matar a sí mismo (pero no apostaría por la segunda).

Eso significa que yo estoy usando esto en /etc/sysctl.d/10-no-overcommit.conf

vm.overcommit_memory = 2
vm.overcommit_ratio = 100

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X