Pérdida de memoria en el servidor web

Pérdida de memoria en el servidor web

Últimamente he tenido algunos problemas de rendimiento del servidor. Actualmente estamos ejecutando un servidor Fedora con 4 GB y 160 GB de espacio en disco. Prácticamente estamos cerrando el disco, con todos los archivos que tenemos a bordo. Estamos ejecutando varios sitios web con múltiples copias de seguridad para cada sitio web. Sin embargo, sólo un sitio recibe tráfico. Es un sitio de comercio electrónico con una buena cantidad de visitantes.

Últimamente ha habido tiempos de carga lentos y noto que nuestra memoria libre se está agotando mucho (por debajo de un GB). Reiniciaré el servidor (lo que ahora tengo que hacer 3 veces al día) y todo estará bien. Comenzamos con 2,2 GB de memoria liberada, pero después de 3 o 4 horas notas que la memoria se está absorbiendo y los tiempos de carga se aceleran. No puedo entender de dónde viene esto o si es hora de que actualicemos a un servidor mejor. Simplemente no quiero actualizar y luego darme cuenta de que tengo un cuello de botella en algún lugar con solicitudes de MySQL.

Cualquier idea o sugerencia será apreciada.

EDITAR-

También hay 3 vhosts y tengo más de 60.000 archivos.

             total       used       free     shared    buffers     cached
Mem:          4003       3372        630          0        398       1717
-/+ buffers/cache:       1256       2746
Swap:         8189          0       8189

21:21:49 up 46 min,  1 user,  load average: 3.75, 4.20, 4.03

procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  2      0 592728 409640 1838360    0    0   165   411  953  473  9  8 47 36  0

Y aquí está la instantánea superior.

 1356 mysql     20   0 1374m 219m 5320 S  5.6  5.5  14:06.21 mysqld
15796 root      20   0  103m  20m  440 D  1.0  0.5   0:04.42 sendmail
 1081 root      20   0  103m  20m  440 D  0.7  0.5   0:21.73 sendmail
24013 root      20   0 97416  22m 2648 D  0.7  0.6   0:15.15 mailq
 1525 root      20   0  247m 7980 3472 S  0.3  0.2   0:06.88 vlogger (access
 1530 apache    20   0  539m  13m 3008 S  0.3  0.3   0:03.56 httpd
 2399 apache    20   0  539m  12m 2748 S  0.3  0.3   0:00.85 httpd
 5763 root      20   0  121m 4932 3868 S  0.3  0.1   0:00.07 sshd
12326 apache    20   0  539m  12m 2992 S  0.3  0.3   0:00.38 httpd
12421 apache    20   0  539m  12m 2988 S  0.3  0.3   0:00.45 httpd
16396 apache    20   0  538m  12m 2284 S  0.3  0.3   0:00.09 httpd
17050 root      20   0 15368 1256  868 R  0.3  0.0   0:00.09 top
    1 root      20   0 37336 4104 1908 S  0.0  0.1   0:02.82 systemd
    2 root      20   0     0    0    0 S  0.0  0.0   0:00.00 kthreadd
    3 root      20   0     0    0    0 S  0.0  0.0   0:00.03 ksoftirqd/0
    5 root       0 -20     0    0    0 S  0.0  0.0   0:00.00 kworker/0:0H
    6 root      20   0     0    0    0 S  0.0  0.0   0:00.00 kworker/u:0
    7 root       0 -20     0    0    0 S  0.0  0.0   0:00.00 kworker/u:0H
    8 root      RT   0     0    0    0 S  0.0  0.0   0:00.11 migration/0
    9 root      RT   0     0    0    0 S  0.0  0.0   0:00.01 watchdog/0
   10 root      RT   0     0    0    0 S  0.0  0.0   0:00.14 migration/1
   12 root       0 -20     0    0    0 S  0.0  0.0   0:00.00 kworker/1:0H
   13 root      20   0     0    0    0 S  0.0  0.0   0:00.02 ksoftirqd/1
   14 root      RT   0     0    0    0 S  0.0  0.0   0:00.01 watchdog/1
   15 root      RT   0     0    0    0 S  0.0  0.0   0:00.15 migration/2
   17 root       0 -20     0    0    0 S  0.0  0.0   0:00.00 kworker/2:0H
   18 root      20   0     0    0    0 S  0.0  0.0   0:00.03 ksoftirqd/2
   19 root      RT   0     0    0    0 S  0.0  0.0   0:00.01 watchdog/2
   20 root      RT   0     0    0    0 S  0.0  0.0   0:00.11 migration/3
   22 root       0 -20     0    0    0 S  0.0  0.0   0:00.00 kworker/3:0H
   23 root      20   0     0    0    0 S  0.0  0.0   0:00.02 ksoftirqd/3
   24 root      RT   0     0    0    0 S  0.0  0.0   0:00.01 watchdog/3
   25 root       0 -20     0    0    0 S  0.0  0.0   0:00.00 cpuset
   26 root       0 -20     0    0    0 S  0.0  0.0   0:00.00 khelper
   27 root      20   0     0    0    0 S  0.0  0.0   0:00.00 kdevtmpfs
   28 root       0 -20     0    0    0 S  0.0  0.0   0:00.00 netns
   29 root      20   0     0    0    0 S  0.0  0.0   0:00.00 xenwatch

Respuesta1

Aumente sar y genere la tabla ps cada minuto. Ver mi respuesta detalladaaquí.

La próxima vez que el servidor explote, utilícelo sar -rpara ayudar a localizarcuandoocurrió. Ahora use la salida de ps-cronjob o de micontenedor de perl para ps en github, para descubrir qué proceso puede haber sido el culpable.

Digamos que el servidor explotó entre las 12:00:00 y las 13:00:00. Usar sar -r -s 12:00:00 -e 13:00:00. A partir de esto deberías ver un aumento en los datos. (Si es más fácil, hay una utilidad basada en Java para hacer gráficos, pero normalmente no vale la pena). Digamos que ves un pico (o un mínimo) a las 12:15. Ahora escanee la salida ps en columnas para un rango de tiempo entre, digamos, 12:00 y 12:15, ordénela por pid y luego por hora, y observe las columnas de memoria:

awk '/^=== .* 12:00:/,/^=== .* 12:16:/' /var/log/sa/ps/today |
 sort -k 1n -k 16 

(Las opciones de clasificación suponen que la hora está en la columna 16, lo que puede ser el caso o no). Ahora puedes filtrar esa salida a través de awk nuevamente para encontrar diferencias entre las líneas de salida:

... | awk 'lastpid && lastpid==$1 && last != $0 { print} /^[0-9]/ { lastpid=$1;last=$0; }'

Ese es un filtro bastante tosco. Para algunos procesos (cuya línea de comando cambia todo el tiempo, como con mysql, postgresql y snmpd), esto no será muy útil, pero con suerte podrás modificar el awk para ayudarte a encontrar a los culpables.

información relacionada