Linux 内核参数调优实战:从 sysctl 到调度器与内存回收的完整链路 原创
为什么需要内核参数调优
Linux 内核默认参数面向通用场景,在高并发 Web、游戏服务器、数据库等负载下往往并非最优。合理调整 sysctl 参数可以在不更换硬件的前提下显著提升吞吐量、降低延迟并增强稳定性。本文从网络、内存、文件系统与 CPU 调度四个维度,梳理一套可落地的内核调优实践。
网络层:TCP 与连接队列
对于承接大量短连接的服务器,TCP 参数是收益最明显的调优点。
# 提升本地端口范围,避免 TIME_WAIT 时端口耗尽
net.ipv4.ip_local_port_range = 1024 65535
# 加快 TIME_WAIT 复用与回收(谨慎用于非 NAT 环境)
net.ipv4.tcp_tw_reuse = 1
# 增大 TCP 连接队列与半连接队列
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
# 关闭慢启动小窗口,提升突发吞吐
net.ipv4.tcp_slow_start_after_idle = 0
# 增大文件描述符上限
fs.file-max = 2097152
修改后通过 sysctl -p 生效。注意 tcp_tw_recycle 在 NAT 环境下会导致连接异常,2022 年后内核已默认移除该参数,建议不要使用。
内存层:脏页回收与交换策略
内存参数直接关系写入吞吐与响应稳定性。对于数据库或缓存类服务,降低交换倾向、放宽脏页阈值是常见选择。
# 降低 swap 使用倾向,优先使用物理内存
vm.swappiness = 10
# 允许脏页在后台回写前累积更多(适合写密集型)
vm.dirty_ratio = 20
vm.dirty_background_ratio = 5
# 减少内存碎片,适合大页与长期运行服务
vm.vfs_cache_pressure = 50
对使用透明大页(THP)的数据库场景,建议 echo never > /sys/kernel/mm/transparent_hugepage/enabled 以降低延迟抖动。
CPU 调度:NUMA 与频率策略
多路服务器上,NUMA 感知对内存访问延迟影响显著。通过 numactl 绑定进程到本地节点,可减少跨节点内存访问。
# 查看节点拓扑
lscpu | grep -i numa
# 将进程绑定到 node0
numactl --cpunodebind=0 --membind=0 ./your_server
调度器层面,实时或低延迟负载可使用 chrt 设置 SCHED_FIFO;通用负载保持 CFS 默认即可。频率调节器选择 performance 可避免变频带来的延迟波动。
文件系统:挂载参数与 I/O 调度
针对数据库与日志写入场景,挂载参数的调整能明显降低 fsync 压力。
# noatime 避免每次读取更新访问时间
mount -o remount,noatime,nodiratime /data
# 查看当前 I/O 调度器
cat /sys/block/sda/queue/scheduler
现代内核默认 none(mq-deadline)即可;对 HDD 顺序写可保留 mq-deadline,NVMe 下直接使用 none 通常最优。
验证与回滚
调优必须以可量化的基线为依据。调整前记录 vmstat、sar、ss -s 等指标,调整后再对比。所有 sysctl 改动可通过 sysctl -w 即时测试,确认无误后写入 /etc/sysctl.conf 固化。生产环境建议分批次灰度,保留原始配置以便快速回滚。
内核调优没有银弹,参数应围绕业务特性与瓶颈针对性调整,而非盲目套用他人配置。