前言
本文介绍了用ss
工具来统计一下当前网络栈的内存使用情况
环境准备
组件 | 版本 |
---|---|
操作系统 | Ubuntu 22.04.4 LTS |
查看socket内存相关参数,-m
参数
▶ ss -tm State Recv-Q Send-Q Local Address:Port Peer Address:Port ESTAB 0 36 10.8.19.109:ssh 182.148.53.161:25924 skmem:(r0,rb369280,t0,tb133632,f1792,w2304,o0,bl0,d1)
其中关于skmem
skmem:(r<rmem_alloc>,rb<rcv_buf>,t<wmem_alloc>,tb<snd_buf>, f<fwd_alloc>,w<wmem_queued>,o<opt_mem>, bl<back_log>,d<sock_drop>)
rmem_alloc
已经分配用于接收包的内存,如果应用层能及时消费 TCP 内核层接收到的数据,这个数字基本为 0rcv_buf
接收包可以使用的总内存,与net.ipv4.tcp_rmem
第二个参数相关wmem_alloc
已经分配用于发送包的内存(已经到达ip层),包已经到达ip层,需要等待网卡将ip层的包取走snd_buf
发送包可以使用的总内存 与net.ipv4.tcp_wmem
第二个参数相关fwd_alloc
已经分配给socket使用内存,不用于接收/发送使用wmem_queued
已经分配用于发送包的内存(没有到达ip层)opt_mem
用于保存socket option所使用的内存back_log
back_log
所使用的内存,进程从队列里面拿到新的数据包sock_drop
在将数据包解复用到套接字之前丢弃的数据包数量
计算每一条socket消耗的内存,-tm
socket_memory = r(rmem_alloc) + t(wmem_alloc) + f(fwd_alloc) + w(wmem_queued) + o(opt_mem) + bl(back_log)
▶ ss -tm State Recv-Q Send-Q Local Address:Port Peer Address:Port ESTAB 0 36 10.8.19.109:ssh 182.148.53.161:25924 skmem:(r0,rb369280,t0,tb133632,f1792,w2304,o0,bl0,d1)
可以计算出这条socket消耗的内存: mem = 1792+2304 = 4096
4k内存
计算网络栈所使用的内存
cat /proc/net/sockstat sockets: used 502 TCP: inuse 65 orphan 0 tw 128 alloc 311 mem 21 UDP: inuse 5 mem 4 UDPLITE: inuse 0 RAW: inuse 0 FRAG: inuse 0 memory 0
mem 21
,单位是page,查看一下page的大小
getconf PAGESIZE 4096
由此可得,当前tcp网络栈大约使用 mem = 21*4096 = 86016
84k内存
查看协议栈的其他参数信息,-i
▶ ss -ti State Recv-Q Send-Q Local Address:Port Peer Address:Port ESTAB 0 0 192.168.3.168:46099 192.168.3.168:58625 cubic wscale:2,7 rto:201 rtt:0.043/0.005 ato:40 mss:65483 rcvmss:1924 advmss:65483 cwnd:10 bytes_acked:12424915507 bytes_received:3150 segs_out:10395577 segs_in:10395575 send 121828.8Mbps lastsnd:2188 lastrcv:2244390049 lastack:2188 rcv_rtt:1 rcv_space:43690
rto
重传超时时间,即从数据发送时刻算起,超过这个时间便执行重传,单位msrtt
一个连接的往返时间,即数据发送时刻到接收到确认的时刻的差值,单位msato
ack的超时时间,单位msmss
有效数据的最大分段,去掉3层和4层的header,就是MSSMTU - (TCP 标头 + IP 标头) = MSS
rcvmss
文档上没有这个参数的介绍,源码注释上标注:MSS used for delayed ACK decisions
。对端告诉本端,对端的mss大小advmss
文档上没有这个参数的介绍,源码注释上标注:Advertised MSS
。告诉对端,本端的mss的大小cwnd
拥塞窗口的大小:cwnd*mss
bytes_acked
已经被ack的字节数bytes_received
收到但没被ack的字节数segs_out
已发送的segment数,segment最大就是一个mss,但是也有可能小于mss(没有塞满一个mss就发送过来了)segs_in
已收到的segment数send
发送速率lastsnd
最后发送一个包距离现在的时间,单位mslastrcv
最后接收一个包距离现在的时间,单位mslastack
最后一次收到ack距离现在的时间,单位msrcv_rtt
文档上没有这个参数介绍rcv_space
用于tcp自动调优,用来调整sender的buffer
联系我
- 联系我,做深入的交流
至此,本文结束
在下才疏学浅,有撒汤漏水的,请各位不吝赐教...