工作中定位排查一些问题,记录在此,积累经验。
背景简述
有两台机器之间网络不佳,影响上面的主从服务同步。使用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