返回首页

Linux 高并发内核优化手册 — 文件句柄/网络/内存/调度/I/O/安全七维调优

📅 创建于 2026-05-28 🔄 更新于 2026-05-29 📝 875 字

来源:Linux沐风 / 刘俊夏 | 发布日期:2026-05-11 / 2025-03-04

Linux 高并发内核优化手册

Linux 内核默认配置偏保守,优先控制资源开销。高并发场景下需对文件句柄、网络栈、内存管理、CPU 调度、I/O 性能、共享内存、安全防护七个维度进行深度优化,才能充分发挥服务器性能。

一、文件句柄优化

用户级限制(ulimit)

系统默认文件句柄数为 1024,高并发场景会触发 Too many open files

修改 /etc/security/limits.conf

# 普通用户
* soft nofile 65535
* hard nofile 65535
* soft nproc 65535
* hard nproc 65535

# root 用户
root soft nofile 65535
root hard nofile 65535
  • nofile — 最大文件句柄数
  • nproc — 最大进程数
  • soft — 软限制(可动态超限),hard — 硬限制(上限)

系统级限制

修改 /etc/sysctl.conf

fs.file-max = 655350          # 系统最大打开文件数,建议为单进程的 10 倍
kernel.pid_max = 65535        # 本机最大进程数(默认 32768,偏少)
fs.inotify.max_user_instances = 8192    # 单用户 inotify 实例数
fs.inotify.max_user_watches = 524288    # 单用户监控文件数

生效:sysctl -p

二、网络高并发内核优化

net.ipv4.ip_local_port_range = 1024 65535    # 端口可用范围
net.ipv4.tcp_tw_reuse = 1                     # 允许复用 TIME_WAIT 端口
net.ipv4.tcp_tw_recycle = 0                   # 关闭 TIME_WAIT 快速回收(NAT 场景必须关)
net.ipv4.tcp_max_tw_buckets = 50000           # 防止 TIME_WAIT 占满端口和内存
net.ipv4.tcp_syncookies = 1                   # 开启 SYN 防攻击
net.ipv4.ip_forward = 1                       # 开启路由转发(Docker/NAT 场景)

关键说明:

  • tcp_tw_reuse — 允许新连接复用 TIME_WAIT 端口,避免端口耗尽
  • tcp_tw_recycle = 0 — 在 NAT 环境下必须关闭(内核 4.12+ 已移除该参数)
  • tcp_syncookies — SYN 泛洪攻击防护,生产环境建议开启
  • ip_forward — Docker、NAT 场景必须开启

Socket 收发缓冲区(tcp_rmem / tcp_wmem)

net.ipv4.tcp_rmem = 4096 87380 16777216   # 接收:min=4KB default=87KB max=16MB
net.ipv4.tcp_wmem = 4096 87380 16777216   # 发送:min=4KB default=87KB max=16MB
net.core.rmem_max = 134217728             # 全局接收缓冲区上限 128MB
net.core.wmem_max = 134217728             # 全局发送缓冲区上限 128MB
  • 三个值分别为最小、默认、最大缓冲区大小
  • 高带宽低延迟场景调大 default/max,海量短连接场景不需过大
  • rmem_max/wmem_max 是全局硬上限,优先级高于 tcp_rmem 的 max

net.core.netdev_max_backlog — 网卡接收队列

net.core.netdev_max_backlog = 5000

控制内核从网卡一次性接收的最大数据包数量。高流量下队列溢出发包。增大可减少该场景丢包。

net.ipv4.tcp_fin_timeout — FIN 等待时间

net.ipv4.tcp_fin_timeout = 30

控制 TCP 连接关闭时的 FIN-WAIT-2 等待时间(默认 60s)。减小可加速连接释放,减少僵尸连接积压。

三、内存内核优化

# SWAP 倾向
vm.swappiness = 10                # 尽量使用物理内存,减少 Swap 触发

# 脏页管理
vm.dirty_ratio = 20               # 脏页达内存 20% 时强制刷盘(阻塞写入)
vm.dirty_background_ratio = 10    # 脏页达内存 10% 时后台刷盘(不阻塞)
vm.dirty_expire_centisecs = 3000  # 脏页驻留 > 30 秒强制落盘
vm.dirty_writeback_centisecs = 500  # 每 5 秒检查一次脏页

# 内存超分
vm.overcommit_memory = 1          # 允许内存超分(数据库/Redis 场景)
vm.overcommit_ratio = 80          # 应用可用物理内存 80%,内核预留 20%

# 大页内存
vm.nr_hugepages = 2               # 固定大页内存,不被置换(根据内存调整)

关键说明:

  • swappiness = 10 — 与 linux-kernel-tuning-production 推荐一致,尽量避免 Swap
  • dirty_ratio / dirty_background_ratio — 控制脏页刷盘策略,平衡写入性能与数据安全
  • overcommit_memory = 1 — 允许内存超分,数据库、Redis 场景避免服务启动失败
  • nr_hugepages — 设置大页内存,固定内存不被置换

vm.min_free_kbytes — 内存保留水位

vm.min_free_kbytes = 65536    # 64MB 或总内存 1%-2%

指定内核保留的最小可用内存,防止系统完全耗尽后触发 OOM。过小会导致内存分配慢,过大浪费可用内存。推荐为总内存的 1%-2%。

vm.vfs_cache_pressure — VFS 缓存回收倾向

vm.vfs_cache_pressure = 50    # 默认 100,降低后更倾向保留 dentry/inode 缓存

控制内核回收 VFS(dentry/inode)缓存的速度。文件操作密集场景降低此值可减少缓存回收频率,提升文件系统性能。

四、CPU 与进程调度优化

以下参数控制 CFS 完全公平调度器的行为,适用于需要精细化 CPU 资源分配的延迟敏感型或高吞吐场景。

kernel.sched_latency_ns — 调度器延迟上限

kernel.sched_latency_ns = 5000000       # 5ms(默认值通常合适)

控制调度器在一个周期内确保每个可运行任务至少运行一次的目标延迟。调大可提升吞吐,调小降低延迟。

kernel.sched_min_granularity_ns — CPU 时间片最小粒度

kernel.sched_min_granularity_ns = 20000000  # 20ms

调度器分配给每个任务的最小 CPU 时间片。较大值减少上下文切换提升吞吐,较小值提升交互响应性。

kernel.sched_wakeup_granularity_ns — 唤醒调度间隔

kernel.sched_wakeup_granularity_ns = 15000000  # 15ms

定义进程被唤醒后重新调度的时间间隔。高负载系统下调大可减少上下文切换开销。

kernel.sched_tunable_scaling — 调度器自动缩放

kernel.sched_tunable_scaling = 1   # 启用动态缩放(默认 0 关闭)

启用后调度器根据 CPU 核数自动调整 sched_latency_ns / sched_min_granularity_ns 等参数,减少手动调优需求。

kernel.sched_child_runs_first — 子进程优先调度

kernel.sched_child_runs_first = 0   # 默认 0,计算密集型保持默认

设为 1 时子进程比父进程优先获得 CPU。适用于大量子进程的高并发场景(如 fork 密集型 worker 模式)。

kernel.sched_idle — 空闲任务调度

kernel.sched_idle = 0               # 默认关闭

启用后允许低优先级空闲任务在 CPU 空闲时运行,适用于后台批量作业场景。

五、I/O 性能优化

I/O 调度器选择(mq-deadline / none)

对于 NVMe/SSD,建议使用 none(块层不干预调度,由设备自身队列管理);对于 HDD/混合存储,mq-deadline 可降低 I/O 延迟:

# 查看当前调度器
cat /sys/block/sda/queue/scheduler

# 设置 mq-deadline
echo mq-deadline > /sys/block/sda/queue/scheduler

fs.aio-max-nr — 异步 I/O 最大请求数

fs.aio-max-nr = 1048576    # 默认 65536

控制系统允许的最大异步 I/O(AIO)请求数。数据库和高并发文件操作场景需调大以避免 I/O 请求排队。

vm.dirty_background_bytes / vm.dirty_bytes — 脏页字节级阈值

vm.dirty_background_bytes = 134217728   # 128MB — 后台开始刷写
vm.dirty_bytes = 268435456              # 256MB — 强制刷写上限

基于字节而非百分比控制脏页刷写,适用于有精确内存预算控制需求的场景。与 dirty_ratio/dirty_background_ratio 互斥(设置 bytes 后 ratio 自动失效)。

六、共享内存与 IPC 优化

kernel.shmmax / kernel.shmall — 共享内存

kernel.shmmax = 2147483648      # 2GB(物理内存的 50%-75%)
kernel.shmall = 2097152         # 对应 2GB(单位:页 = 4KB)

shmmax — 单一共享内存段的最大值。默认通常偏小(32MB),数据库(如 PostgreSQL、Oracle)需要较大共享内存。 shmall — 系统总的共享内存页数上限,建议 = shmmax / PAGE_SIZE。

kernel.msgmni — 消息队列最大数量

kernel.msgmni = 1024            # 默认通常更小

控制内核消息队列(System V IPC)的最大数量。消息密集型应用(IPC、消息队列中间件)需调大。

七、内核安全防控

# 禁止内核暴露内存地址(防 Dirty Frag / copyfail 提权)
kernel.kptr_restrict = 2

# 禁止接收 ICMP 重定向报文(防路由篡改)
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.default.secure_redirects = 0

# ARP 安全(防 ARP 欺骗)
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2

# ICMP 安全(防内网扫描、DDOS 放大)
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1

# ASLR 地址空间随机化(防缓冲区溢出攻击)
kernel.randomize_va_space = 2

# 禁止 setuid 程序 core dump(防敏感信息泄漏)
fs.suid_dumpable = 0

# 禁用 SysRq 键(防物理控制台攻击)
kernel.sysrq = 0

关键说明:

  • kptr_restrict = 2 — 禁止 /proc 暴露内核内存地址,防止提权利用
  • accept_redirects = 0 — 防止恶意路由重定向攻击
  • arp_ignore / arp_announce — 防止 ARP 欺骗和 IP 地址冲突
  • icmp_echo_ignore_broadcasts — 禁止响应广播 ping,防止被用于网络扫描和 DDoS 放大
  • randomize_va_space = 2 — 开启完整 ASLR(地址空间布局随机化),默认已启用
  • suid_dumpable = 0 — 禁止 setuid 程序崩溃时转储 core,防止密码/密钥泄漏
  • sysrq = 0 — 完全禁用 SysRq 组合键,防止物理控制台攻击

八、高级内核参数

以下参数在特定场景下有价值,但非普遍推荐。根据实际业务验证后再应用。

vm.page-cluster — 页交换簇大小

vm.page-cluster = 3             # 默认 3(= 8 页 = 32KB)

控制一次 Swap 交换读取/写入的连续页数。增大可减少交换次数但增加单次 I/O 量。数据库/大内存场景可适当调大。

net.core.optmem_max — Socket 辅助缓冲区

net.core.optmem_max = 25165824   # 24MB(默认约 20KB)

控制每个 Socket 用于存储选项(如 cmsg、ancillary data)的最大内存。高流量网络服务若涉及大量控制消息(e.g. 带外数据、IP_PKTINFO)需调大。

kernel.pid_max — 最大进程数

kernel.pid_max = 65535           # 默认 32768

控制系统最大 PID 数量。高并发容器节点或频繁 fork 的服务可调大,避免 PID 耗尽。nproc ulimit 和 pids.max cgroup 都受此约束。

关联链接

关联页面

页面关联点
linux-raid-lvm-basics-guideLinux RAID 与 LVM 基础入门 — RAID 0/1/5/6/10 级别对比、LVM 分
nginx-production-performance-optimization生产级 Nginx 性能优化 — OS 内核/Worker 进程/HTTP I/O/Upstream
linux-perf-troubleshooting-handbookLinux 服务器性能排查实战手册 — 60 秒快速摸底/4 大瓶颈排查/3 个实战案例/监控阈值/