Normalmente utilizo sar para revisar diversas métricas del sistema. Su uso es sencillo y permite acceder rápidamente a históricos de rendimiento para analizar múltiples recursos como pueden ser CPU, RAM, etc… Recientemente estuve revisando el uso de sockets para el proyecto sarviewer y creo que los valores reportados por sar
pueden llevar a cierta confusión.
Pongamos un ejemplo:
Si nos vamos a la sección correspondiente de la página man
de sar
, vemos qué significa cada columna:
La columna totsck reporta el total de sockets de nuestro sistema. Sin embargo no podemos obtener su valor con la suma del resto de columnas. Para confirmar dicho valor podemos verificarlo en el fichero /proc/net/sockstat
, basta con hacerle un cat
:
[root@jota-pc ~]# sar -n SOCK 1 1 Linux 4.9.0-4-amd64 (jota-pc) 11/15/2017 _x86_64_ (8 CPU) 09:32:18 PM totsck tcpsck udpsck rawsck ip-frag tcp-tw 09:32:19 PM 877 25 3 0 0 14 Average: 877 25 3 0 0 14 [root@jota-pc ~]# cat /proc/net/sockstat sockets: used 877 TCP: inuse 25 orphan 0 tw 14 alloc 26 mem 0 UDP: inuse 3 mem 2 UDPLITE: inuse 0 RAW: inuse 0 FRAG: inuse 0 memory 0
Vemos que coinciden tanto el total de sockets como los sockets en uso/time-wait TCP. El total de sockets incluye no sólo TCP, UDP o RAW, sino también sockets UNIX que no tienen por qué estar asociados a capa de transporte. Para hacernos una idea de estos números podemos lanzar con ss
exluyendo todos los sockets TCP/UDP:
[root@jota-pc ~]# ss -Ha | grep -v -E 'tcp|udp' | wc -l 818
Para los sockets TCP también podemos verificar con ss
qué representa cada columna si tenemos dudas:
- Consideramos que tcpsck son todos los sockets activos TCP excluyendo los que están en estado TIME-WAIT:
jota@jota-pc ~]$ sar -n SOCK 1 1 Linux 4.9.0-4-amd64 (jota-pc) 11/15/2017 _x86_64_ (8 CPU) 08:25:48 PM totsck tcpsck udpsck rawsck ip-frag tcp-tw 08:25:49 PM 867 15 3 0 0 6 Average: 867 15 3 0 0 6 [jota@jota-pc ~]$ ss -Hta | grep -v TIME-WAIT | wc -l 15
- Por otro lado para verificar el valor de tcp-tw basta con:
[jota@jota-pc ~]$ ss -Hta | grep TIME-WAIT TIME-WAIT 0 0 127.0.0.1:http 127.0.0.1:57842 TIME-WAIT 0 0 127.0.0.1:http 127.0.0.1:57836 TIME-WAIT 0 0 127.0.0.1:http 127.0.0.1:57834 TIME-WAIT 0 0 127.0.0.1:http 127.0.0.1:57844 TIME-WAIT 0 0 127.0.0.1:http 127.0.0.1:57840 TIME-WAIT 0 0 127.0.0.1:http 127.0.0.1:57838 [jota@jota-pc ~]$ sar -n SOCK 1 1 Linux 4.9.0-4-amd64 (jota-pc) 11/15/2017 _x86_64_ (8 CPU) 08:25:48 PM totsck tcpsck udpsck rawsck ip-frag tcp-tw 08:25:49 PM 867 15 3 0 0 6 Average: 867 15 3 0 0 6
Todas estas pruebas deben repetirse varias veces para verificar que cuadran los resultados de diversos muestreos. En ocasiones los números obtenidos con una herramienta varían de los de otra aún en cortos períodos de tiempo, ya que la apertura, uso y cierre de sockets puede ocurrir con gran rapidez en nuestro sistema.
Por su parte, ss
es el heredero de netstat
, que actualmente se encuentra obsoleto en las distros que están al día. Si tenéis que hacer debug de sockets, ss
es la herramienta de referencia en estos momentos.