linux丢包排查方法汇总

1、排查网卡丢包

命令1: ifconfig xxx

ifconfig eth0
eth0      Link encap:Ethernet  HWaddr AC::3D:A9::0Dinet addr:211.211.211.211  Bcast:211.211.211.255  Mask:255.255.255.0UP BROADCAST RUNNING MULTICAST  MTU:  Metric:RX packets: errors: dropped: overruns: frame:TX packets: errors: dropped: overruns: carrier:collisions: txqueuelen:RX bytes: ( (1.3 TiB)Memory:94b00000-94b20000

解析:

RX errors: 表示总的收包的错误数量,这包括 too-long-frames 错误,Ring Buffer 溢出错误,crc 校验错误,帧同步错误,fifo overruns 以及 missed pkg 等等。

RX dropped: 表示数据包已经进入了 Ring Buffer,但是由于内存不够等系统原因,导致在拷贝到内存的过程中被丢弃。

RX overruns: 表示了 fifo 的 overruns,这是由于 Ring Buffer(aka Driver Queue) 传输的 IO 大于 kernel 能够处理的 IO 导致的,而 Ring Buffer 则是指在发起 IRQ 请求之前的那块 buffer。很明显,overruns 的增大意味着数据包没到 Ring Buffer 就被网卡物理层给丢弃了,而 CPU 无法即使的处理中断是造成 Ring Buffer 满的原因之一,上面那台有问题的机器就是因为 interruprs 分布的不均匀(都压在 core0),没有做 affinity 而造成的丢包。

RX frame: 表示 misaligned 的 frames

对于TX:出现上述 counter 增大的原因主要包括 aborted transmission, errors due to carrirer, fifo error, heartbeat erros 以及 windown error,而 collisions 则表示由于 CSMA/CD 造成的传输中断。

dropped与overruns的区别

dropped:表示这个数据包已经进入到网卡的接收缓存fifo队列,并且开始被系统中断处理准备进行数据包拷贝(从网卡缓存fifo队列拷贝到系统内存),但由于此时的系统原因(比如内存不够等)导致这个数据包被丢掉,即这个数据包被Linux系统丢掉。

overruns:表示这个数据包还没有被进入到网卡的接收缓存fifo队列就被丢掉,因此此时网卡的fifo是满的。为什么fifo会是满的?因为系统繁忙,来不及响应网卡中断,导致网卡里的数据包没有及时的拷贝到系统内存,fifo是满的就导致后面的数据包进不来,即这个数据包被网卡硬件丢掉。所以,个人觉得遇到overruns非0,需要检测cpu负载与cpu中断情况

命令2: ethtool -S xxx

ethtool -S eth0 | grep rx_ | grep errors

     rx_crc_errors: 0rx_missed_errors: 0rx_long_length_errors: 0rx_short_length_errors: 0rx_align_errors: 0rx_errors: 0rx_length_errors: 0rx_over_errors: 0rx_frame_errors: 0rx_fifo_errors: 0

2、排查网络丢包

命令: netstat -i

Kernel Interface table
Iface            MTU    RX-OK RX-ERR RX-DRP RX-OVR    TX-OK TX-ERR TX-DRP TX-OVR Flg
br-0。           1500 120663354      0      0 0      89134427      0      0      0 BMRU
docker0          1500 3307728075      0      0 0      3520602520      0      0      0 BMRU
ens192           1500 3644841642      0   6930 0      3335406503      0      0      0 BMRU

解析:

RX-OK:接收时,正确的数据包数。
RX-ERR:接收时,产生错误的数据包数。
RX-DRP:接收时,丢弃的数据包数。
RX-OVR:接收时,由于过速(在数据传输中,由于接收设备不能接收按照发送速率传送来的数据而使数据丢失)而丢失的数据包数。
TX-OK:发送时,正确的数据包数。
TX-ERR:发送时,产生错误的数据包数。
TX-DRP:发送时,丢弃的数据包数。
TX-OVR:发送时,由于过速而丢失的数据包数。
Flg标志:
* B 已经设置了一个广播地址。
* L 该接口是一个回送设备。
* M 接收所有数据包(混乱模式)。
* N 避免跟踪。
* O 在该接口上,禁用ARP。
* P 这是一个点到点链接。
* R 接口正在运行。
* U 接口处于“活动”状态。

}

3、排查是否防火墙没关导致包被防火墙丢弃

查看防火墙: systemctl status firewalld.service

关闭防火墙: systemctl stop firewalld.service

禁止防火墙开机自动启动: systemctl disable firewalld.service

4、排查连接跟踪表溢出导致丢包

查看是否有溢出错误: dmesg |grep conntrack

5、排查Ring Buffer溢出导致丢包

命令1: ethtool -S eth0|grep rx_fifo

rx_fifo_errors: 0

命令2: cat /proc/net/dev

Inter-|   Receive                                                |  Transmitface |bytes    packets errs drop fifo frame compressed multicast|bytes    packets errs drop fifo colls carrier compressedeth0: 17253386680731 42839525880    0    0    0     0          0 244182022 14879545018057 41657801805    0    0    0     0       0         0

6、反向路由校验rp_filter过滤导致丢包

查看当前rp_filter策略配置: cat /proc/sys/net/ipv4/conf/eth0/rp_filter

分析:具体要根据出入包的处理网络设备以及rp_filter当前的值来判断是否发生

rp_filter导致的丢包数量可以通过netstat命令查看

netstat -s | grep IPReversePathFilter

可以设置打印syslog:

sysctl -w net.ipv4.conf.all.log_martians=1

设置之后可以在/var/log/messages中看到对应的日志

IPv4: martian source 10.185.203.166 from 10.185.203.172, on dev eth1
ll header: 00000000: fa 16 3e dd 7b bb fa 16 3e 28 00 60 08 00

7、半连接队列溢出导致丢包

半连接队列:

半连接队列指的是TCP传输中服务器收到SYN包但还未完成三次握手的连接队列,队列大小由内核参数tcp_max_syn_backlog定义。当服务器保持的半连接数量达到tcp_max_syn_backlog后,内核将会丢弃新来的SYN包。

通过dmesg可以确认是否有该情况发生:dmesg | grep “TCP: drop open request from”

半连接队列的连接数量可以通过netstat统计SYN_RECV状态的连接得知:

$ netstat -ant|grep SYN_RECV|wc -l
0大多数情况下这个值应该是0或很小,因为半连接状态从第一次握手完成时进入,
第三次握手完成后退出,正常的网络环境中这个过程发生很快,如果这个值较大,
服务器极有可能受到了SYN Flood攻击。

8、排查iptables规则丢包

查看当前有哪些drop规则: iptables-save | grep -i drop

例如:出现以下drop规则-A INPUT -p tcp -m tcp --dport 6666 -j DROP

确定是否命令改drop规则: iptables -L INPUT -nv

查看pkts这里是否计数增加,增加就是证明出现丢包:Chain INPUT (policy ACCEPT 0 packets, 0 bytes)pkts bytes target     prot opt in     out     source               destination         48  2991 DROP       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:6666

9、查看内核丢包

方法1: 使用perf

perf抓取命令: perf record -g -a -e skb:kfree_skb

perf查看命令: perf script

方法2: 使用dropwatch

安装命令: yum install dropwatch

使用命令: dropwatch -l kas,启动后按start开始抓取

示例:

1、perf判断是否出现内核丢包: perf record -g -a -e skb:kfree_skb

查看perf record结果:perf script

swapper     0 [001] 1299147.131284: skb:kfree_skb: skbaddr=0xff40b007a2ad7400 protocol=2048 location=0xffffffff96aa2cc8ffffffff969c4803 kfree_skb+0x73 ([kernel.kallsyms])ffffffff969c4803 kfree_skb+0x73 ([kernel.kallsyms])ffffffff96aa2cc8 tcp_v4_rcv+0x48 ([kernel.kallsyms])ffffffff96a76c3c ip_protocol_deliver_rcu+0x2c ([kernel.kallsyms])ffffffff96a76e2d ip_local_deliver_finish+0x4d ([kernel.kallsyms])ffffffff96a76f20 ip_local_deliver+0xe0 ([kernel.kallsyms])ffffffff96a771ab ip_rcv+0x27b ([kernel.kallsyms])ffffffff969e0610 __netif_receive_skb_core+0xba0 ([kernel.kallsyms])ffffffff969e07bd netif_receive_skb_internal+0x3d ([kernel.kallsyms])ffffffff969e1268 napi_gro_receive+0x108 ([kernel.kallsyms])ffffffffc05b8431 mlx5e_handle_rx_cqe+0xb1 ([kernel.kallsyms])ffffffffc05b9f34 mlx5e_poll_rx_cq+0x804 ([kernel.kallsyms])ffffffffc05ba6dc mlx5e_napi_poll+0x10c ([kernel.kallsyms])ffffffff969e1b5d __napi_poll+0x2d ([kernel.kallsyms])ffffffff969e2033 net_rx_action+0x253 ([kernel.kallsyms])ffffffff96e000d7 __softirqentry_text_start+0xd7 ([kernel.kallsyms])ffffffff962f3f3b irq_exit_rcu+0xcb ([kernel.kallsyms])ffffffff962f3f4a irq_exit+0xa ([kernel.kallsyms])ffffffff96c01e7f do_IRQ+0x7f ([kernel.kallsyms])

此例子中能看到了kfree_skb,证明出现了内核丢包

2、dropwatch追踪丢包的地方: dropwatch -l kas

Initalizing kallsyms db
dropwatch> start
Enabling monitoring...
Kernel monitoring activated.
Issue Ctrl-C to stop monitoring
1 drops at skb_queue_purge+18 (0xffffffff92a42868)
2 drops at unix_dgram_sendmsg+4f8 (0xffffffff92b1b168)
1 drops at nf_hook_slow+f3 (0xffffffff92a99be3)
6 drops at nf_hook_slow+f3 (0xffffffff92a99be3)
1 drops at nf_hook_slow+f3 (0xffffffff92a99be3)
4 drops at nf_hook_slow+f3 (0xffffffff92a99be3)

示例中,nf_hook_slow代表在netfilter处理丢包,一般是被防火墙丢弃

10、利用bpf抓去内核hook点来排查netfilter hook等其它原因的丢包

bpf开源追踪项目:

https://github.com/OpenCloudOS/nettrace

安装追踪工具nettrace:

wget https://github.com/OpenCloudOS/nettrace/releases/download/v1.2.3/nettrace-1.2.3-1.tl3.x86_64.rpm
yum install python3
rpm -i nettrace-1.2.3-1.tl3.x86_64.rpm

抓取丢弃的包: nettrace --drop

begin trace...
[1303097.782556] TCP: 172.17.0.2:51578 -> 10.172.1.110:9100 seq:3752084848, ack:0, flags:S, tcp_v4_rcv+0x48
[1303100.778508] TCP: 172.17.0.2:51930 -> 10.172.1.110:9100 seq:2637953428, ack:0, flags:S, tcp_v4_rcv+0x48
[1303102.782574] TCP: 172.17.0.2:51930 -> 10.172.1.110:9100 seq:2637953428, ack:0, flags:S, tcp_v4_rcv+0x48
[1303105.098950] TCP: 10.172.1.110:43390 -> 10.172.1.111:6666 seq:1070580818, ack:0, flags:S, nf_hook_slow+0xa7
[1303105.778674] TCP: 172.17.0.2:52280 -> 110.172.1.111:9100 seq:3671449143, ack:0, flags:S, tcp_v4_rcv+0x48
[1303106.142463] TCP: 10.172.1.111:43390 -> 10.172.1.110:6666 seq:1070580818, ack:0, flags:S, nf_hook_slow+0xa7

示例分析:

从丢包的hook点是nf_hook_slow看出是netfilter丢弃的,排查方向应该注重于:
防火墙,selinux,用户的iptables等会下发hetfilter hook规则的地方

【博客573】linux内核层丢包排查方法汇总相关推荐

  1. LINUX内核网络丢包监控

    2020年8月11日 | 由 梁金荣 | 800字 | 阅读大约需要2分钟 | 归档于 内核网络 | 原文:http://kerneltravel.net/blog/2020/network_ljr6 ...

  2. Linux内核网络丢包查看工具dropwatch的安装和使用

    本文将安装并使用dropwatch工具,来收集并查看Linux内核网络中丢包的数量和位置. 安装 sudo apt-get install -y libnl-3-dev libnl-genl-3-de ...

  3. Linux下网络丢包故障定位

    Linux下网络丢包故障定位 | syxdevcode博客转载: 云网络丢包故障定位全景指南 硬件网卡丢包Ring Buffer溢出 如图所示,物理介质上的数据帧到达后首先由NIC(网络适配器)读取, ...

  4. linux 丢包排查思路简述(tcp+rdma)

    linux 丢包排查思路简述 概述 网络包接收流程 网络包发送流程 丢包排查的思路 tcp排查方法 rdma排查方法 网络工具汇总 参考链接 概述 我们首先以tcp网络为例,谈谈linux系统如何收发 ...

  5. Linux内核网络数据包发送(三)——IP协议层分析

    Linux内核网络数据包发送(三)--IP协议层分析 1. 前言 2. `ip_send_skb` 3. `ip_local_out` and `__ip_local_out` 3.1 netfilt ...

  6. Linux内核网络数据包发送(二)——UDP协议层分析

    Linux内核网络数据包发送(二)--UDP协议层分析 1. 前言 2. `udp_sendmsg` 2.1 UDP corking 2.2 获取目的 IP 地址和端口 2.3 Socket 发送:b ...

  7. 如何快速优化 Linux 内核 UDP 收包效率? | CSDN 博文精选

    作者 | dog250 责编 | 郭芮 出品 | CSDN 博客 现在很多人都在诟病Linux内核协议栈收包效率低,不管他们是真的懂还是一点都不懂只是听别人说的,反正就是在一味地怼Linux内核协议栈 ...

  8. Linux内核UDP收包为什么效率低?能做什么优化?

    现在很多人都在诟病Linux内核协议栈收包效率低,不管他们是真的懂还是一点都不懂只是听别人说的,反正就是在一味地怼Linux内核协议栈,他们的武器貌似只有DPDK. 但是,即便Linux内核协议栈收包 ...

  9. Linux内核网络数据包发送(四)——Linux netdevice 子系统

    Linux内核网络数据包发送(四)--Linux netdevice 子系统 1. 前言 2. `dev_queue_xmit` and `__dev_queue_xmit` 2.1 `netdev_ ...

最新文章

  1. Linux内核中无名管道pipe和有名管道fifo的分析
  2. 安卓5.0以上设备最简单激活XPOSED框架的步骤
  3. python爬虫机器_Python常用的机器学习库|python爬虫|python入门|python教程
  4. python僵尸进程和孤儿进程_python中多进程应用及僵尸进程、孤儿进程
  5. layUI日期格式转换
  6. dubbo分布式事务解决方案_阿里架构师谈:高并发+分布式+秒杀+微服务+性能优化...
  7. 原来我也可以写Android小游戏
  8. cmder的下载安装
  9. java正则判断11位手机号码_java-正则表达式判断手机号
  10. 学计算机拼音不好怎么办,孩子拼音基础差怎么办?告诉你学拼音技巧!
  11. 关于php多维数组,PHP多维数组
  12. 大学毕业4年-回顾和总结(9)-股权投资1年,给自己一个答卷(好狗狗、皇包车、职业梦、比呀比、易途8)(创业有风险,投资需谨慎)
  13. 一分钟600字,Python实现打字网站作弊并过检测
  14. Autosar NM
  15. 深度学习基础实例与总结
  16. 系统架构设计笔记(35)—— 结构化分析与设计
  17. 加拿大海派什么意思,加拿大海派时效多久?
  18. 计算机高中期末总结作文,高中期末总结:高一期末总结作文
  19. linux切换用户时 su-,Linux切换用户(su)
  20. curl php 模拟来源_PHP cURL实现模拟登录与采集使用方法详解教程

热门文章

  1. 【陈工笔记】# latex中如何将图片并排处理 #
  2. [光源频闪] Basler相机光源频闪设置操作说明
  3. 全国主要城市交通卡芯片一览,看看有没有你的家乡……
  4. 170亿参数,28项公开测试集SOTA,行业最大的视觉多任务统一大模型来了
  5. 换行和回车(/n /r)
  6. Microsoft Edge 离线下载安装技巧
  7. 英雄无敌3出官方高清版了
  8. vue vuex 模块化 namespace
  9. WinRAR去广告(简体中文版)
  10. 多维高斯混合模型参数估计(python)