Linux如何查看某个进程收发包的数量

工作中定位排查一些问题,记录在此,积累经验。

背景简述

有两台机器之间网络不佳,影响上面的主从服务同步。使用ping命令简单测试之后发现,同一AZ(可用区)下的时延竟然有100多ms,正常情况下应该在1ms以内。

之前没遇到过这样的情况,联系网络组的同事,通过监控发现两台机器的pps(Packet Per Second)很高,超过限制,被限流了,所以这两台机器之间的时延很大。

那怎么找到造成pps升高的进程呢?

实操小结

  • 使用iftop -P命令,可以看到机器上各个端口之间的流量情况,可以定位到对应的进程,但是看不到每个端口之间发送的包的数量;
  • 使用sar -n DEV 1命令,可以看到机器上总的收发包的量,但是不能定位具体是哪个进程导致的;

google,baidu了很久,都没有找到能够直接统计每个进程收发包数量的工具,很尴尬,,,

学习整理

然后询问公司大佬同事,自己再上网查了资料,简单总结如下:

TCP

使用tcp协议进行传输时,除了前面封装的tcp头部数据,后面真正的数据部分可以填充很多内容,所以认为tcp的数据包是没有边界的;

MTU和MMS

物理链路中并不能传输任意大小的数据包,所以就有网络接口配置的最大传输单元(MTU),规定了最大的 IP 包大小。一旦网络包超过 MTU 的大小,就会在网络层分片,以保证分片后的 IP 包不大于 MTU 值。在我们最常用的以太网中,MTU 默认值是 1500(这也是 Linux 的默认值)

TCP的单个数据报的最大消息长度,称为 MSS(Max Segment Size)

TCP在建立连接的过程中, 通信双方会进行MSS协商。
(最理想的情况下, MSS的值正好是在IP不会被分片处理的最大长度)

MSS协商的过程:
  • 双方在发送SYN的时候会在TCP头部写入自己能支持的MSS值
  • 然后双方得知对方的MSS值之后, 选择较小的作为最终MSS
    (MSS=MTU-20字节TCP报头-20字节IP报头,那么在以太网环境下,MSS值一般就是1500-20-20=1460字节)
MSS和MTU的关系

如何查看机器的MMS值呢?

用tcpdump工具在Linux抓包后,用wireshark打开进行分析,在SYN包如下地方找到了该机器的MMS值:

正是 1460 字节

所以 每个进程收发包的个数=每个进程收发的流量(bits)/MMS值 (1460)?

验证

其实到这已经满足我们要找出发包数量最多的进程的需求了,即看收发的流量大小,因为收发包数量的多少跟流量是成正比的。

但是为了验证MTU和MSS在实际中的效果,在机器上执行sar -n DEV 1 1获取到如下输出:

10:03:01 PM     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s
10:03:02 PM        lo     82.65     82.65     19.14     19.14      0.00      0.00      0.00
10:03:02 PM      eth0  47719.39  41940.82   8141.14   6878.60      0.00      0.00      0.00

各字段含义如下:

  • IFACE:LAN接口
  • rxpck/s:每秒钟接收的数据包(单位为 个数)
  • txpck/s:每秒钟发送的数据包
  • rxbyt/s:每秒钟接收的字节数(单位为 kB)
  • txbyt/s:每秒钟发送的字节数
  • rxcmp/s:每秒钟接收的压缩数据包
  • txcmp/s:每秒钟发送的压缩数据包
  • rxmcst/s:每秒钟接收的多播数据包

按照刚才了解到的:

收或发包的数量 = 收或发流量(bits)/MTU(1500)

验证:

收包数量    收包流量/MTU
rxkB/s      rxkB/s / 1500
47719.39    8141.14 * 1000 * 8(kB转换) / 1500 = 43419.41     好像有点不太对,,,

8141.14 * 1000 * 8 / 47719.39 = 1364 ??

6878.60 * 1000 * 8 / 41940.82 = 1312.06 ?? 

这样简单的计算之后并不是刚好等于我们预料中的值,不过也差不了很多,应该是有一些关键的细节没有掌握,没有考虑进去,等网络和Linux相关的知识再掌握的深入一些,应该就有更多的思路了。

写下此博客记录自己的学习思考过程,欢迎大佬评论指导~

参考:

Linux网络流量实时监控ifstat iftop命令详解 https://www.cnblogs.com/ggjucheng/archive/2013/01/13/2858923.html

数据链路层之以太网、MAC、MTU详解 https://blog.csdn.net/baidu_37964071/article/details/80487582

TCP/IP协议:最大报文段长度(MSS)是如何确定的 https://blog.csdn.net/xiaofei0859/article/details/51052848

tcp/ip https://www.cnblogs.com/xiaolincoding/p/12638546.html

tcp/ip https://www.cnblogs.com/edisonchou/p/5987827.html

OSI参考模型——数据链路层详解 https://blog.csdn.net/jeffleo/article/details/53932693

Linux下查看与修改mtu值 https://www.cnblogs.com/wjoyxt/p/6873714.html

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值