最近同事问了一个问题,说上层应用出现一个问题,但是问题不好复现。问题现象是A程序向另一个虚拟机的B程序发了UDP包,但是表像是B没有收到,业务没有处理。所以想问问Linux系统有没有什么log可以看,这种丢包的问题,出现在系统级别的情况很少,而且又不是经常出现。Linux系统提供的很多计数都是累积的数值,如果发生的问题次数很少,这个计数值的参考意义就下降很多,需要复现然后看计数的增加值。
所以最好还是从上层应用开始分析,如果问题能复现就要抓tcpdump/tshark来分析问题。看看到底是不是丢包的问题,还是应用程序自己的问题。
要从系统看的话,需要看以下几种情况,
0. 在应用层加一下网络接口异常处理的日志,看看有没有异常的问题,比如send失败,recv失败。
1. 再抓包,看看有没有发出来,有没有收到。
2. 然后再依照上一步的结果,继续看,当前系统有没有设置防火墙
3. 看内核的网络统计分析的计数,看看有没有异常丢包的情况
4. 根据结果,再继续往下走,看底层的虚拟网络有没有问题
5. 。。。。
这一趟下来,应该就可以找到问题所在了。
顺便将之前的文章重新再发一遍,旧文重发:
最近遇到一个丢包的问题,感觉晕晕乎乎的!问题是:说这个应用程序调用了sent,也没有返回错误,那肯定是发出去了。现场的人就拿着这个pcap文件说:为什么没有?为什么没有?为什么没有?这都说三遍了,看来可能是真没发出来,或者是内核给丢了?而且我们看着这个pcap文件也是没有抓到(经过后续的调查,原因是ipsec与MTU的设置问题,需要单独写一篇。)
其实这个时候,就是被客户给唬住了,还是和之前说的:[程序员]现场问题支持的另一个总结,coordinator的选定;这个时候需要一个可以镇住客户的技术协调者来做协调。(当时已经在想如何使用大杀器ftrace做debug了,还好是没用上。)
最后,不知道这个客户技术员是(或者被协调的)怎么缓过神来,发现他抓的包里有一个ICMPv6标记的错误包:packet too big。这个时候我们才知道,这个给我们的包是被过滤的。下次一定记得要从客户那里要全的抓包记录了!切记,如果要不过来,也需要让他们告诉我们过滤条件!既然有了这个ICMPv6的错误包,这个问题的调查就非常的顺畅了。
这个发送方向的丢包怎么分析?根据具体的情况,Linux系统接收包被丢,具体就是下面几个步骤:
第一:要和客户确认是否真的发生丢包;眼见为实!以这一次的问题为例,就需要确认抓包的情况。过滤条件等。这第一个是重中之重!
第二:查看防火墙日志,计数,iptables相关规则等
第三:要看icmp的统计计数;看是否有由于MTU的设置与包的大小不一致;需要使用netstat -s;或者是/proc/net/snmp[6]文件查看。看是否有相应的ICMP的错误出现。
第四:查看对应TCP/UDP/IP层的统计计数,也是netstat -s 或者/proc/net/snmp[6]。
第五:查看ip -s 链路层的一些计数。
第六:查看socket的信息:ss -i。
第七:ethtool -S 命令查看Device TX ring buffer,缓存环分配的太小导致包丢;ethtool -g eth0;ethtool -G eth0 rx 4080
第八:还要看arp解析的时候有没有drop包。tc -s qdisc。
第九:如果以上方式都不行就需要使用ftrace 跟踪skb free的原因:kfree_skb_reason
第十:其他一些不包含在这里的方法。
最后,祝大家好运!在碰到丢包的时候,可以找到适合自己的一个方法!或者根据AI大语言模型的提示来分析问题。