明察秋毫--用ss工具统计网络栈内存使用

打印 上一主题 下一主题

主题 1004|帖子 1004|积分 3012

媒介

本文介绍了用ss工具来统计一下当前网络栈的内存使用情况
环境准备

组件版本操纵系统Ubuntu 22.04.4 LTS查看socket内存相干参数,-m 参数
  1. ▶ ss -tm
  2. State       Recv-Q Send-Q                                                                   Local Address:Port                                                                                    Peer Address:Port
  3. ESTAB       0      36                                                                         10.8.19.109:ssh                                                                                   182.148.53.161:25924
  4.          skmem:(r0,rb369280,t0,tb133632,f1792,w2304,o0,bl0,d1)
复制代码
其中关于skmem
  1. skmem:(r<rmem_alloc>,rb<rcv_buf>,t<wmem_alloc>,tb<snd_buf>,
  2.               f<fwd_alloc>,w<wmem_queued>,o<opt_mem>,
  3.               bl<back_log>,d<sock_drop>)
复制代码

  • rmem_alloc 已经分配用于接收包的内存,假如应用层能及时消费 TCP 内核层接收到的数据,这个数字基本为 0
  • rcv_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
  1. socket_memory = r(rmem_alloc) + t(wmem_alloc) + f(fwd_alloc) + w(wmem_queued) + o(opt_mem) + bl(back_log)
复制代码
  1. ▶ ss -tm
  2. State       Recv-Q Send-Q                                                                   Local Address:Port                                                                                    Peer Address:Port
  3. ESTAB       0      36                                                                         10.8.19.109:ssh                                                                                   182.148.53.161:25924
  4.          skmem:(r0,rb369280,t0,tb133632,f1792,w2304,o0,bl0,d1)
复制代码
可以计算出这条socket斲丧的内存: mem = 1792+2304 = 4096 4k内存
计算网络栈所使用的内存
  1. cat /proc/net/sockstat
  2. sockets: used 502
  3. TCP: inuse 65 orphan 0 tw 128 alloc 311 mem 21
  4. UDP: inuse 5 mem 4
  5. UDPLITE: inuse 0
  6. RAW: inuse 0
  7. FRAG: inuse 0 memory 0
复制代码
mem 21,单位是page,查看一下page的大小
  1. getconf PAGESIZE
  2. 4096
复制代码
由此可得,当前tcp网络栈大约使用 mem = 21*4096 = 86016 84k内存
查看协议栈的其他参数信息,-i
  1. ▶ ss -ti
  2. State       Recv-Q Send-Q                                                                   Local Address:Port                                                                                    Peer Address:Port
  3. ESTAB       0      0                                                                        192.168.3.168:46099                                                                                  192.168.3.168:58625
  4.          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 重传超时时间,即从数据发送时刻算起,超过这个时间便执行重传,单位ms
  • rtt 一个连接的往返时间,即数据发送时刻到接收到确认的时刻的差值,单位ms
  • ato ack的超时时间,单位ms
  • mss 有效数据的最大分段,去掉3层和4层的header,就是MSS MTU - (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 最后发送一个包距离现在的时间,单位ms
  • lastrcv 最后接收一个包距离现在的时间,单位ms
  • lastack 最后一次收到ack距离现在的时间,单位ms
  • rcv_rtt 文档上没有这个参数介绍
  • rcv_space 用于tcp自动调优,用来调解sender的buffer
联系我


  • 联系我,做深入的交流

至此,本文结束
在下才疏学浅,有撒汤漏水的,请各位不吝见教...

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

傲渊山岳

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表