Tabla de Contenidos
200.1 Measure and Troubleshoot Resource Usage
Pertenece a LPI Topic 200: Capacity Planning
- Weight: 6
- Description: Candidates should be able to measure hardware resource and network bandwidth, identify and troubleshoot resource problems.
- Key Knowledge Areas:
- Measure CPU usage
- Measure memory usage
- Measure disk I/O
- Measure network I/O
- Measure firewalling and routing throughput
- Map client bandwidth usage
- Match / correlate system symptoms with likely problems
- Estimate throughput and identify bottlenecks in a system including networking
- The following is a partial list of the used files, terms and utilities:
iostatnetstatwtopsar- processes blocked on I/O
- blocks out
vmstatpstree,pslsofuptimeswap- blocks in
Monitorizar recursos:
- CPU
- Memoria (RAM/SWAP)
- Carga del sistema (Load Average)
- Consumo de recursos de red (Network)
iostat
Monitor de I/O y CPU
Necesario instalar el paquete sysstat
iostat [options] [interval] [count] [device]
c: estadísticas CPUd: estadísticas de los dispositivos
Datos de un dispositivo:
iostat /dev/sda
Ejemplo de salida:
Linux 4.19.0-14-amd64 (debian10) 03/27/2021 _x86_64_ (2 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.05 0.00 0.14 0.02 0.00 99.78
Device tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 2.91 57.48 1.63 95315 2701
Si queremos que la información de CPU (también funciona para dispositivos) se actualice cada 2 segundos, y se muestre 3 veces:
iostat -c 2 3
Ejemplo de salida:
Linux 4.19.0-14-amd64 (debian10) 03/27/2021 _x86_64_ (2 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.05 0.00 0.13 0.02 0.00 99.79
avg-cpu: %user %nice %system %iowait %steal %idle
0.00 0.00 0.00 0.00 0.00 100.00
avg-cpu: %user %nice %system %iowait %steal %idle
0.00 0.00 0.00 0.00 0.00 100.00
Salida en dispositivos
- tps: transferencias por segundo
- kB_read/s: lecturas por segundo en KB
- kB_wrtn/s: escrituras por segundo en KB
- kB_read: total de lecturas en KB
- kB_wrtn: total de escrituras en KB
Salida en CPU
- %user: uso CPU durante ejecución a nivel de usuario
- %nice: uso CPU durante ejecución con nice (prioridad)
- %system: uso CPU durante ejecución a nivel de sistema (kernel)
- %iowait: tiempo ocioso de CPU a la espera de operaciones I/O
- %steal: tiempo dedicado a la espera de la CPU virtual mientras el hipervisor atendría otros procesadores virtuales (si estamos virtualizando sobre la máquina)
- %idle: tiempo ocioso de CPU sin esperar operaciones
vmstat
Estadísticas de memoria virtual sobre procesos, memoria, paginación, bloques I/O y utilización de CPU
vmstat [options] [delay] [count]
vmstat 2 3
Ejemplo de salida:
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 0 0 0 859744 12056 88900 0 0 26 1 12 33 0 0 100 0 0 0 0 0 859736 12056 88936 0 0 0 0 20 26 0 0 100 0 0 0 0 0 859736 12056 88936 0 0 0 0 14 18 0 0 100 0 0
Actualiza la información cada 2 segundos, 3 veces y finaliza.
La opción -S permite elegir la unidad de visualización (k miles de bytes, K KB, m millón de bytes, M MB). Ejemplo: vmstat -S M
Salida
Columna de procs:
r: indica el número de procesos actualmente en la cola de ejecuciónb: indica el número de procesos actualmente en la cola de bloques. Estos procesos están a la espera de un dispositivo.
Columna de memory:
swpd: indica la cantidad de memoria virtual uytilizada en KBfree: indica la cantidad de memoria libre,que no está en usobuff: indica la cantidad de memoria asignada a buffers, esta contiene bloques de disco sin procesar.cache: indica la cantidad de memoria cache (contiene archivos)
Columna de swap:
si: indica la cantidad de memoria que se intercambia desde el disco (a la swap)so: indica la cantidad de memoria que se intercambia hacia el disco (desde la swap)
Columna io:
bi: indica la cantidad de bloques por segundo que se recibe desde un dispositivo de bloquesbo: indica la cantidad de bloques por segundo que se envía a un dispositivo de bloques
Columna system:
in: indica el número de interrupciones por segundo. Las interrupciones son las peticiones que hacen los dispositivos para acceder a la CPU.cs: muestra el número de cambios de contexto por segundo. La CPU tiene varios hilos de ejecución y cada uno se corresponde con un proceso. La CPU puede desatender ese hilo para pasar a otro y volver luego. Cada uno de esos “saltos” es lo que se conoce como cambio de contexto.
Columna cpu:
us: muestra el porcentaje de tiempo dedicado a la ejecución de código que no es del kernel (modo usuario)sy: muestra el porcentaje de tiempo dedicado a la ejecución de código del kernel (modo núcleo)id: muestra el porcentaje de tiempo de inactividadwa: muestra el porcentaje de tiempo de espera para I/Ost: muestra el porcentaje de tiempo robado por una máquina virtual
La opción -s muestra una tabla resumen del uso de la memoria desde el arranque del sistema.
root@debian10:~# vmstat -s -S M
987 M total memory
83 M used memory
204 M active memory
331 M inactive memory
344 M free memory
45 M buffer memory
513 M swap cache
979 M total swap
0 M used swap
979 M free swap
7455 non-nice user cpu ticks
2 nice user cpu ticks
6138 system cpu ticks
8615838 idle cpu ticks
1304 IO-wait cpu ticks
0 IRQ cpu ticks
1307 softirq cpu ticks
0 stolen cpu ticks
375434 pages paged in
1008360 pages paged out
0 pages swapped in
0 pages swapped out
1314791 interrupts
1614147 CPU context switches
1619662769 boot time
6233 forks
netstat
Listado de las conexiones activas de nuestra máquina. Además, permite obtener información de la red y los protocolos utilizados.
netstat [opciones]
i: estadísticas de las interfaces de red (como unifconfigoip link)r: muestra las tablas de rutas (como el comandoroute)n: muestra las conexiones activas impidendo la resolución inversa de las direcciones IP y puertos, así la visualización es más rápidap: procesos responsables de las conexiones de reda: muestra sockets que están en escucha y los que no.t: solo conexiones TCP.
Lo habitual es usarlo para listar las conexiones que tiene el sistema, ips de origen y destino, etc:
netstat -putan
Ejemplo de salida:
Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1/init tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 434/sshd tcp 0 0 192.168.2.10:22 192.168.2.1:33500 ESTABLISHED 561/sshd: vagrant [ tcp6 0 0 :::111 :::* LISTEN 1/init tcp6 0 0 :::22 :::* LISTEN 434/sshd udp 0 0 0.0.0.0:68 0.0.0.0:* 533/dhclient udp 0 0 0.0.0.0:111 0.0.0.0:* 1/init udp6 0 0 :::111 :::* 1/init
ps
Muestra la lista de procesos en ejecución.
Tiene muchísimas opciones, pero algunos casos típicos:
ps -ef
El comando acepta diferentes sintaxis:
- La sintaxis Unix, en que la opciones deben llevar el guión delante.
- La sintaxis BSD, en que las opciones no llevan el guión.
- La sintaxis GNU, en que las opciones deben llevar un doble guión delante
La más usada:
ps aux
Ejemplo de salida:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.9 21992 9976 ? Ss 14:50 0:00 /sbin/init root 2 0.0 0.0 0 0 ? S 14:50 0:00 [kthreadd] root 3 0.0 0.0 0 0 ? I< 14:50 0:00 [rcu_gp] root 4 0.0 0.0 0 0 ? I< 14:50 0:00 [rcu_par_gp] root 6 0.0 0.0 0 0 ? I< 14:50 0:00 [kworker/0:0H-kblockd] root 8 0.0 0.0 0 0 ? I< 14:50 0:00 [mm_percpu_wq] root 9 0.0 0.0 0 0 ? S 14:50 0:00 [ksoftirqd/0] root 10 0.0 0.0 0 0 ? I 14:50 0:00 [rcu_sched] root 11 0.0 0.0 0 0 ? I 14:50 0:00 [rcu_bh] root 12 0.0 0.0 0 0 ? S 14:50 0:00 [migration/0] root 14 0.0 0.0 0 0 ? S 14:50 0:00 [cpuhp/0] root 15 0.0 0.0 0 0 ? S 14:50 0:00 [cpuhp/1] root 16 0.0 0.0 0 0 ? S 14:50 0:00 [migration/1] root 17 0.0 0.0 0 0 ? S 14:50 0:00 [ksoftirqd/1] (...)
Salida
- USER: usuario propietario del proceso
- PID: identificador del proceso
- %CPU: Porcentaje de ocupación acumulada del procesador
- %MEM: Porcentaje de ocupación de memoria acumulado del procesador
- VSZ: Tamaño de memoria virtual del proceso
- RSS: Tamaño de memoria residente del proceso
- PPID: Identificador del proceso padre del proceso
- C: Clase de prioridad
- STIME: Fecha de creación (Start time) del proceso
- TTY: terminal a la que está asociada
- STAT: Estado del proceso (S sleep, R running)
- START: Fecha de creación del proceso
- TIME: Tiempo de procesador acumulado del proceso
- CMD: Comando ejecutado
pstree
Muestra la misma lista de procesos que ps y top, pero la salida se obtien en formato árbol viendo así la dependencia que tienen los procesos.
En Debian 10, pertenece al paquete psmisc
Ejemplo de salida:
systemd─┬─NetworkManager───2*[{NetworkManager}]
├─VBoxSVC─┬─2*[VBoxHeadless───30*[{VBoxHeadless}]]
│ ├─VBoxHeadless───29*[{VBoxHeadless}]
│ ├─VBoxNetDHCP───2*[{VBoxNetDHCP}]
│ └─13*[{VBoxSVC}]
├─VBoxXPCOMIPCD
├─colord───2*[{colord}]
├─cupsd
├─dbus-daemon
├─firefox─┬─Privileged Cont───24*[{Privileged Cont}]
│ ├─RDD Process───2*[{RDD Process}]
│ ├─Web Content───25*[{Web Content}]
│ ├─2*[Web Content───24*[{Web Content}]]
│ ├─WebExtensions───21*[{WebExtensions}]
│ └─71*[{firefox}]
(...)
w
Muestra la información de los usuarios actualmente conectados y las mismas estadísticas que el comando uptime.
load average debe ser menor que 1. si lo supera, la carga es elevada.
Ejemplo de salida:
16:24:36 up 36 min, 1 user, load average: 1,43, 1,19, 0,76 USER TTY LOGIN@ IDLE JCPU PCPU WHAT tempwin tty1 15:48 36:27 5:04 0.00s xinit /home/tempwin/.xinitrc -- /etc/X11/xinit
lsof
Muestra información acerca de los ficheros abiertos y sus correspondientes procesos.
lsof +d /var/log
+d: es para indicar directorio en lugar de fichero.
Ejemplo de salida:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME rsyslogd 363 root 7w REG 254,0 207327 2359398 /var/log/syslog rsyslogd 363 root 8w REG 254,0 125147 2359400 /var/log/kern.log rsyslogd 363 root 9w REG 254,0 17018 2359401 /var/log/debug rsyslogd 363 root 10w REG 254,0 109465 2359402 /var/log/messages rsyslogd 363 root 11w REG 254,0 31109 2359403 /var/log/auth.log rsyslogd 363 root 12w REG 254,0 76530 2359399 /var/log/daemon.log rsyslogd 363 root 13w REG 254,0 533 2359320 /var/log/user.log
Este comando es interesante para saber qué procesos están asociados a determinados ficheros.
Si queremos ver los archivos abiertos por el usuario menganito:
lsof -u menganito
Para ver los archivos abiertos en la partición /dev/sdb1:
lsof /dev/sdb1
Proceso que ha abierto el fichero /var/log/syslog:
lsof /var/log/syslog
Todos los sockets de Internet abiertos:
lsof -i
procfs
El pseudosistema de archivos procfs permite obtener información sobre el uso de archivos por parte de un proceso. Basta leer algunos archivos especiales en el directorio virtual del proceso.
Por ejemplo, buscamos primero el PID de cierto proceso:
[root@linux~]# ps -ef root 6340 5419 0 09:54 pts/0 00:00:00 ./reader
Con el PID 6340 vamos a /proc/6340 y listamos el contenido del directorio fd:
[root@linux ~]# cd /proc/6340 [root@linux 6340]# ls fd 0 1 2 3
El proceso ha abierto cuatro archivos y los tres primeros probablemente son las entradas/salidas estándar.
[root@beta64 6340]# ls -l fd/3 lr-x------. 1 root 64 16 jul. 09:55 fd/3 -> /etc/passwd
El proceso ha abierto el archivo /etc/passwd en modo de solo lectura (lr-).
free
Muestra una visión en tiempo real de la cantidad de memoria física y virtual de un sistema
free [options]
l: muestra estadísticas detalladas del consumo de memoriak: muestra las estadísticas en kBm: muestra las estadísticas en MBg: muestra las estadísticas en GBh: formato legible por humanos
free -h
Ejemplo de salida:
total used free shared buff/cache available Mem: 987Mi 51Mi 718Mi 2.0Mi 216Mi 797Mi Swap: 979Mi 0B 979Mi
top
Muestra una visión en tiempo real del sistema en ejecución
También podemos conocer el proceso que más memoria consume (o CPU) o incluso modificar la prioridad o matarlo.
Ejemplo de salida:
top - 15:27:35 up 37 min, 1 user, load average: 0.00, 0.00, 0.00
Tasks: 79 total, 1 running, 78 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.2 sy, 0.0 ni, 99.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 987.2 total, 718.2 free, 51.7 used, 217.3 buff/cache
MiB Swap: 980.0 total, 980.0 free, 0.0 used. 797.4 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1334 vagrant 20 0 10976 3536 3076 R 0.3 0.3 0:00.01 top
1 root 20 0 21992 9976 7728 S 0.0 1.0 0:00.96 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd
3 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_gp
4 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_par_gp
6 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker/0:0H-kblockd
8 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 mm_percpu_wq
9 root 20 0 0 0 0 S 0.0 0.0 0:00.04 ksoftirqd/0
10 root 20 0 0 0 0 I 0.0 0.0 0:00.07 rcu_sched
(...)
uptime
Muestra el tiempo que el sistema lleva en funcionamiento, el número de usuarios conectados y el valor promedio de la carga del sistema en los últimos 1, 5 y 15 minutos.
Ejemplo de salida:
15:28:06 up 37 min, 1 user, load average: 0.00, 0.00, 0.00
Los valores de load average hay que ponderarlos en función del número de procesadores; un valor de 4 es normal para un procesador de cuatro núcleos, pero no para un procesador de un núcleo.
sar
Recoge informes o guarda información de la actualidad del sistema para poder hacer consultas posteriormente.
sar forma parte del paquete sysstat
sar [options] [interval] [count]
Algunas opciones:
-r: controla el uso de la memoria RAM-b: permite controlar la utilización de los discos
sar -b 1 2
Si no se especifica ninguna opción, sar visualizará información sobre procesador/es.
sar necesita que esté funcionando el servicio sysstat y que la recopilación de datos esté activada desde el fichero /etc/default/sysstat:
ENABLED="true"
Ejemplo de salida:
Linux 4.19.0-14-amd64 (debian10) 03/27/2021 _x86_64_ (2 CPU) 01:20:46 PM LINUX RESTART (2 CPU) 01:34:14 PM LINUX RESTART (2 CPU) 02:55:01 PM CPU %user %nice %system %iowait %steal %idle 03:05:01 PM all 0.01 0.00 0.05 0.01 0.00 99.93 03:15:01 PM all 0.04 0.00 0.08 0.01 0.00 99.86 03:25:01 PM all 0.13 0.00 0.05 0.08 0.00 99.74 Average: all 0.06 0.00 0.06 0.03 0.00 99.85
strace
Visualiza las llamadas a sistema que realizan los procesos.
strace pertenece al paquete de Debian strace
# strace echo "Hola"
execve("/usr/bin/echo", ["echo", "Hola"], 0x7ffc38bfc248 /* 17 vars */) = 0
brk(NULL) = 0x55af8c00d000
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=26030, ...}) = 0
mmap(NULL, 26030, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f77d1f99000
close(3) = 0
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\260A\2\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=1824496, ...}) = 0
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f77d1f97000
mmap(NULL, 1837056, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f77d1dd6000
mprotect(0x7f77d1df8000, 1658880, PROT_NONE) = 0
mmap(0x7f77d1df8000, 1343488, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x22000) = 0x7f77d1df8000
mmap(0x7f77d1f40000, 311296, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x16a000) = 0x7f77d1f40000
mmap(0x7f77d1f8d000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1b6000) = 0x7f77d1f8d000
mmap(0x7f77d1f93000, 14336, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f77d1f93000
close(3) = 0
arch_prctl(ARCH_SET_FS, 0x7f77d1f98540) = 0
mprotect(0x7f77d1f8d000, 16384, PROT_READ) = 0
mprotect(0x55af8aed7000, 4096, PROT_READ) = 0
mprotect(0x7f77d1fc7000, 4096, PROT_READ) = 0
munmap(0x7f77d1f99000, 26030) = 0
brk(NULL) = 0x55af8c00d000
brk(0x55af8c02e000) = 0x55af8c02e000
openat(AT_FDCWD, "/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=3031632, ...}) = 0
mmap(NULL, 3031632, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f77d1af1000
close(3) = 0
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(0x88, 0), ...}) = 0
write(1, "Hola\n", 5Hola
) = 5
close(1) = 0
close(2) = 0
exit_group(0) = ?
+++ exited with 0 +++
