La utilizacion del procesdor en sistemas linux se debe a los diferentes procesos o servicios que puede correr un servidor Linux. A continuacion les mostrare comandos o herramientas para poder detectar cuellos de botella, uso de CPU y resolver problemas de desempeño.
Top
El comando top provee una vista en tiempo real del sistema. Despliega un resumen de la informacion del sistema asi como listado de tareas que estan siendo ejecutadas por el kernel.
:~$ top
top - 17:53:29 up 2 days, 7:59, 3 users, load average: 0.54, 0.38, 0.41 Tasks: 185 total,  1 running, 184 sleeping,  0 stopped,  0 zombie Cpu0 : 4.9%us, 0.7%sy, 0.0%ni, 93.7%id, 0.2%wa, 0.1%hi, 0.4%si, 0.0%st Cpu1 : 4.9%us, 0.8%sy, 0.0%ni, 93.7%id, 0.2%wa, 0.1%hi, 0.4%si, 0.0%st Cpu2 : 5.2%us, 0.8%sy, 0.0%ni, 93.3%id, 0.2%wa, 0.1%hi, 0.4%si, 0.0%st Cpu3 : 5.1%us, 0.8%sy, 0.0%ni, 93.3%id, 0.2%wa, 0.1%hi, 0.4%si, 0.0%st Mem:  3963916k total, 3926568k used,   37348k free,   72776k buffers Swap: 5855652k total,   62360k used, 5793292k free, 2928928k cached PID USER     PR NI VIRT RES SHR S %CPU %MEM   TIME+ COMMAND 13474 www-data 20  0 154m 26m 3080 S  14 0.7  7:52.26 python 16519 www-data 20  0 157m 38m 3064 S   6 1.0  6:12.95 python 922 root     20  0 175m 5544 3264 S   2 0.1  7:05.27 iftop
Como podran ver el comando nos despliega el porcentaje de utilizacion del tiempo de CPU. En el ejemplo vemos un sistema de multiples procesadores (entorno SMP)
Utilizar mpstat para medir la utilizacion de CPU en linux
Ahora es necesario instalar el paquete sysstat para poder utilizar las herramientas citadas a continuacion:
Debian/Ubuntu
:~# apt-get install sysstat
RHEL
:~# up2date sysstat
Desplegar el uso de cada CPU individualmente con mpstat
Si tienen multiples procesadores o SMP lo qu es algo comun con el Core2 o Core Duo, tecleamos el comando
root@Rocknrolla:~# mpstat Linux 2.6.32-27-generic (Rocknrolla)    01/19/2011    _x86_64_   (2 CPU) 09:49:17 PM CPU   %usr  %nice   %sys %iowait   %irq  %soft %steal %guest  %idle 09:49:17 PM all  28.99   0.28   5.21   1.14   0.42   0.12   0.00   0.00  63.84
Elk comando mpstat despliega las actividades de cada procesador disponible, siendo el procesador 0 el primero. Las actividades globales de todos los procesadores son reportadas ya sea en arquitecturas SMP o UP.
root@Rocknrolla:~# mpstat -P ALL Linux 2.6.32-27-generic (Rocknrolla)    01/19/2011    _x86_64_   (2 CPU) 09:53:52 PM CPU   %usr  %nice   %sys %iowait   %irq  %soft %steal %guest  %idle 09:53:52 PM all  29.20   0.44   5.24   1.13   0.42   0.12   0.00   0.00  63.45 09:53:52 PM   0  27.86   0.25   5.52   1.74   0.37   0.24   0.00   0.00  64.02 09:53:52 PM   1  30.50   0.62   4.97   0.54   0.47   0.01   0.00   0.00  62.90
Reportar el uso de CPU utilizando el comando sar
Antes de utilizar sar debemos de configurarlo, ver este articulo si tienen problemas con el mismo.
Para mostrar la actividad del CPU, tecleamos:
:~$ sar Linux 2.6.32-27-generic (betuntu)    21/01/11    _i686_   (1 CPU) 00:00:01       CPU    %user    %nice  %system  %iowait   %steal    %idle 00:05:00       all     1.56     0.10     0.48     1.23     0.00    96.63 00:15:01       all     1.57     0.09     0.46     1.03     0.00    96.84 00:25:01       all     1.56     0.10     0.49     1.11     0.00    96.74 00:35:01       all     1.57     0.09     0.47     1.14     0.00    96.73 00:45:00       all     1.55     0.10     0.48     1.05     0.00    96.82 00:55:01       all     1.57     0.10     0.44     1.13     0.00    96.77 ...
...
11:05:01       all    33.89     3.72    36.05     0.68     0.00    25.66 11:15:01       all    31.45     5.32    50.00     2.12     0.00    11.11 11:25:00       all    38.32     3.98    36.19     0.96     0.00    20.55 11:35:01       all    39.27     3.73    27.49     3.30     0.00    26.22 Media:         all     7.90     0.68     4.56     1.40     0.00    85.45
Lo que hemos visto anteriormente es el contenido de la actividad acumulada de los contadores en el sistema operativo. Por ejemplo para ver el uso de CPU cada 2 segundos en 5 repeticiones, tecleamos;
:~$ sar -u 2 5 Linux 2.6.32-27-generic (betuntu)    21/01/11    _i686_   (1 CPU) 11:48:37       CPU    %user    %nice  %system  %iowait   %steal    %idle 11:48:39       all    32.16     0.00     3.02     0.00     0.00    64.82 11:48:41       all    28.86     0.00     4.48     3.48     0.00    63.18 11:48:43       all    41.71     0.50     5.53     0.50     0.00    51.76 11:48:45       all    44.00     0.00     7.00     0.00     0.00    49.00 11:48:47       all    35.00     0.00    10.50     2.50     0.00    52.00 Media:         all    36.34     0.10     6.11     1.30     0.00    56.16
Donde,
- %user: Porcentaje de utilizacion del CPU mientras se ejecutaba a nivel de usuario (aplicacion)
- %nice: Porcentaje de utilizacion del CPU mientras se ejecutaba a nivel de usuario con prioridad nice
- %system: Porcentaje de utilizacion del CPU mientras se ejecutaba a nivel de sistema (kernel)
- %iowait: Porcentaje de tiempo durante el cual el CPU o CPUs estuvieron desocupados o libres mientras el sistema tuvo peticiones sobresalientes de I/O
- %idle: Porcentaje de tiempo durante el cual el CPU o CPUs estuvieron desocupados mientras el sistema no presento peticiones sobresalientes de I/O
Como determinar que proceso esta consumiendo los CPUs
Para administrar un equipo efectivamente debemos de poder conocer rapidamente los procesos o aplicaciones que se comen los recursos de procesador. Con este fin les presento el siguiente comando para saber cual proceso o procesos monopolizan los ciclos de CPU;
:~$ ps -eo pcpu,pid,user,args | sort -k 1 -r | head -10
O
:~$ ps -eo pcpu,pid,user,args | sort -r -k1 | less
%CPU  PID USER    COMMAND 7.1 27289 1000    ktorrent --icon ktorrent -caption KTorrent 38.8 24863 1000    /usr/lib/firefox-3.6.13/firefox-bin 3.5 1032 root    /usr/bin/X :0 -nr -verbose -auth /var/run/gdm/auth-for-gdm-g0WPgI/database -nolisten tcp vt7 3.4 27729 1000    amarokapp 1.2 24913 1000    /usr/lib/firefox-3.6.13/plugin-container /usr/lib/flashplugin-installer/libflashplayer.so 24863 plugin true 0.8 2177 1000    /usr/bin/pulseaudio --start --log-target=syslog 0.3 25968 1000    wish8.5 /usr/bin/amsn 0.2 2229 1000    python /usr/lib/gnomenu/GnoMenu.py --oaf-activate-iid=OAFIID:GNOME_GnoMenu_Factory --oaf-ior-fd=18 0.1   41 root    [kondemand/0]
Como podemos ver, el sistema es una maquina de escritorio, ya que el firefox es el que se esta comiendo todo los recursos. El comando ps despliega todos los procesos (-e), ademas del formato definido por el usuario (-o pcpu). El primer campo es pcpu, la utilizacion del CPU. Esta ordenado para desplegar los 10 procesos que mas utilizan el procesador.
El comando iostat en Linux
Tambien podemos utilizar el comando iostat, el cual nos reporta las estadisticas del CPU para dispositivos y particiones.
:~$ iostat -xtc 5 3 Linux 2.6.32-27-generic (betuntu)    21/01/11    _i686_   (1 CPU) 21/01/11 17:55:22 avg-cpu: %user  %nice %system %iowait %steal  %idle 32.49   0.52   6.89   2.31   0.00  57.79 Device:        rrqm/s  wrqm/s    r/s    w/s  rsec/s  wsec/s avgrq-sz avgqu-sz  await svctm %util sda              1.63   35.16   7.32   3.62  503.54  309.61   74.34    0.64  58.35  5.02  5.49 sdb              0.06    0.02   0.01   0.07    0.07   15.83  197.83    0.48 5984.86 43.70  0.35 21/01/11 17:55:27 avg-cpu: %user  %nice %system %iowait %steal  %idle 55.60   0.00   4.60   1.80   0.00  38.00 Device:        rrqm/s  wrqm/s    r/s    w/s  rsec/s  wsec/s avgrq-sz avgqu-sz  await svctm %util sda              0.00   20.60   0.40   1.60  102.40  177.60  140.00    0.02  12.40 12.00  2.40 sdb              0.00    0.00   0.00   0.00    0.00    0.00    0.00    0.00   0.00  0.00  0.00 21/01/11 17:55:32 avg-cpu: %user  %nice %system %iowait %steal  %idle 45.09   0.00   6.21   0.60   0.00  48.10 Device:        rrqm/s  wrqm/s    r/s    w/s  rsec/s  wsec/s avgrq-sz avgqu-sz  await svctm %util sda              0.00    3.01   1.60   0.60  251.70   28.86  127.27    0.02  10.55  6.55  1.44 sdb              0.00    0.00   0.00   0.00    0.00    0.00    0.00    0.00   0.00  0.00  0.00
Gracias a las herramientas que he descrito a continuacion, podremos facilmente detectar las fallas de rendimiento en nuestro sistema, o los cuellos de botella en procesamiento.
Muy bueno, sólo le agregarÃa -g al sort para que ordene en formato número