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

这篇具有很好参考价值的文章主要介绍了【博客573】linux内核层丢包排查方法汇总。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

linux丢包排查方法汇总

1、排查网卡丢包

命令1: ifconfig xxx

ifconfig eth0
eth0      Link encap:Ethernet  HWaddr AC::3D:A9::0D
          inet addr:211.211.211.211  Bcast:211.211.211.255  Mask:255.255.255.0
          UP 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: 0
     rx_missed_errors: 0
     rx_long_length_errors: 0
     rx_short_length_errors: 0
     rx_align_errors: 0
     rx_errors: 0
     rx_length_errors: 0
     rx_over_errors: 0
     rx_frame_errors: 0
     rx_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                                                |  Transmit

 face |bytes    packets errs drop fifo frame compressed multicast|bytes    packets errs drop fifo colls carrier compressed
  eth0: 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=0xffffffff96aa2cc8
        ffffffff969c4803 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

示例分析:文章来源地址https://www.toymoban.com/news/detail-594994.html

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

到了这里,关于【博客573】linux内核层丢包排查方法汇总的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • (STM32H5系列)STM32H573RIT6、STM32H573RIV6、STM32H573ZIT6嵌入式微控制器基于Cortex®-M33内核

    工业(PLC、工业电机控制、泵和压缩机) 智能家居(空调、冰箱、冰柜、中央警报系统、洗衣机) 个人电子产品(键盘、智能手机、物联网标签、跟踪设备) 智能城市(工业通信、照明控制、数字电源) 医疗和保健(CPAP和呼吸器、透析机、药丸分配器、电动病床) 1、ST

    2024年02月09日
    浏览(43)
  • 一文解决ethtool 原理介绍和解决网卡丢包排查思路

    之前记录过处理因为 LVS 网卡流量负载过高导致软中断发生丢包的问题, RPS 和 RFS 网卡多队列性能调优实践 [1],对一般人来说压力不大的情况下其实碰见的概率并不高。这次想分享的话题是比较常见服务器网卡丢包现象排查思路,如果你是想了解点对点的丢包解决思路涉及面

    2023年04月18日
    浏览(32)
  • 设备通过GB28181注册到EasyCVR,平台看不到设备信息的排查方法汇总

    智慧安防平台EasyCVR能在复杂的网络环境中(专网、局域网、广域网、VPN、公网等)将前端海量的设备进行统一集中接入与视频汇聚管理,平台支持设备通过4G、5G、WIFI、有线等方式进行视频流的接入与传输,支持的接入协议包括:国标GB28181、RTSP/Onvif、RTMP,以及厂家的私有协

    2024年01月24日
    浏览(35)
  • linux主机宕机排查问题方法 1 排查思路

    1.1 查看宕机的时间记录和历史登陆还有重启时间 1)查看历史重启 2)查看历史异常登录用户 1.2 首先查看系统日志 linux下的/var/log/下的log日志,包括message,内核报错日志demsg等等,sa记录,是记录cpu,内存等运行的性能文件,记录着运行时的cpu的运行状态等。 1)利用sa文件

    2024年02月16日
    浏览(39)
  • Linux 网络延迟排查方法详解

      在 Linux 服务器中,可以通过内核调优、DPDK 以及 XDP 等多种方式提高服务器的抗攻击能力,降低 DDoS 对正常服务的影响。在应用程序中,可以使用各级缓存、WAF、CDN 等来缓解 DDoS 对应用程序的影响。 但是需要注意的是,如果 DDoS 流量已经到达 Linux 服务器,那么即使应用层

    2024年02月12日
    浏览(32)
  • 《Linux 内核设计与实现》10. 内核同步方法

    原子操作:可以保证指令以原子的方式执行,即执行过程不被打断。 原子整数操作 整数的原子操作只针对 atomic_t 类型。因为: 让原子函数只接收 atomic_t 类型的操作数,可以确保原子操作只与这种特殊类型数据一起使用。同时这也保证了该类型的数据不会被传递给任何非原

    2024年02月04日
    浏览(36)
  • Linux系统之升级内核版本方法

    确保yum仓库的正常,本次实践用的是阿里的镜像源。 直接更新内核版本,此方法适用于更新内核补丁。 重启服务器 检查内核版本 重启完成,发现内核版本已经升级为【3.10.0-1160.83.1.el7.x86_64】 ELRepo是一个为Linux提供驱动程序和内核映像的存储库,这里的内核大版本升级方案就

    2024年02月06日
    浏览(62)
  • Linux系统中负载高问题排查思路与解决方法

    Load 是对计算机干活多少的度量,Load Average 是一段时间(1分钟、5分钟、15分钟)内平均Load。 一、Load分析: 情况1:CPU高、Load高 通过top命令查找占用CPU最高的进程PID; 通过top -Hp PID查找占用CPU最高的线程TID; 对于java程序,使用jstack打印线程堆栈信息(可联系业务进行排查定

    2024年02月16日
    浏览(30)
  • 升级Ubuntu Linux内核的多种方法

    Ubuntu是一种流行的Linux操作系统,它定期发布更新的内核版本,以提供性能改进、新功能和安全修复。本文将介绍升级Ubuntu Linux内核的几种不同方法,包括使用命令行和使用图形界面工具。 使用命令行 1.1. 使用apt命令 apt命令是Ubuntu中包管理器的基本工具之一,可以用于安装、

    2024年02月03日
    浏览(63)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包