引言
Linux 内核有海量可调参数(sysctl 上千项),但调优的正确姿势不是「把参数拉满」,而是「按负载特点对症下药」——数据库想要大缓冲、Web 服务器想要高连接、文件服务器想要 IO 吞吐。本文先讲 sysctl 体系与持久化,再分块覆盖内存(vm.)、网络(net.)、文件系统与 IO、进程调度与 CPU 隔离、HugePages,最后按典型场景给参数组合与验证方法。
前置:/linux-performance-tuning/(性能监控与调优流程)、/linux-filesystem-disk/(磁盘与文件系统)、/linux-network-commands/(网络栈)。
目录
- 1. 内核调优的目标与边界
- 2. sysctl 体系:查看、修改与持久化
- 3. 内存调优:vm 参数与 swap 策略
- 4. 网络调优:net 参数与高连接场景
- 5. 文件系统与 IO 调优
- 6. 进程调度:优先级、cgroup 与 CPU 隔离
- 7. HugePages:大页内存与透明大页
- 8. 按场景配置:Web、数据库与文件服务器
- 9. 调优验证与回归
- 10. 速查表与一句话记忆
- 延伸阅读
1. 内核调优的目标与边界
内核调优要回答:当前瓶颈是什么?参数改了对瓶颈有什么作用?
瓶颈三查:CPU 饱和?内存不足/换页?IO 慢?网络丢包/队列满?
边界意识:
□ 别抄网上「万能配置」——不同负载参数相反
□ 改前备份、改后验证、可回滚
□ 多数瓶颈在应用层,内核调优是最后 10%
□ 新版内核(6.x)很多参数已自适应,无需手调
调优流程:
监控找瓶颈 → 对症选参数 → 小步调整 → 基准验证 → 固化
记忆:调优先找瓶颈(CPU/内存/IO/网络)再对症;别抄万能配置、改前备份改后验证;多数问题在应用层,内核参数是最后的优化。
2. sysctl 体系:查看、修改与持久化
sysctl 是内核参数的用户态接口。
查看与修改:
sysctl vm.swappiness # 查看单个
sysctl -a | grep net # 查看一类
sysctl -w net.ipv4.tcp_max_syn_backlog=4096 # 临时修改
# 等价于直接写 /proc/sys/
echo 4096 > /proc/sys/net/ipv4/tcp_max_syn_backlog
持久化(/etc/sysctl.d/):
# /etc/sysctl.d/99-tuning.conf
net.ipv4.tcp_max_syn_backlog = 4096
vm.swappiness = 10
sysctl --system # 重载
sysctl -p /etc/sysctl.d/99-tuning.conf
参数命名:/proc/sys/vm/swappiness → vm.swappiness(点替换斜杠)。
记忆:sysctl 读写内核参数——sysctl -w 临时改、/etc/sysctl.d/*.conf 持久化、sysctl –system 重载;命名 /proc/sys/x/y → x.y。
3. 内存调优:vm 参数与 swap 策略
内存相关 vm. 参数*:
# 换页倾向:0 尽量用 RAM,100 积极 swap
vm.swappiness = 10
# 脏页回写阈值(百分比)
vm.dirty_ratio = 30
vm.dirty_background_ratio = 5
# 过度分配策略
vm.overcommit_memory = 0 # 默认启发式
# 大内存应用可 2(固定比例)+ overcommit_ratio
# 缓存回收压力
vm.vfs_cache_pressure = 100
swappiness 怎么设:
- 数据库/内存敏感:10 以下(少 swap)
- 普通桌面:默认 60
- swap 更快/应急:提高
OOM 处理:
vm.panic_on_oom = 0 # 默认:OOM Killer 杀进程
# 或 panic_on_oom=1 让内核 panic(可重启恢复)
内存监控验证:free -h、vmstat 1、sar -r 看换页。
记忆:内存参数核心——swappiness 控 swap 倾向(内存敏感设 10)、dirty_ratio 控脏页回写、overcommit 控分配策略;改完看 free/vmstat 换页是否减少。
4. 网络调优:net 参数与高连接场景
网络参数针对「队列、连接、缓冲区」:
# 连接队列(高并发入口)
net.core.somaxconn = 4096 # 监听队列上限
net.ipv4.tcp_max_syn_backlog = 8192 # SYN 半连接队列
# 端口范围(大量出站连接)
net.ipv4.ip_local_port_range = 1024 65535
# TIME_WAIT 复用
net.ipv4.tcp_tw_reuse = 1
# 缓冲区
net.core.rmem_max = 16M
net.core.wmem_max = 16M
net.ipv4.tcp_rmem = 4096 87380 16M
net.ipv4.tcp_wmem = 4096 65536 16M
# 文件描述符上限(超高连接)
fs.file-max = 2097152
ulimit -n 65535
注意陷阱:
- somaxconn 也受应用 listen 队列影响(nginx worker_connections)
- tcp_tw_reuse 只在 NAT/客户端场景安全,服务端别乱开
- 别无限拉大缓冲——吞内存
验证:ss -lnt、sar -n、netstat -s 看丢包/重传。
记忆:网络调优四件——somaxconn/tcp_max_syn_backlog 扩连接队列、ip_local_port_range 扩端口、tcp_rmem/wmem 调缓冲、fs.file-max 扩 fd;服务端慎开 tcp_tw_reuse,缓冲不是越大越好。
5. 文件系统与 IO 调优
IO 相关参数:
# 读缓存比例
vm.dirty_ratio = 30
vm.dirty_background_ratio = 5
# 回写超时
vm.dirty_writeback_centisecs = 500
# IO 调度器(/sys/block/sdb/queue/scheduler)
# NVMe/SSD → none;机械盘 → mq-deadline
echo none > /sys/block/nvme0n1/queue/scheduler
文件系统层:
- 挂载 noatime(免访问时间写)
- 日志放独立设备(XFS)
- 预读(readahead)按场景调
IO 监控验证:
iostat -x 1 # 看 util/% 与 await
iotop # 实时 IO 进程
机械盘 vs SSD 策略不同:
- 机械盘:deadline 调度、缓冲合理(顺序读写友好)
- SSD:none 调度(多队列)、Trim 定期
记忆:IO 调优——dirty_ratio/background 控回写、SSD 用 none 调度机械盘用 deadline、挂载 noatime;iostat 看 util/await 判断是否 IO 瓶颈。
6. 进程调度:优先级、cgroup 与 CPU 隔离
进程调度控制:
nice/renice:静态优先级
cgroup cpu:比例/限额
taskset:CPU 亲和(绑定核)
isolcpus:内核参数隔离核(专用计算)
nice 与 renice:
nice -n -5 heavyjob # 提高优先级(负值)
renice -n 10 -p 1234 # 调低后台任务
cgroup v2 CPU:
# 限制容器/服务 CPU 份额
systemd 资源控制:CPUWeight/CPUQuota
# /sys/fs/cgroup/ 直接写
CPU 亲和:
taskset -c 0-3 myapp # 绑定前 4 核
NUMA 与隔离:高频低延迟场景用 isolcpus=nohz 隔离专用核跑关键负载。
记忆:调度四件——nice 调静态优先级、cgroup 控 CPU 份额/限额、taskset 绑核、isolcpus 隔离专用核;关键负载隔离核、后台任务降优先级。
7. HugePages:大页内存与透明大页
大页(HugePages):减少 TLB 缺页,提升大内存应用性能(数据库、JVM 大堆)。
传统 HugePages(2MB/1GB 显式分配):
# 预留 2MB 页 × 512 = 1GB
sysctl vm.nr_hugepages=512
# 查看
cat /proc/meminfo | grep -i huge
# 数据库/Java 显式使用(-XX:+UseLargePages / hugepages 配置)
透明大页(THP):内核自动用大页,但可能引入延迟/内存碎片:
# 数据库等延迟敏感应用通常建议关闭
echo never > /sys/kernel/mm/transparent_hugepage/enabled
THP 三态:always / madvise / never。
选型:
- 延迟敏感(数据库)→ 显式 HugePages,THP 设 madvise/never
- 通用 → THP always 或 madvise
- Java 大堆 → 显式 UseLargePages 更稳
记忆:HugePages 减 TLB 缺页提性能——显式 vm.nr_hugepages 预留、THP 自动但可能引延迟;数据库/Java 用显式 HugePages、THP 设 never/madvise;通用 keep always。
8. 按场景配置:Web、数据库与文件服务器
场景一:高并发 Web/API:
net.core.somaxconn = 4096
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.ip_local_port_range = 1024 65535
fs.file-max = 2097152
vm.swappiness = 10
场景二:数据库(内存/延迟敏感):
vm.swappiness = 1
vm.dirty_ratio = 15
vm.dirty_background_ratio = 3
# THP off、显式 HugePages
echo never > /sys/kernel/mm/transparent_hugepage/enabled
# 网络大缓冲(主从/复制)
net.core.rmem_max = 16M
场景三:文件/存储服务器(IO 吞吐):
vm.dirty_ratio = 30
vm.dirty_background_ratio = 10
# SSD: none 调度 + fstrim.timer
场景四:通用安全基线:见 /linux-security-hardening/(kptr_restrict/rp_filter)。
记忆:按场景配——Web 扩连接队列与 fd、数据库低 swap + THP off + 大缓冲、文件服务器脏页回写放宽;安全基线项另配;一个场景一套参数,别混抄。
9. 调优验证与回归
调优不是「改了就行」,要验证收益并防副作用。
验证流程:
改前基线 → 小步调整 → 同一压测 → 对比指标 → 保留有效项
工具:
# 网络:高连接压测
ab / wrk / 负载压测工具
ss -s、netstat -s # 看队列与丢包
# 内存:free/vmstat
vmstat 1 | grep -i swap # 看 si/so 换页
# IO:fio 基准
fio --randwrite --bs=4k --size=1G --numjobs=8 ...
# CPU:mpstat/perf
回归检查:
- P99 是否下降、吞吐是否上升
- 副作用:内存涨了没、延迟抖了没
- 双环境(staging)先验证再上 prod
固化:有效参数进 /etc/sysctl.d/,并记录「为什么改」。
记忆:验证闭环——基线→小步改→同条件压测→对比→固化;网络看 ss/netstat、内存看 vmstat 换页、IO 用 fio、CPU 用 mpstat;副作用先 staging 验,有效项写进 sysctl.d。
10. 速查表与一句话记忆
| 场景 | 关键参数 |
|---|---|
| 高连接入口 | somaxconn、tcp_max_syn_backlog |
| 大量出站连接 | ip_local_port_range、tcp_tw_reuse |
| 内存敏感 | swappiness=10、THP off |
| IO 吞吐 | dirty_ratio、IO 调度器 |
| 大页 | vm.nr_hugepages、UseLargePages |
| 调度 | nice、cgroup、taskset、isolcpus |
| fd 上限 | fs.file-max、ulimit |
一句话记忆:内核调优对症下药——先找瓶颈(CPU/内存/IO/网络)再选参数:Web 高并发扩 somaxconn/SYN 队列/端口范围/fd,数据库低 swappiness + 显式 HugePages + THP off + 大缓冲,文件服务器放宽 dirty 回写 + SSD none 调度;sysctl 临时改、/etc/sysctl.d 持久化;调度用 nice/cgroup/taskset/isolcpus;验证走「基线→小步改→同条件压测→对比→固化」闭环,注意副作用先 staging 验——别抄万能配置,参数是杠杆,对症才有力。
延伸阅读
- /linux-performance-tuning/ — 性能监控与调优流程
- /linux-filesystem-disk/ — 磁盘与文件系统层
- /linux-network-commands/ — 网络栈与排查
- /linux-security-hardening/ — 安全加固 sysctl 基线
- /linux-systemd-services/ — cgroup 资源控制
- [[os]] — 操作系统内核原理
- [[hpc]] — 高性能计算参数
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。