Linux 内核调优实战:sysctl、内存、网络与调度参数

Linux 内核参数调优地图:sysctl 体系与持久化、vm 内存(缓存/swap/OOM)、net 网络(缓冲/连接)、文件系统 IO、进程调度与 CPU 隔离、HugePages、按场景配置与验证回归。

引言

Linux 内核有海量可调参数(sysctl 上千项),但调优的正确姿势不是「把参数拉满」,而是「按负载特点对症下药」——数据库想要大缓冲、Web 服务器想要高连接、文件服务器想要 IO 吞吐。本文先讲 sysctl 体系与持久化,再分块覆盖内存(vm.)、网络(net.)、文件系统与 IO、进程调度与 CPU 隔离、HugePages,最后按典型场景给参数组合与验证方法。

前置:/linux-performance-tuning/(性能监控与调优流程)、/linux-filesystem-disk/(磁盘与文件系统)、/linux-network-commands/(网络栈)。


目录


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]] — 高性能计算参数

继续阅读

探索更多技术文章

浏览归档,发现更多关于系统设计、工具链和工程实践的内容。

全部文章 返回首页

「linux」更多文章

  1. Linux 高级文件系统:XFS、Btrfs、ZFS 与存储进阶
  2. Linux 高可用与负载均衡:HAProxy、Keepalived 与集群方案
  3. Linux 防火墙与 nftables:规则集、链、NAT 与网络安全防护