Linux怎么排查网络中间件丢包由于Linux内核sk_buff队列太短

风辰吖_6706

风辰吖_6706

2026-10-22

554人浏览

原创

sk_buff队列本身不可调,真正影响丢包的是网卡ring buffer、netdev_max_backlog软中断队列和socket接收队列三层缓冲;ring buffer溢出表现为ethtool -s eth0中rx_missed_errors持续上涨,且该值非零即为铁证。

linux怎么排查网络中间件丢包由于linux内核sk_buff队列太短

sk_buff 队列本身不是可调的“队列长度”,真正影响丢包的是它所依赖的几层缓冲区:网卡 Ring Buffer、内核软中断处理队列(netdev_max_backlog)、以及 socket 接收队列(sk_receive_queue)。所谓“sk_buff 队列太短”,其实是这些环节中某一层被填满后,新 sk_buff 无法分配或入队,导致丢弃。

怎么确认是 Ring Buffer 溢出导致的丢包

网卡 DMA 写包时若 Ring Buffer 满,硬件直接丢弃,不进内核协议栈——这是最典型的“看不见的丢包”。关键指标不是 ifconfig 的 overruns,而是驱动级计数器:

  • ethtool -S eth0 | grep rx_missed_errors 非零且持续上涨 → Ring Buffer 真的不够用
  • ethtool -g eth0 查看当前 RX 值(如 Current hardware settings: RX: 256)
  • 注意:rx_missed_errors 和 rx_over_errors 不同,后者多为 CRC 错误,前者才是 Ring Buffer 溢出的铁证

调大 Ring Buffer 后为什么还丢包

增大 ethtool -G eth0 rx 4096 只解决第一跳,后面两关必须同步跟上,否则瓶颈前移:

Obsidian (Linux)
Obsidian (Linux)

操作 Obsidian 库(纯 Markdown 笔记),并通过 notesmd-cli 实现自动化。

下载
  • net.core.netdev_max_backlog 必须 ≥ Ring Buffer 大小,否则软中断队列溢出,netstat -s | grep "packet receive errors" 会涨
  • net.core.rmem_default 和 net.core.rmem_max 要匹配业务吞吐,UDP 场景尤其敏感;netstat -s | grep UdpInOverflows 上涨说明 socket 层已溢出
  • 别忽略 CPU 软中断分布:cat /proc/interrupts | grep eth0 若单核 softirq 占用长期 >85%,需启用 RPS 或调整 RSS 队列绑定

sk_buff 分配失败的典型现象与验证

当内存紧张或 slab 分配器压力大时,alloc_skb() 可能返回 NULL,此时丢包发生在 netif_receive_skb() 入口之前,日志里看不到包,但内核统计会体现:

  • grep "skb_alloc" /proc/kmsg(需先 dmesg -n 8 提高日志级别)
  • cat /proc/slabinfo | grep skbuff_head_cache 查看 num 和 active 差值过大,说明缓存碎片化严重
  • vmstat 1 观察 pgpgin/pgpgout 是否突增,结合 slabtop 看 skbuff_head_cache 的 use 是否接近 max

真正难缠的不是参数调不对,而是问题横跨三层缓冲:Ring Buffer 溢出、netdev_max_backlog 滞后、socket 队列又满——三者叠加时,ethtool -S 和 netstat -s 的计数器会互相掩盖真实瓶颈点。务必按接收路径顺序逐层验证,别只盯着一个数字猛调。

相关专题

更多
什么是中间件
什么是中间件

中间件是一种软件组件,充当不兼容组件之间的桥梁,提供额外服务,例如集成异构系统、提供常用服务、提高应用程序性能,以及简化应用程序开发。想了解更多中间件的相关内容,可以阅读本专题下面的文章。

2024.05.11

649

5

Golang 中间件开发与微服务架构
Golang 中间件开发与微服务架构

本专题系统讲解 Golang 在微服务架构中的中间件开发,包括日志处理、限流与熔断、认证与授权、服务监控、API 网关设计等常见中间件功能的实现。通过实战项目,帮助开发者理解如何使用 Go 编写高效、可扩展的中间件组件,并在微服务环境中进行灵活部署与管理。

2025.12.18

624

18

ThinkPHP中间件机制与请求拦截处理实践
ThinkPHP中间件机制与请求拦截处理实践

本专题围绕 ThinkPHP 中间件体系展开,深入讲解中间件的定义、注册与执行流程。内容包括全局中间件与路由中间件的区别、请求前后处理逻辑、自定义中间件开发以及权限验证与日志处理应用。通过实际案例,帮助开发者掌握中间件在项目中的核心作用与最佳实践。

2026.03.31

438

17

磁盘配额是什么
磁盘配额是什么

磁盘配额是计算机中指定磁盘的储存限制,就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。php中文网为大家提供各种磁盘配额相关的内容,教程,供大家免费下载安装。

2023.06.21

4150

4

如何安装LINUX
如何安装LINUX

本站专题提供如何安装LINUX的相关教程文章,还有相关的下载、课程,大家可以免费体验。

2023.06.29

3513

10

linux find
linux find

find是linux命令,它将档案系统内符合 expression 的档案列出来。可以指要档案的名称、类别、时间、大小、权限等不同资讯的组合,只有完全相符的才会被列出来。find根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部分为 path,之后的是 expression。还有指DOS 命令 find,Excel 函数 find等。本站专题提供linux find相关教程文章,还有相关

2023.06.30

2733

5

linux修改文件名
linux修改文件名

本专题为大家提供linux修改文件名相关的文章,这些文章可以帮助用户快速轻松地完成文件名的修改工作,大家可以免费体验。

2023.07.05

6670

7

linux系统安装教程
linux系统安装教程

linux系统是一种可以免费使用,自由传播,多用户、多任务、多线程、多CPU的操作系统。本专题提供linux系统安装教程相关的文章,大家可以免费体验。

2023.07.06

6322

7

linux查看文件夹大小
linux查看文件夹大小

Linux是一种自由和开放源码的类Unix操作系统,存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。linux怎么查看文件夹大小呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.07.20

3653

8

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

Buffalo框架快速入门指南
Buffalo框架快速入门指南

共0课时 | 0人学习

Valgrind支持平台说明
Valgrind支持平台说明

共0课时 | 0人学习