正文
一个监控数据的思考-sockets_used
背景
最近跟踪一个项目问题.
Grafana的监控了里面有一个tcp的使用监控
CurrEstab 的数据量是: 700-2000 左右
但是同时有一个非常大的: Sockets_used的数据
数据量一般是 CurrEstab的十倍以上.
大家看起来感觉有点模糊, 自己之前看过不少tcp的内核参数,当时没有注意过 Sockets_used的参数.
然后想着趁着 早上和晚上的时间学习和整理一下.
关于Socket通信
Socket是一种用于在计算机网络中进行通信的编程接口或通信协议。
它提供了一种通过网络发送和接收数据的方式,使得不同的计算机之间可以相互通信。
通过使用Socket,应用程序可以在网络上建立连接并进行数据的传输。
Socket通常用于实现客户端和服务器之间的通信,它提供了一种可靠的双向通信机制,使得应用程序可以实时地发送和接收数据。
以上是Wetab 的AIGC的内容.
其实这里的解释非常不准确.
socket 其实至少分为两类,一类是 网络层的socket通信,还有一种是unix的socket 通信.
网络层的一般需要送 tcp / udp 协议栈 但是unix socket 协议可以直接从内核层进行转发, 不需要TCP/IP协议栈的大量包,数据帧,以及校验和等操作.
所以很多时候 一台机器上面的网络通信都是走的AF_UNIX 而不是 AF_INET的通信协议栈.
比较只管的一个认识就是 mysql数据库的一个参数配置值.
socket=/var/lib/mysql/mysql.sock
AF_UNIX 的参数值是一个路径, 而不是IP:PORT的内容, 用于本地的通信, 效率高.
关于sockets_used的数值样例
ss -s 的结果为:
Total: 1501
TCP: 1397 (estab 805, closed 531, orphaned 0, timewait 530)
Transport Total IP IPv6
RAW 1 0 1
UDP 251 246 5
TCP 866 190 676
INET 1118 436 682
FRAG 0 0 0
cat /proc/net/sockstat 的结果为:
sockets: used 1501
TCP: inuse 190 orphan 0 tw 500 alloc 867 mem 84
UDP: inuse 246 mem 2
UDPLITE: inuse 0
RAW: inuse 0
FRAG: inuse 0 memory 0
一个理解
socket分为 unix和inet两类.
一般total 会比tcp要高一些. 因为有很多内核socket通信
如下是mysql数据库的一个样例:
Total: 982 (kernel 2525)
TCP: 306 (estab 197, closed 64, orphaned 0, synrecv 0, timewait 63/0), ports 0
Transport Total IP IPv6
* 2525 - -
RAW 1 0 1
UDP 11 8 3
TCP 242 65 177
INET 254 73 181
FRAG 0 0 0
可以发现 kernel 的数据最大, Total 比TCP要高三倍.
很多比较经典的软件, 经常使用unix socket 进行同机器内的 IPC通信.
如果走TCP/IP协议栈, 性能就会差很多,并且CPU的使用要多耗费很多,并且会收到网卡的一些制约(大部分不需要走物理网卡, 只需要走loopback回环网络)
另外 kernel里面的统计比较粗暴, 只要是有的都会被统计, 不管是不是已经closed.或者是释放了.
所以 kernel的数值是最高的. 高于total .
总结
Grafana的这个 网络socket连接信息的监控页面其实不是很专业.
不应该展示 sockets_used的这个数据, 会带来很大的误解.
网络层的建议仅展示走非loopback网卡的真实物理网卡数据, 这样才可以明确的展示机器的实际网络栈信息.
TCP核心里面 最关注的几个 其实就是 Estab 连接/半链接以及 time_wait的TCP连接数量信息.
部分优化也是基于建立/关闭/释放的一些设置来的.
学习永无止境.
附图-网络socket和uinx socket的通信差异
AF_INET
AF_UNIX