Hola Santiago. Lo primero gracias por responder. Antes de que respondieras, ya había cambiado el overcommit_memory a 2 con el ratio a 75. Te comento dentro de tu correo:
El 8 de abril de 2017, 13:52, Santiago Vila <[email protected]> escribió: > On Thu, Apr 06, 2017 at 11:49:18PM +0200, luis gil wrote: > > > ¿Alguien se ha visto en > > la necesidad de modificar este parámetro? ¿le ha funcionado? > > Sí y sí. > > Pero hay otras cosas interesantes que se pueden hacer además de poner > el parámetro ese a 2. > > - Asegúrate de que tienes suficiente swap. Por ejemplo, si tus > aplicaciones hacen overcommit en proporción de 1:2 (es decir, piden el > doble de la memoria que realmente necesitan), entonces lo lógico sería > tener una partición de swap del mismo tamaño que la RAM. De lo > contrario estás infrautilizando la RAM. > ¿Como puedo saber si mis aplicaciones hacen overcommit en proporción 1:2? Mi RAM es de 32 G. Me parece excesivo una swap de ese tamaño. > > - Si pones vm.overcommit_memory = 2, pon también vm.overcommit_ratio = 100 > como mínimo. De lo contrario estás infrautilizando la RAM de nuevo. > > Según había leído por ahí en varios sitios (no he encontrado mucha información sobre este tema), cuando pones el overcommit_memory a 2, se fija un nivel de memoria RAM a partir del cual se empiezan a matar procesos. Este nivel se calcula realizando la siguiente operación Cantidad SWAT + Cantidad RAM * ratio / 100. Poniendo el ratio a 75 el nivel se queda un poco por debajo de la RAM, de esta forma se consigue que el sistema no empiece a swapear. Al menos así lo he entendido yo en la documentación que he encontrado. Me puedo equivocar. Te paso el estado de la memoria justo antes de un oom-killer y justo después: lacuqui@Homer3:~$ cat /proc/meminfo | grep -e MemFree -e CommitLimit -e Committed_AS -e MemTotal -e SwapTotal -e SwapFree MemTotal: 33270104 kB MemFree: 17961848 kB SwapTotal: 7079928 kB SwapFree: 7072288 kB CommitLimit: 32032504 kB Committed_AS: 4819852 kB lacuqui@Homer3:~$ cat /proc/meminfo | grep -e MemFree -e CommitLimit -e Committed_AS -e MemTotal -e SwapTotal -e SwapFree MemTotal: 33270104 kB MemFree: 21839200 kB SwapTotal: 7079928 kB SwapFree: 7072288 kB CommitLimit: 32032504 kB Committed_AS: 3661152 kB En estos momentos el overcommit_memory estaba puesto a 0 (probé a ponerlo a 2 pero ocurría lo mismo así que lo dejé como estaba) y el ratio a 75. Se ve como el CommitLimit es 32032504, coincidiendo con la fórmula, aunque como el overcommit_memory está puesto a 0 no aplica, sólo lo hace si esta a 2.También se ve como la memoria libre sube de 17 a 21 G después del oom-killer. La swap ni la toca. Cuando ocurrió este oom-killer estaba ejecutando una sentencia LOAD DATA LOCAL INFILE de un fichero csv de 1,5 G a través de la aplicación php. Esta carga se viene haciendo todos los días desde hace varios años, aunque el fichero es un poco más grande cada día (quizás se ha alcanzado algún límite, aunque no sé cual). Al tercer o cuarto intento carga el fichero. Como se puede apreciar la memoria libre en el momento del oom-killer es de más de 17G. No tiene sentido. O estoy monitorizando mal la memoria o la gestión de memoria no funciona como yo me creo. También pensé que a lo mejor la memoria que se estaba llenando es la Low, pero este es su estado antes y después del mismo oom-killer: lacuqui@Homer3:~$ free -lm total used free shared buffers cached Mem: 32490 14968 17521 0 2 12999 Low: 620 358 261 High: 31870 14609 17260 -/+ buffers/cache: 1966 30523 Swap: 6913 7 6906 lacuqui@Homer3:~$ free -lm total used free shared buffers cached Mem: 32490 11172 21317 0 4 10414 Low: 620 357 262 High: 31870 10814 21055 -/+ buffers/cache: 753 31736 Swap: 6913 7 6906 La memoria Low libre ronda los 260M. La tengo monitorizada cada 5 mn y nunca ha bajado de 190M. > - Si estás usando Apache en modo fork, considera usar otros modos. > En particular debes asegurarte de que una avalancha de visitas > no pueda elevar la memoria usada por Apache sin ningún límite. > (Hay parámetros para esas cosas si los sabes buscar). > La memoria que utiliza apache la monitorizo con el siguiente comando ps -C apache2 -o rss --no-headers | awk '{ sum += $1 } END { print sum/1024 }' cada 5 mn. El número de usuarios lo tengo limitado a 150. Pocas veces llega a tantos usuarios y en esos casos la memoria que ocupa apache es de 1,3 G en total. Entiendo que esto incluye la memoria que está ocupando php .... > > - Si no estás usando PHP-FPM como forma de que funcione PHP, considera > usarlo en lugar de lo que estés usando. Esto ayuda muchísimo a que la > cantidad de RAM en uso se mantenga dentro de unos límites. > > - Una vez que estés usando PHP-FPM, si lo único que necesitas de > Apache es que sirva ficheros y funcione PHP, considera además usar > nginx en lugar de Apache, suele gastar menos memoria. > > Creo que el problema está más en la configuración del mysql, ya que esto mismo me ha ocurrido lanzando una consulta LOAD DATA LOCAL INFILE directamente al mysql, sin apache ni php ni nada. Y con un csv bastante más pequeño. De hecho de lo primero que desconfié fue de este comando pero no encontré nada en internet que asocie este comando con un out of memory intempestivo. El caso es que hay procesos bastante grandes que no utilizan este comando y se ejecutan sin problemas, algunos consumiendo mucha RAM. Perdonad el rollo. Es fruto de mi desesperación. En cualquier momento el jefe de va a colgar de los pulgares y se me están acabando las ideas. Un saludo.

