Cómo encontrar los procesos que acaparan la máquina

Cómo encontrar los procesos que acaparan la máquina

Escenario: De repente, mi computadora se siente lenta. El mouse se mueve pero las ventanas tardan mucho en abrirse, etc. uptimedice 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, htopque me da alrededor de 5000 números pero requiere que yo mismo complete procesos multiproceso (tengo 50 líneas que dicen VIRT 2750Mpero 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 --topreproducirá los datos y le mostrará los procesos principales. También podrías haber corrido collectl --topy 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 -sCno solo mostrará las cargas en CPU individuales (o el uso -scpara 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 -Jy verá los TIPOS de cada interrupción/CPU.

Por supuesto, si realmente le gusta vmstat, siempre puede reproducir datos recopilados --vmstaty 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, renicecoloque su shell en 0 o -10 para obtener un sistema con mayor capacidad de respuesta, y luego utilícelo htoppara encontrar los procesos ofensivos y siga con straceun 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.

información relacionada