Escenario: De repente, mi computadora se siente lenta. El mouse se mueve pero las ventanas tardan mucho en abrirse, etc. uptime
dice que la carga es 7,69 y aumenta.
¿Cuál es la forma más rápida de averiguar qué procesos son la causa de la carga?
Ahora bien, las herramientas "principales" y similares no son la respuesta porque muestran el uso de CPU o memoria, pero no ambos al mismo tiempo. Lo que necesito es un comando único que pueda escribir a medida que sucede, algo que resuelva cualquiera de
El sistema está intentando intercambiar 8 GB de RAM al disco porque el proceso X...
o
El proceso X busca en todo el disco.
o
El proceso X usa 400% de CPU"
Entonces, lo que estoy buscando es que iostat, htop/atop y herramientas similares se ejecuten en una sola con un resultado como este:
1235 cp - Disk trashing
87 chrome - Uses 2 GB of RAM
137 nfs_bench - Uses 95% of the network bandwidth
No quiero una herramienta que me proporcione algunos números que pueda analizar, sino una herramienta que me diga exactamente qué proceso causa la carga actual. Supongamos que el usuario frente al teclado apenas sabe cómo escribir "proceso", pero rápidamente se siente abrumado cuando se trata de "tamaño residente", "memoria virtual" o "ciclo de vida del proceso".
Mi argumento es el siguiente: un usuario nota un problema. Puede haber miles de razones... bueno, casi :-) El usuario quiere saber el origen del problema.
Las soluciones actuales me dan muchos números y necesito saber qué significan esos números. Lo que estoy buscando es una metaherramienta. El 99% de los datos son irrelevantes para el problema. Entonces, lo que la herramienta debería hacer es buscar procesos que acaparan algunos recursos y enumerar solo aquellos junto con "este proceso necesita mucha CPU, esto produce muchas IRQ, este proceso asigna mucha RAM (y todavía está creciendo)".
Esta será una lista relativamente corta. Será mucho más sencillo para alguien nuevo en esto localizar al culpable de esta lista que de la salida de, digamos, htop
que me da alrededor de 5000 números pero requiere que yo mismo complete procesos multiproceso (tengo 50 líneas que dicen VIRT 2750M
pero sólo 16 GB de RAM (la máquina debería funcionar automáticamente pero, por supuesto, esto es una mala interpretación de los datos que puede ocurrir rápidamente).
Respuesta1
Tengo que sonreír ante las respuestas porque cada una te dijo que ejecutaras la herramienta X. El único problema es que si lo que estás viendo es intermitente, no habrá forma de correlacionar nada. una herramienta comosarpuede ayudar si lo ejecutas a una frecuencia suficientemente alta, pero yo diríarecogeres aún mejor.
Comosar, lo ejecutas como un demonio instalando el RPM y haciendo /etc/init.d/collectl start
.
Ahora, cuando vea algo lento, collectl -p /var/log/collectl/filename --top
reproducirá los datos y le mostrará los procesos principales. También podrías haber corrido collectl --top
y verlos en tiempo real. Por cierto, cualquier cosa que puedas hacer en tiempo real también puedes reproducirla.
En cuanto a la carga de la CPU, ¿qué pasa si te sobrecargan con interrupciones? collectl -sC
no solo mostrará las cargas en CPU individuales (o el uso -sc
para carga promedio), sino que también mostrará cómo emplean su tiempo. Incluya -j
( -scj
) y verá la cantidad de interrupciones/CPU. Utilice mayúsculas -J
y verá los TIPOS de cada interrupción/CPU.
Por supuesto, si realmente le gusta vmstat, siempre puede reproducir datos recopilados --vmstat
y mostrará datos históricos en formato vmstat.
Hay muchos más interruptores de los que tengo tiempo de enumerar, pero puedes consultarlos enFuenteForgeo simplemente búsquelo en Google.
Respuesta2
"arriba" funciona razonablemente bien, siempre y cuando se observen los números correctos. Vamos a ver:
top - 13:11:45 up 13 days, 1:13, 21 users, load average: 0.06, 0.11, 0.26
Tasks: 271 total, 2 running, 267 sleeping, 0 stopped, 2 zombie
Cpu(s): 19.0%us, 6.3%sy, 0.0%ni, 74.0%id, 0.5%wa, 0.0%hi, 0.2%si, 0.0%st
Mem: 8183668k total, 8002712k used, 180956k free, 12476k buffers
Swap: 11847900k total, 723480k used, 11124420k free, 767016k cached
Ahora, si el sistema es lento porque se utiliza toda la CPU, se muestra como que las columnas "us" y "sy" en la fila "Cpu(s):" están cerca del 100% juntas.
Si es lento debido al intercambio, "Mem:" "free" muestra valores muy bajos y "Swap:" "used" valores altos.
Si es lento debido aE/Sen general, "Cpu(s):" "wa" indica que se dedica tiempo a la espera de E/S.
Ahora, si sabe que las esperas de E/S son el problema, puede usar los programas "iotop" para saber qué procesos crean la mayor cantidad de E/S.
Respuesta3
Según el uso del 400%, asumiré que tienes un procesador de cuatro núcleos. Su carga promedio es casi el doble de la capacidad y la mitad de los procesos están esperando CPU.
Primero, renice
coloque su shell en 0 o -10 para obtener un sistema con mayor capacidad de respuesta, y luego utilícelo htop
para encontrar los procesos ofensivos y siga con strace
un proceso determinado. Otras herramientas que podrían resultar útiles son:
vmsat
sar
iostat
pmap
Respuesta4
vmstat podría ayudarte en términos generales. Un ejemplo de uso es:
$ vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
1 0 0 977908 426184 1543884 0 0 38 45 106 385 4 1 95 1
También puedes ejecutarlo cada X segundos; simplemente agrega el número X después del comando.
Editar: en vista del comentario... Escriba lo siguiente en un archivo y conviértalo en ejecutable. Le indicará los 3 procesos principales en la máquina.
top -n 1 | tail -16 | head -4 | awk '{print $13}'
Si desea saber qué memoria acapara en lugar de CPU, lea la página de manual superior y cambie el orden de visualización.