Linux怎么优化内核以支持千万级超高并发长连接

秋强酱_7379

秋强酱_7379

2026-10-29

669人浏览

原创

单机千万级长连接需绕过内核协议栈:XDP、DPDK或智能网卡是唯一可行路径,sysctl调优仅治标;必须禁用conntrack等开销模块,并由应用层自主管理连接生命周期。

linux怎么优化内核以支持千万级超高并发长连接

千万级长连接不是调几个 sysctl 就能搞定的

直接说结论:单机支撑 C10M(千万连接)长连接,sysctl 参数调优只是最表层动作,真正瓶颈在协议栈路径本身。内核默认 TCP 栈在百万连接时已显疲态,到千万级时,中断处理、conntrack 查表、socket 内存管理、软中断调度全都会成为硬伤。你看到的“连接建立失败”“CPU 软中断 100%”“dmesg 里满屏 orphaned sockets”,都不是配置错了,而是架构到了临界点。

必须绕过内核协议栈:XDP 或 DPDK 是现实选择

当连接数跨过 500 万,net.ipv4.tcp_tw_reuse、net.core.somaxconn 这类参数就失去意义——它们优化的是“连接建立和回收效率”,而千万级长连接的核心矛盾是“每个连接不发包也吃内存 + 每个包都要过完整 TCP/IP 栈”。此时唯一可行路径是绕过内核:

  • XDP:在网卡驱动层做包过滤/转发,延迟低、吞吐高,适合做四层负载均衡或连接代理,但不能处理完整 TCP 状态机
  • DPDK:用户态轮询收发包,彻底 bypass 内核网络栈,配合自研连接管理器可支撑千万级 idle 连接,但开发成本高、调试难、无法直接复用 epoll/sendfile 等系统调用
  • 智能网卡(如 NVIDIA BlueField):把连接跟踪、TCP 终结甚至 TLS 卸载到硬件,适合云厂商或定制化部署,普通业务线难以落地

别信“加内存 + 调 tcp_mem 就能上千万”的说法——一个 idle socket 在 5.10+ 内核下仍占约 4–6 KB 内核内存,千万连接光 socket 结构体就要 40–60 GB,还不算 conntrack 表、sk_buff、页缓存等开销。内存不是瓶颈,是幻觉的起点。

哪怕用内核栈,也得关掉所有“温柔但昂贵”的功能

如果暂时无法切 XDP/DPDK,又必须压测或过渡性支撑 500 万以上长连接,请先停掉所有会引入全局锁或线性扫描的功能:

Obsidian (Linux)
Obsidian (Linux)

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

下载
  • 关掉 net.netfilter.nf_conntrack_enable(即禁用 conntrack),否则每个包都要查哈希表,连接数一过百万,nf_conntrack 查表就成 CPU 热点
  • net.ipv4.tcp_tw_recycle = 0(必须为 0,NAT 下必断连;且现代内核已移除该参数,设了也无效)
  • 禁用 tcp_slow_start_after_idle,避免长连接空闲后重传窗口归零
  • 关闭 net.ipv4.ip_forward 和所有 netfilter 模块(iptables/nftables 规则清空),减少包路径上的 hook 调用
  • net.core.bpf_jit_enable = 0,除非你真用 BPF 做连接管理,否则 JIT 编译器会抢 CPU

这些不是“建议”,是实测中发现的千万级连接下导致软中断卡死的常见开关。开一个,可能就少撑 50 万连接。

应用层必须放弃依赖内核的连接生命周期管理

内核的 CLOSE_WAIT、TIME_WAIT、连接超时检测,在千万连接规模下全是伪命题。你无法靠 tcp_fin_timeout 或 keepalive 参数来“自动清理”——因为内核根本扫不过来。真实做法是:

  • 服务端自己实现心跳 + 连接空闲超时(比如 5 分钟无读写即 close),不依赖 tcp_keepalive_*
  • 客户端必须主动发 FIN,服务端不做半关闭等待;所有连接走 graceful shutdown 流程
  • 用 SO_ATTACH_REUSEPORT_CBPF 或自定义 eBPF 程序做连接分发,替代传统 SO_REUSEPORT 的哈希冲突问题
  • 监控重点不是 ss -s 输出,而是 /proc/net/sockstat 中 sockets: used 和 tcp: 行的 orphan 数量——一旦 orphan 持续 > 10 万,说明内核已开始丢连接

最后提醒一句:C10M 不是性能目标,是架构分水岭。你调的不是 Linux 参数,是在决定要不要把网络栈从内核里“拔出来”。没想清楚这点,所有 sysctl -w 都只是给即将崩溃的系统多续几秒呼吸。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
磁盘配额是什么
磁盘配额是什么

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

2023.06.21

4270

4

如何安装LINUX
如何安装LINUX

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

2023.06.29

3613

10

linux find
linux find

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

2023.06.30

2853

5

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

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

2023.07.05

7010

7

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

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

2023.07.06

6642

7

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

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

2023.07.20

3813

8

linux查看ip命令
linux查看ip命令

本专题为大家提供linux查看ip命令相关文章内容,感兴趣的朋友可以免费下载体验试试。

2023.07.20

3305

4

linux查看cpu使用率
linux查看cpu使用率

在linux的系统维护中,可能需要经常查看cpu使用率,分析系统整体的运行情况。本专题为大家带来了linux查看cpu使用率的相关文章,感兴趣的朋友千万不要错过了。

2023.07.25

3539

6

linux查找文件命令
linux查找文件命令

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

2023.07.31

297

3

热门下载

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

精品课程

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

共0课时 | 0人学习

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

共0课时 | 0人学习

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

共0课时 | 0人学习