3. 内核参数分类:VM内存管理、Net网络协议栈、Kernel通用内核、FS文件系统、Dev设备驱动
Linux 内核的 sysctl 参数数量庞大,直接面对数百个可调参数往往令人无从下手。系统化的分类方法是性能调优的基础。根据参数所影响的内核子系统,可将 sysctl 参数划分为五大核心类别:VM(内存管理)、Net(网络协议栈)、Kernel(通用内核)、FS(文件系统)和Dev(设备驱动)。理解这五类参数的职责边界与交互关系,是精准定位性能瓶颈的前提。
调优原则:不要盲目套用网上“万能参数”。每类参数都对应特定的资源瓶颈场景,调优前应通过监控工具(如 sar、perf、vmstat)确认瓶颈所在子系统,再有针对性地调整对应分类的参数。
3.1 分类总览与层级结构
sysctl 参数在 /proc/sys/ 目录下以文件系统树的形式组织,顶级目录直接对应上述五大分类。下表列出了每个分类的顶层路径、核心关注点以及典型参数示例:
| 分类 | procfs 路径 | 核心关注点 | 典型参数示例 |
|---|---|---|---|
| VM | /proc/sys/vm/ |
页面回收、脏页回写、OOM 行为、NUMA 平衡 | vm.swappiness, vm.dirty_ratio, vm.overcommit_memory |
| Net | /proc/sys/net/ |
TCP/IP 栈、套接字缓冲区、拥塞控制、连接跟踪 | net.core.rmem_max, net.ipv4.tcp_congestion_control |
| Kernel | /proc/sys/kernel/ |
进程调度、信号量、共享内存、系统限制、内核日志 | kernel.sched_migration_cost_ns, kernel.msgmax |
| FS | /proc/sys/fs/ |
文件句柄限制、inode 缓存、目录通知、配额 | fs.file-max, fs.inotify.max_user_watches |
| Dev | /proc/sys/dev/ |
CDROM、硬盘参数、特定设备驱动行为 | dev.cdrom.autoclose, dev.raid.speed_limit_min |
下图展示了这五类参数在内核架构中的层级位置以及它们与硬件、系统调用接口的关系:
3.2 VM 内存管理参数
VM 类参数控制内核的内存分配、回收与缓存行为。在内存密集型应用(如数据库、大数据处理)中,VM 参数是调优的重中之重。
3.2.1 核心参数速查表
| 参数名 | 默认值 | 作用域 | 调优方向 |
|---|---|---|---|
vm.swappiness |
60 | 全局 | 降低至 1~10 减少 swap 倾向;增大可加速回收 |
vm.dirty_ratio |
20 | 全局 | 写密集型提高至 40~60 减少回写频率 |
vm.dirty_background_ratio |
10 | 全局 | 通常为 dirty_ratio 的一半 |
vm.overcommit_memory |
0 | 全局 | 数据库设为 2(禁止过量使用);一般服务保持 0 |
vm.vfs_cache_pressure |
100 | 全局 | 降低至 50 减少 dentry/inode 回收 |
vm.min_free_kbytes |
动态 | 全局 | 大内存系统适当提高防止内存碎片 |
3.2.2 内存回收与脏页回写流程
下图展示了 VM 参数在内存回收路径中的控制点:
实战案例:某 Elasticsearch 集群频繁出现写入抖动。通过将
vm.dirty_ratio 从 20 提升至 40,vm.dirty_background_ratio 从 10 提升至 20,脏页回写频率降低 50%,写入延迟峰值下降 35%。
3.3 Net 网络协议栈参数
Net 类参数是 sysctl 中数量最多、调整最频繁的一类。它们控制 TCP/IP 协议栈的缓冲区大小、拥塞控制算法、连接跟踪、TIME_WAIT 处理等行为。
3.3.1 核心参数速查表
| 参数名 | 默认值 | 作用域 | 调优方向 |
|---|---|---|---|
net.core.rmem_max |
212992 | 全局 | 高吞吐场景提升至 16777216 (16MB) |
net.core.wmem_max |
212992 | 全局 | 同上 |
net.ipv4.tcp_rmem |
4096 87380 6291456 | 每连接 | 调整 min/default/max 三个值 |
net.ipv4.tcp_wmem |
4096 16384 4194304 | 每连接 | 同上 |
net.ipv4.tcp_tw_reuse |
0 | 全局 | 高并发短连接设为 1 |
net.core.somaxconn |
128 | 全局 | 高并发提升至 1024~4096 |
net.ipv4.tcp_congestion_control |
cubic | 全局 | 数据中心用 bbr;长肥网络用 htcp |
3.3.2 TCP 数据接收路径与缓冲区控制
注意:修改网络缓冲区参数时,务必同时调整
net.core.rmem_max 和 net.core.wmem_max,否则 tcp_rmem 和 tcp_wmem 的 max 值会被系统级上限截断,导致调整无效。
3.4 Kernel 通用内核参数
Kernel 类参数涵盖进程调度、IPC(进程间通信)、系统日志、内核限制等通用功能。这类参数通常不直接与硬件交互,但影响系统的整体行为与稳定性。
3.4.1 核心参数速查表
| 参数名 | 默认值 | 作用域 | 调优方向 |
|---|---|---|---|
kernel.sched_migration_cost_ns |
500000 | 全局 | 减少至 100000 提高 CPU 负载均衡灵敏度 |
kernel.msgmax |
8192 | 全局 | 消息队列应用提升至 65536 |
kernel.msgmnb |
16384 | 全局 | 同上 |
kernel.shmmax |
18446744073709551615 | 全局 | 数据库(如 PostgreSQL)设为物理内存一半 |
kernel.sem |
250 32000 32 128 | 全局 | 高并发应用适当提高 |
kernel.panic |
0 | 全局 | 生产环境设为 10(10秒后自动重启) |
3.4.2 进程调度与 IPC 参数关系
经验值:对于运行 PostgreSQL 或 Oracle 的数据库服务器,建议将
kernel.shmmax 设置为物理内存的 50%,kernel.shmall 设置为物理内存页数(shmmax / PAGE_SIZE)。对于高并发 Java 应用,适当提高 kernel.sem 的四个值可减少信号量竞争。
3.5 FS 文件系统参数
FS 类参数控制文件系统层面的资源限制与缓存行为。在文件服务器、Web 服务器、日志收集等场景中,FS 参数直接影响并发连接数和文件操作性能。
3.5.1 核心参数速查表
| 参数名 | 默认值 | 作用域 | 调优方向 |
|---|---|---|---|
fs.file-max |
动态(取决于内存) | 全局 | 高并发服务设为 1000000+ |
fs.nr_open |
1048576 | 全局 | 通常无需修改,但需大于 file-max |
fs.inotify.max_user_watches |
8192 | 每用户 | 文件监控工具(如 rsync、IDE) |