Buscar en este blog

27.2.17

Cuellos de botella en Linux

Los cuellos de botella se pueden producir en múltiples lugares del sistema. Detectarlos es importante para saber como está rindiendo una máquina.

CPU
Detección de cuello de botella en la CPU debido a su carga

Usando top, uptime, o cualquier comando que devuelva al carga media:

load average: 1,23, 1,42, 1,54

Estos valores indican el número medio de procesos que hay en cola para entrar al procesador.
Si estos valores superan o se acercan el número de cores del procesador, es probable que los procesos estén esperando por acceder a la CPU mucho más que el tiempo que tardan en hacer el cambio de contexto.
En este ejemplo, es una máquina con 2 cores. La CPU aún no es cuello de botella para su rendimiento. Un 10% por debajo del número de cores es señal de alarma.

Nota: Existe un caso en el que los valores de 'load average' crecen muy por encima del número de cores y sin embargo no se percibe una pérdida de rendimiento en el sistema. Habitualmente estos valores altos son debidos a procesos que realizan operaciones de E/S que se quedan en espera o bloqueados. El consumo real de CPU es  mínimo pero se contabilizan como procesos en cola. En estos casos, el % de uso de la CPU está por debajo del 100%.

DISCO
Detección de cuellos de botella en el almacenamiento (disco)
Los cuellos de botella en el sistema de E/S están normalmente relacionados con la carga de CPU debida a las operaciones de E/S, la latencia del almacenamiento y sus IOPS máximas.

Idealmente es necesario saber de antemano cual es la latencia mínima e IOPS máximas que el almacenamiento puede ofrecer. Un disco SATA de 7200rpm suele dar en números redondos una latencia de 5 ms y unas 90 IOPS.
Cuando el almacenamiento está llegando a su límite de rendimiento (es decir, alcanzando su límite de IOPS), la latencia comienza a aumentar de forma considerable. Esta es la señal de alarma.

Si los procesos realizan muchas operaciones de Entrada/Salida, puede darse en caso de que saturen la CPU, el almacenamiento o ambos.

IOSTAT
Herramienta para saber en tiempo real el número de IOPS sobre un dispositivo de almacenamiento: iostat

iostat -d /dev/sda 1

'tps': Operaciones totales realizadas desde la última actualización (1 segundo). IOPS en 'tiempo real'
kB_read/s, kB_wrtn/s: KBs leidos/escritos por segundo.

Cuando el valor de 'tps' se acerca al límite del máximo que puede ofrecer el almacenamiento, este es un cuello de botella.

Se puede obtener más información interesante jugando con los parámetros de 'iostat':

 Las medidas *await hacen referencia a la 'latencia'. Son una medida de lo que tarda (ms) una operación de E/S al disco 'sda' contando (OJO!) tanto el tiempo de sistema para el procesado de la petición como el tiempo de espera para que el disco devuelva la respuesta.

svctm indica la espera (ms) debida específicamenteal dispositivo del almacenamiento. Según el tipo de sistema, un svctm por debajo de 10ms en entornos 'enterprise' ó de 50ms en entornos de 'escritorio' son aceptables. Por encima de eso la pérdida de rendimiento es evidente.
Estos valores se deben comparar con los valores teóricos que debe dar el dispositorio de almacenamiento recurriendo a las specs del fabricante.

El valor '%util' indica la carga del procesador que es debida a las operaciones de E/S. Si este valor es alto (especialmente si es del 100% o cercano), el sistema se está saturando en operaciones de E/S. Puede estar relacionado con la saturación del propio disco o sistema de almacenamiento, pero no en todos los casos.
iostat 

RAM
MEMORIA RAM
El tiempo de acceso a la memoria principal del sistema es constante en todos los casos salvo averías o algunos sistemas NUMA.
Por lo tanto, detectar fallas de rendimiento debido a la memoria RAM se centra en:
  1. Descubrir si el sistema está haciendo swapping y en que medida.
  2. Descubrir el tiempo de espera para acceder a la memora
free

El sistema tieme partición de swap activa y se está utilizando (~11MB) .
vmstat

La cantidad de swap utilizada es de 11812KB y en ratios de 1 segundo se aprecia que las operaciones de lectura/escritura (si/so) sobre ella son nulas.
Si la swap tiene un uso intensivo (si/so >>0) el rendimiento del sistema disminuye.

La cantidad de espacio libre en la memoria principal (free) "no es reprententativo" ya que la memoria RAM se utiliza como caché del almacenamiento para agilizarlo.
Si la memoria se llena totalmente nuevos procesos no podrán ejecutarse, pero el rendimiento dependiente de su uso no se ve afectado (con excepciones). El cuello de botella a tener en cuenta en lo que a la memoria respecta es el swapping.


MISCELANEA

Ordenar procesos por:

Uso de CPU:
ps aux --sort=-pcpu

Acceso a disco:
iotop
Tamaño en memoria por KBs y %:
ps aux --sort -rss
Columna RSS: KBs
Columna %CPU: %CPU

Uso de swap:
http://yoseman.blogspot.com.es/2014/06/quien-esta-consumiendo-swap.html

Acceso a swap
iotop (columna SWAPIN)
Uso de red
Usando el programa "nethogs"

Procesos con uso de CPU <> 0
ps -eo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,wchan:14,comm \ 
--sort=+pcpu | awk '$8!=0.0 {print}' | awk 'NR>1'
Prioridad de procesos
ps -lax  (Columna NI)

Mapas de memoria (off-topic)
Herramienta:
pmap