
Ú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 -r
para 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.