Revisión del total de sockets abiertos (totsck) reportado por sar

By | November 15, 2017

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.