ifconfig 下面的一些字段(errors, dropped, overruns)

部署运行你感兴趣的模型镜像

ifconfig 下面的一些字段(errors, dropped, overruns)

一台机器经常收到丢包的报警,先看看最底层的有没有问题:
# ethtool  em2 | egrep 'Speed|Duplex'
        Speed: 1000Mb/s
        Duplex: Full

# ethtool  -S em2 | grep crc
     rx_crc_errors: 0

Speed, Duplex, CRC 之类的都没问题,基本可以排除物理层面的干扰。
通过 ifconfig 可以看到 overruns 字段在不停的增大:
# for i in `seq 1 10`; do ifconfig em2 | grep RX | grep overruns; sleep 1; done

dropped 出现问题的倒是遇到过几次,overruns 的倒是第一次遇到,再看看下面这个:
# ethtool  -S em2 | grep drop
     dropped_smbus: 0
     tx_dropped: 0
     rx_queue_0_drops: 26649441
     rx_queue_1_drops: 26096911
     rx_queue_2_drops: 22712954
     rx_queue_3_drops: 16581572
     rx_queue_4_drops: 27349880
     rx_queue_5_drops: 6178622
     rx_queue_6_drops: 19882243
     rx_queue_7_drops: 18802558

发现数值也在不停的增加。G 了一下,发现这些 errors, dropped, overruns 表示的含义还不大一样。根据这篇文档的解释:
# ifconfig em2
em2       Link encap:Ethernet  HWaddr AC:85:3D:A9:03:0D  
          inet addr:211.211.211.211  Bcast:211.211.211.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:17141208886 errors:0 dropped:0 overruns:164254181 frame:0
          TX packets:14685534428 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:2619578349554 (2.3 TiB)  TX bytes:1479317006067 (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 造成的传输中断。

在梳理这些 error/drop/discard 的时候,由于涉及到不同的 NIC 型号,ethtool/netstat 或者是直接从 proc 里面获取到的数据所代表的意思还不完全一样,比如上面通过 ethtool 得到的「丢包」是通过 rx_queue_NUM_drops 这个字段表示的,而通过 netstat 看到的却是 RX-OVR 表示的,一个是 overruns 一个是 dropped,字面意思完全不同:
# netstat -i | column  -t
Kernel  Interface  table
Iface   MTU        Met    RX-OK        RX-ERR  RX-DRP  RX-OVR     TX-OK        TX-ERR  TX-DRP  TX-OVR  Flg
em2     1500       0      17159519100  0       0       164254181  14701510290  0       0       0       BMRU

不管是使用何种工具,最终的数据无外乎是从下面这两个文件获取到的:

  1. /sys/class/net/em2/statistics/
  2. /proc/net/dev

# cat /proc/net/dev | column  -t
Inter-|            Receive      |        Transmit
face               |bytes       packets  errs      drop       fifo  frame  compressed  multicast|bytes  packets      errs  drop  fifo  colls  carrier  compressed
em2:2621515020998  17153788154  0        0         164254181  0     0      0           1480433225509    14696703883  0     0     0     0      0        0

对于上面出现的若干种问题,一方面是做好监控,另外一方面是出现问题的时候及时的想到各种的可能,无外乎那么几种。Google 过程中发现了 stackexchange 上还没人回答的问题,结合上面的,我顺便回答了一下,基本,遵循里面的四点,95% 以上的场景应该能轻松应对。

ref:
http://serverfault.com/questions/561107/how-to-find-out-the-reasons-why-the-network-interface-is-dropping-packets
http://serverfault.com/questions/448768/cat-proc-net-dev-and-ip-s-link-show-different-statistics-which-one-is-lyi
http://www.linuxjournal.com/content/queueing-linux-network-stack


转自 http://jaseywang.me/2014/08/16/ifconfig-%E4%B8%8B%E9%9D%A2%E7%9A%84%E4%B8%80%E4%BA%9B%E5%AD%97%E6%AE%B5errors-dropped-overruns/

您可能感兴趣的与本文相关的镜像

Anything-LLM

Anything-LLM

AI应用

AnythingLLM是一个全栈应用程序,可以使用商用或开源的LLM/嵌入器/语义向量数据库模型,帮助用户在本地或云端搭建个性化的聊天机器人系统,且无需复杂设置

当你在执行 `ifconfig eth0` 时看到输出中有: ``` RX packets 123456789 bytes 987654321 (941.9 MB) RX errors 0 dropped 50000 overruns 0 frame 0 ``` 其中的 **`dropped`** 字段表示:**内核在接收路径上主动丢弃的数据包数量**。这个值不是硬件错误,而是反映系统处理能力不足或资源限制的重要指标。 --- ### 一、`ifconfig eth0` 中 `RX dropped` 的含义 - **`dropped`** 是由内核主动丢弃的包数。 - 它通常发生在以下情况: - 内核没有足够的资源(如内存、CPU 时间)来处理新到的数据包 - 接收队列已满(backlog 队列、socket 缓冲区等) - 网络子系统过载,无法及时从网卡 ring buffer 取走数据包 > ✅ 注意:`dropped` ≠ `errors` > - `errors`:通常是物理层问题(CRC 错误、帧对齐失败等) > - `dropped`:是**软件/资源层面**的丢包,说明“我知道这是个好包,但我现在不能处理” --- ### 二、哪些情况下会导致 `RX dropped` 增加? #### 1. **CPU 处理不过来(softirq 瓶颈)** - softirq(特别是 `NET_RX`)运行太慢,不能及时处理中断和轮询网卡。 - 导致: - backlog 队列溢出 - ring buffer 满 → 新包被丢弃 - 查看命令: ```bash cat /proc/softirqs | grep NET_RX ``` 如果某个 CPU 上的计数增长极快且不均衡,说明存在单核瓶颈。 --- #### 2. **netdev_max_backlog 队列满** - 当 softirq 来不及处理包时,内核会将包放入 per-CPU 的输入队列。 - 最大队列长度由参数控制: ```bash sysctl net.core.netdev_max_backlog # 默认可能是 1000 或 16384 ``` - 超过此值则直接丢包,并计入 `dropped`。 🔧 解决方案: ```bash sysctl -w net.core.netdev_max_backlog=5000 # 或更大值(需根据内存调整) ``` --- #### 3. **应用层读取速度慢(UDP/TCP 接收缓冲区满)** - 特别对于 UDP: - 内核收到包后送入 socket 接收缓冲区 - 应用程序未及时调用 `recv()` → 缓冲区满 → 后续包被丢弃 - 这类丢包也会被统计为 `RX dropped` 🔍 检测方法: ```bash netstat -su # 查看 "packet receive errors"(即 socket 层丢包) ss -uln # 查看 UDP sockets 的 rqueue(接收队列长度) ``` 🔧 调优建议: ```bash # 增大默认和最大接收缓冲区 sysctl -w net.core.rmem_default=262144 sysctl -w net.core.rmem_max=16777216 ``` 在代码中设置: ```c int rcvbuf = 8 * 1024 * 1024; setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &rcvbuf, sizeof(rcvbuf)); ``` --- #### 4. **内存不足导致 sk_buff 分配失败** - 每个网络包都需要一个 `sk_buff` 结构来描述。 - 如果系统内存紧张,分配失败 → 包被丢弃 → `dropped++` 🔍 查看日志: ```bash dmesg | grep -i "failed to allocate skb" ``` --- #### 5. **PF_PACKET 抓包工具占用资源过多** - 使用 `tcpdump`、`Wireshark` 等工具抓包时,使用的是 AF_PACKET 接口。 - 如果用户态程序处理不及时,内核会丢弃原本要传递给它的包。 示例输出: ```bash tcpdump -i eth0 ... # 输出: 10000 packets captured # 2000 packets dropped by kernel ``` > “dropped by kernel” 就体现在 `ifconfig` 的 `RX dropped` 中。 --- ### 三、如何排查 `RX dropped` 是否严重? #### 1. 实时监控 `dropped` 变化 ```bash watch -n 1 'ifconfig eth0 | grep RX' ``` 观察 `dropped` 是否持续增长。 #### 2. 对比 `ethtool` 统计信息 ```bash ethtool -S eth0 | grep -i "drop\|fifo\|overrun" ``` 重点关注: - `rx_dropped` - `rx_fifo_errors` → 表示因 CPU 不及时导致硬件 FIFO 溢出 - `rx_over_errors` → buffer overflow #### 3. 查看软中断负载 ```bash watch -n 1 'cat /proc/softirqs | grep NET_RX' ``` 看是否某一个 CPU 核心长期主导处理,成为瓶颈。 --- ### 四、优化方案汇总 | 问题原因 | 优化措施 | |--------|---------| | CPU 单核瓶颈 | 启用 RSS/RPS,分散负载到多核 | | backlog 队列太小 | 增大 `net.core.netdev_max_backlog` | | socket 缓冲区小 | 增大 `rmem_max` 和 `SO_RCVBUF` | | 抓包工具丢包 | 改用 PF_RING、AF_PACKET v3 或减少过滤复杂度 | | 内存不足 | 增加内存或降低流量 | --- ### 五、典型调优脚本(临时生效) ```bash # 增大队列 ethtool -G eth0 rx 4096 tx 4096 # 增加 backlog sysctl -w net.core.netdev_max_backlog=5000 # 增加 socket 接收缓冲区 sysctl -w net.core.rmem_default=262144 sysctl -w net.core.rmem_max=16777216 # 开启 RPS(假设是多队列网卡) echo f > /sys/class/net/eth0/queues/rx-0/rps_cpus echo f > /sys/class/net/eth0/queues/rx-1/rps_cpus ``` --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值