mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4
1026 字
3 分钟
Linux 内核参数调优指南
2021-07-22

简介#

Linux 内核参数是操作系统中的关键配置项,可以控制系统的方方面面,包括内存管理、CPU 调度、网络堆栈、文件系统等。合理调整这些参数可以显著提升系统的性能、稳定性和安全性。

Warning

内核参数的修改会直接影响系统行为,不恰当的配置可能导致服务崩溃甚至系统不稳定。请在测试环境中充分验证后,再应用到生产环境。 建议修改前记录原始值,以便快速回滚。

内核参数基础知识#

什么是内核参数#

内核参数是 Linux 内核暴露给用户空间的一系列配置选项,用于控制内核的行为。这些参数存储在 /proc/sys/ 目录下,可以通过 sysctl 命令或直接读写相应文件进行查看和修改。

参数类型和分类#

Linux 内核参数主要分为以下几类:

  • /proc/sys/kernel/:内核核心功能相关参数
  • /proc/sys/vm/:虚拟内存相关参数
  • /proc/sys/net/:网络相关参数
  • /proc/sys/fs/:文件系统相关参数
  • /proc/sys/dev/:设备相关参数

查看和修改参数的方法#

# 查看单个参数的当前值
sysctl vm.swappiness
# 查看所有参数
sysctl -a
# 临时修改(重启后失效)
sysctl -w vm.swappiness=10
# 或直接写入 /proc/sys/
echo 10 > /proc/sys/vm/swappiness
# 永久修改:编辑配置文件后执行 sysctl -p 使其生效
echo "vm.swappiness = 10" >> /etc/sysctl.d/99-custom.conf
sysctl -p /etc/sysctl.d/99-custom.conf

性能调优#

内存管理#

# 控制内核在物理内存使用满时,交换(swap)到磁盘的频率。数值越高,越倾向于交换数据;数值越低,内存压力更大时才会进行交换
# 默认值: 60
# 范围: 0-100
# 建议值:
# - 数据库服务器:0-10
# - Web服务器:10-30
# - 桌面系统:30-60
vm.swappiness
# 控制脏页(dirty pages,已修改但未写回磁盘的数据)的最大比例。vm.dirty_background_ratio 定义了系统开始将脏页刷写到磁盘的触发阈值,而 vm.dirty_ratio 则是写操作的上限
# 默认值:20
vm.dirty_ratio
# 当脏页达到此百分比时,强制进行同步写入磁盘
# 建议值:
# - 数据库服务器:设置较低,如 5-10 和 3-5
# - 文件服务器:可以适当调高,如 30-40 和 15-20
vm.dirty_background_ratio
# 指定内核保留的一定量内存,用于防止系统内存完全耗尽,避免系统进入 OOM(Out of Memory)状态
# 默认值: 根据系统内存自动计算
# 建议值: 总内存的 0.5%-2%
vm.min_free_kbytes
# 控制内存超额分配策略
# 默认值:0
# 值含义:
# - 0: 允许内存过度提交,但内存分配时会检查内存是否足够
# - 1: 总是允许内存过度提交(不检查实际内存)
# - 2: 禁止内存过度提交,分配内存时需要考虑实际内存
# 建议值:
# - 数据库服务器:2(不允许超额分配)
# - 通用服务器:0(启发式策略)
vm.overcommit_memory
# 控制内存超额分配策略
# 默认值:80
vm.overcommit_ratio

文件系统#

# 系统级别的最大文件描述符数量限制
# 默认值:根据可用内存计算
# 建议值:
# - 高并发 Web 服务器:1000000+
# - 数据库服务器:2000000+
fs.file-max
# 控制内核回收用于缓存的内存。当该值较大时,内核会倾向于回收更多的缓存;较小的值则保留更多的缓存
# 默认值:100
# 推荐值:在文件系统缓存非常重要的情况下,可以降低该值,比如设置为 50
vm.vfs_cache_pressure
# 控制系统中可用的最大 inotify 监听器数目。增加该值可以帮助增强监控能力,尤其在大量文件监控的场景下
# 推荐值:524288
fs.inotify.max_user_watches
# 进程级别的最大文件描述符数量限制
# 默认值:1048576
fs.nr_open
# 异步 I/O 请求的最大数量
# 默认值: 65536
# 建议值:
# - 数据库服务器:262144-1048576
# - 文件服务器:131072-524288
fs.aio-max-nr

网络参数#

# TCP 连接请求队列的最大长度
# 默认值: 128
# 建议值:
# - Web 服务器:4096-8192
# - 代理服务器:16384-32768
net.core.somaxconn
# 网络设备接收队列的最大长度。如果网络流量很大,设置较大的值可以避免丢包
# 默认值:1000
# 建议值:
# - 高流量服务器:16384-300000
net.core.netdev_max_backlog
# SYN 队列的最大长度,用于防御 SYN 洪水攻击
# 默认值: 128
# 推荐值:4096
net.ipv4.tcp_max_syn_backlog
# 启用 SYN cookies 机制,防止 SYN 洪水攻击
# 默认值: 1(启用)
net.ipv4.tcp_syncookies
# 允许重用 TIME_WAIT 状态的 TCP 连接,减少对系统资源的消耗,尤其是在高并发场景下
# 默认值: 0(禁用)
# 推荐值:1
net.ipv4.tcp_tw_reuse
# 本地端口范围,扩大可用端口数量
# 默认值: 32768 60999
net.ipv4.ip_local_port_range
# 控制 TCP 连接在关闭时的等待时间。减小此值可以加速连接的关闭,减少过多的 TCP 连接状态
net.ipv4.tcp_fin_timeout
# 分别控制 TCP 接收和发送缓冲区的最小、默认和最大大小。这对于高带宽网络应用至关重要
# 推荐值:4096 87380 16777216
net.ipv4.tcp_rmem
net.ipv4.tcp_wmem

进程管理#

# 控制调度器延迟(任务调度时的最大延迟)。该参数决定了调度器在处理实时任务时的延迟
# 默认值:5000000(表示 5ms)
# 推荐值:
# - 适用于需要低延迟的场景,默认值通常已足够
kernel.sched_latency_ns
# 控制 CPU 时间片的最小粒度。该参数决定了调度器给每个任务分配的最小时间
# 推荐值:20000000
kernel.sched_min_granularity_ns
# 定义一个进程被唤醒时,它被重新调度的时间间隔。适用于减少高负载系统中的上下文切换
# 推荐值:15000000
kernel.sched_wakeup_granularity_ns
# 启用动态调整调度器参数的功能,用于自动根据系统负载优化调度器行为
# 推荐值:1
kernel.sched_tunable_scaling
# 分别控制系统允许的最大共享内存段大小和系统总的共享内存页数。在处理数据库和大规模数据处理时,这两个参数的调优尤为重要
# 推荐值:根据内存大小和应用需求设置,通常设置为物理内存的 50%-75%
kernel.shmmax
kernel.shmall

I/O 调优#

# 控制在将数据写入磁盘之前,内核将保持多大的脏数据。vm.dirty_background_bytes 控制后台刷写脏数据的阈值,vm.dirty_bytes 控制刷写的最大数据量。调整这两个参数可以优化磁盘的写入性能
# 推荐值:将 vm.dirty_bytes 设置为更高的值,避免频繁刷写(如 268435456(256M));而将 vm.dirty_background_bytes 设置为较小的值,确保系统能够及时将脏数据刷回磁盘(如 134217728(128M))
vm.dirty_background_bytes
vm.dirty_bytes
# 在进行磁盘 I/O 操作时,调整调度器策略。mq-deadline 调度器适用于需要低延迟和高吞吐量的应用程序,特别是数据库和文件服务器
# 推荐值:将调度器设置为 mq-deadline 可以提升磁盘的读写性能
block.mq-deadline

安全相关参数#

# 启用地址空间布局随机化(ASLR),增加系统的安全性,防止攻击者猜测内存布局
# 推荐值:2
kernel.randomize_va_space
# 控制是否允许执行 setuid 程序时转储 core 文件。为了提高安全性,建议将其设置为 0(不允许转储)
# 推荐值:0
fs.suid_dumpable

场景化调优方案#

高并发 Web 服务器#

# TCP 连接快速回收(避免 TIME-WAIT 堆积)
net.ipv4.tcp_tw_reuse = 1 # 允许复用 TIME-WAIT 状态端口
net.ipv4.tcp_fin_timeout = 15 # FIN-WAIT-2 状态超时(默认 60 秒)
# 连接队列优化(应对突发流量)
net.core.somaxconn = 65535 # 全连接队列上限
net.ipv4.tcp_max_syn_backlog = 65535 # SYN 半连接队列上限
# 网络缓冲区动态调整(根据 10Gbps 网络 BDP 计算)
net.ipv4.tcp_rmem = 4096 87380 33554432 # 接收窗口(最大 32MB)
net.ipv4.tcp_wmem = 4096 65536 33554432 # 发送窗口
# 文件描述符优化(公式:worker_processes * worker_connections * 2)
fs.file-max = 1048576 # 系统级总限制
fs.epoll.max_user_watches = 2097152 # 每个进程监控的文件数上限
# 端口复用范围(减少端口耗尽概率)
net.ipv4.ip_local_port_range = 1024 65000

数据库服务器#

# 内存策略(最大化物理内存使用)
vm.swappiness = 1 # 几乎禁用 Swap
vm.overcommit_memory = 2 # 严格内存分配策略
vm.overcommit_ratio = 70 # 物理内存 70% 可用
# 脏页控制(平衡数据安全与性能)
vm.dirty_background_ratio = 3 # 后台刷脏阈值 3%
vm.dirty_ratio = 10 # 强制刷脏阈值 10%
vm.dirty_expire_centisecs = 500 # 脏页最长驻留 5 秒(SSD 建议值)
# 大页内存优化(需配合应用配置)
vm.nr_hugepages = $(($(grep MemTotal /proc/meminfo | awk '{print $2}')/2048)) # 总内存/2MB
echo never > /sys/kernel/mm/transparent_hugepage/enabled
# 存储优化(NVMe SSD 专用)
echo none > /sys/block/nvme0n1/queue/scheduler # 禁用调度器
vm.dirty_writeback_centisecs = 100 # 每 1 秒检查脏页

容器环境#

# 资源隔离增强
kernel.pid_max = 262144 # 最大 PID 数量(默认 32768)
user.max_user_namespaces = 10240 # 限制用户命名空间创建
# 网络性能优化(万兆网络建议值)
net.netfilter.nf_conntrack_max = 1048576 # 连接跟踪表大小
net.core.netdev_max_backlog = 100000 # 接收队列长度
net.ipv4.tcp_keepalive_time = 300 # 减少 Keepalive 探测开销
# Cgroup 内存回收策略
vm.zone_reclaim_mode = 0 # 禁用 NUMA 区域回收
vm.vfs_cache_pressure = 50 # 减少 inode 缓存回收压力
# 存储驱动优化(OverlayFS 专用)
fs.inotify.max_user_instances = 8192 # 单用户监控实例数
fs.inotify.max_user_watches = 524288 # 监控文件数上限

高性能计算环境#

# CPU 隔离与调度(通过 GRUB 配置)
isolcpus=4-15 # 隔离 CPU 核心供计算任务使用
kernel.sched_min_granularity_ns = 20000000 # 最小时间片 20ms
kernel.sched_wakeup_granularity_ns = 15000000 # 唤醒间隔 15ms
# 内存与 NUMA 优化
vm.numa_balancing = 0 # 禁用自动 NUMA 平衡
kernel.shmmax = 68719476736 # 共享内存上限 64GB
kernel.shmall = 17592186044416 # 共享内存页数配置
# 网络低延迟优化(InfiniBand/RDMA)
net.core.rmem_max = 268435456 # 256MB 接收窗口
net.core.wmem_max = 268435456 # 256MB 发送窗口
net.ipv4.tcp_low_latency = 1 # 启用低延迟模式
# 中断绑定优化(需配合 irqbalance 配置)
echo 0 > /proc/irq/22/smp_affinity_list # 指定中断到特定 CPU

桌面系统#

# 交互响应优化
vm.vfs_cache_pressure = 30 # 保留更多目录缓存(默认 100)
kernel.sched_child_runs_first = 1 # 子进程优先调度
kernel.sched_latency_ns = 10000000 # 调度周期 10ms(默认 24ms)
# 图形性能增强
drm.vblankoffdelay = 1 # 减少显示延迟
vm.dirty_writeback_centisecs = 1500 # 延长写回间隔(默认 500)
# 电源管理优化(Intel CPU 专用)
intel_pstate=disable # 使用 acpi-cpufreq 驱动
echo balance_power > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
# 桌面应用文件监控
fs.inotify.max_user_watches = 524288 # 支持 IDE/文件管理器监控

最佳实践#

参数调优的核心原则#

内核参数调优不是”越大越好”或”照搬别人的配置”。每个系统的工作负载不同,调优前需要明确三点:系统的瓶颈在哪里、调优的目标是什么、如何衡量调优效果。

以下是经过生产环境验证的调优最佳实践。

内存相关参数调优#

内存是最常调优的子系统。错误的内存参数会导致频繁 swap、OOM Kill 甚至系统卡死。

vm.swappiness

# 查看当前值
sysctl vm.swappiness
# 根据场景设置:
# 数据库服务器(MySQL/PostgreSQL):尽量减少 swap,避免查询延迟飙升
vm.swappiness = 1
# Web 服务器 / API 服务:适度 swap,保持内存余量
vm.swappiness = 10
# 桌面系统 / 开发环境:默认值即可
vm.swappiness = 60

注意:vm.swappiness = 0 并非完全禁用 swap,内核在极端内存压力下仍会使用。如果确实需要零 swap,应该直接关闭 swap 分区(swapoff -a)。

vm.dirty_ratio 与 vm.dirty_background_ratio

脏页控制影响数据安全性和写入性能。值设得太高,断电时可能丢失大量数据;设得太低,频繁刷盘会降低 I/O 性能。

# 数据库服务器:低脏页比例,减少数据丢失风险
vm.dirty_background_ratio = 3 # 3% 时后台开始刷写
vm.dirty_ratio = 10 # 10% 时强制同步刷写
# 文件服务器 / 日志采集:允许更多缓冲,提升吞吐
vm.dirty_background_ratio = 15
vm.dirty_ratio = 30
# 配合写入频率控制
vm.dirty_writeback_centisecs = 500 # 每 5 秒唤醒刷写线程
vm.dirty_expire_centisecs = 3000 # 脏页超过 30 秒必须刷写

vm.overcommit_memory

# 大多数场景用默认值 0(启发式过提交)
vm.overcommit_memory = 0
# 数据库(Redis、PostgreSQL)推荐设为 2,严格禁止过提交
# 此时可用内存 = Swap + 物理内存 * overcommit_ratio / 100
vm.overcommit_memory = 2
vm.overcommit_ratio = 80
# 注意:设为 2 后要确保 overcommit_ratio 留够余量
# 否则可能在 fork() 子进程时失败

网络相关参数调优#

网络参数直接影响高并发服务的连接处理能力和吞吐量。

net.core.somaxconn

# 全连接队列上限。当并发连接 burst 到来时,队列太短会导致连接被丢弃
# Nginx 的 listen 指令中 backlog 参数不能超过这个值
net.core.somaxconn = 65535
# 对应的半连接队列也要调大
net.ipv4.tcp_max_syn_backlog = 65535

net.ipv4.tcp_tw_reuse

# 允许将 TIME_WAIT 状态的连接重新用于新的 TCP 连接
# 对高并发短连接服务(HTTP API、微服务间调用)非常有效
net.ipv4.tcp_tw_reuse = 1
# 配合缩短 FIN_WAIT 超时时间
net.ipv4.tcp_fin_timeout = 15
# 注意:tcp_tw_recycle 在 NAT 环境下有严重问题(已在新内核中移除)
# 不要使用 tcp_tw_recycle = 1

TCP 缓冲区调优

# 格式:min default max(单位:字节)
# 三个值分别对应自动调优的下限、默认值和上限
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
# 对应的 socket 级别上限也要调大
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216

文件系统参数#

# 系统级最大文件描述符数
# 计算公式参考:(worker进程数 * 每进程连接数 * 2) + 预留
# 高并发 Web 服务建议 100 万以上
fs.file-max = 1048576
# 单进程最大文件描述符数(需要配合 ulimit -n 使用)
fs.nr_open = 1048576
# 不要忘了修改用户级限制
# /etc/security/limits.conf:
# * soft nofile 1048576
# * hard nofile 1048576
# inotify 监控上限(开发环境、文件同步服务常用)
fs.inotify.max_user_watches = 524288
fs.inotify.max_user_instances = 8192

安全相关参数#

# ASLR(地址空间布局随机化)等级
# 0 = 禁用
# 1 = 共享库、mmap 等随机化
# 2 = 在 1 的基础上,堆也随机化(推荐)
kernel.randomize_va_space = 2
# 禁止 setuid 程序产生 core dump,防止敏感信息泄露
fs.suid_dumpable = 0
# 禁止内核指针通过 /proc 暴露(防止信息泄露)
kernel.kptr_restrict = 2
# 限制 dmesg 输出仅 root 可见
kernel.dmesg_restrict = 1

生产环境推荐配置模板#

以下是一个适用于通用 Web 服务的配置模板,可以直接复制到 /etc/sysctl.d/99-production.conf

/etc/sysctl.d/99-production.conf
# 通用 Web 服务器内核参数配置
## 内存管理
vm.swappiness = 10
vm.dirty_background_ratio = 5
vm.dirty_ratio = 15
vm.overcommit_memory = 0
vm.min_free_kbytes = 65536
## 网络优化
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_syncookies = 1
## 文件系统
fs.file-max = 1048576
fs.nr_open = 1048576
fs.inotify.max_user_watches = 524288
## 安全加固
kernel.randomize_va_space = 2
fs.suid_dumpable = 0
kernel.kptr_restrict = 2
kernel.dmesg_restrict = 1

应用配置:

# 检查配置语法
sysctl -p /etc/sysctl.d/99-production.conf
# 确认生效
sysctl --system

调优验证方法#

修改参数后,务必进行验证,确保参数生效且达到预期效果。

1. 检查参数是否生效

# 查看所有已修改的参数
sysctl -a | grep -E "vm.swappiness|net.core.somaxconn|fs.file-max"
# 或逐个检查
sysctl vm.swappiness net.core.somaxconn fs.file-max

2. 压力测试验证

# 使用 sysbench 测试内存性能
sysbench memory --memory-block-size=1M --memory-total-size=10G run
# 使用 iperf3 测试网络吞吐
# 服务端
iperf3 -s
# 客户端
iperf3 -c <server_ip> -t 30 -P 4
# 使用 wrk 或 ab 测试 HTTP 连接处理能力
wrk -t12 -c1000 -d30s http://localhost:8080/

3. 监控关键指标

# 观察内存使用和 swap 活动
watch -n 1 "free -h && echo '---' && vmstat 1 3"
# 观察 TCP 连接状态分布
ss -s
# 观察连接队列溢出情况
netstat -s | grep -i "overflow\|drop"
# 观察文件描述符使用量
cat /proc/sys/fs/file-nr
# 输出:已分配 未使用 最大值
# 如果已分配接近最大值,需要调大 file-max

4. 建立基线对比

调优前记录关键指标作为基线,调优后对比变化:

# 调优前
sysctl -a > /root/sysctl_before.txt
cat /proc/net/sockstat > /root/sockstat_before.txt
# 调优后
sysctl -a > /root/sysctl_after.txt
cat /proc/net/sockstat > /root/sockstat_after.txt
# 对比差异
diff /root/sysctl_before.txt /root/sysctl_after.txt

常见踩坑提醒#

  • 不要盲目照搬配置:网上的”终极优化配置”未必适合你的场景。数据库、Web 服务、容器的最佳配置差异很大。
  • 一次只改一个参数:批量修改后出问题,很难定位是哪个参数导致的。
  • 重启验证:通过 sysctl -w 临时修改后,确认效果再写入配置文件。确保 /etc/sysctl.d/ 下的配置在重启后依然生效。
  • 关注 ulimit 限制fs.file-max 是系统级限制,但进程还受 ulimit -n(默认 1024)约束。两者都需要调整。
  • 容器环境注意:Docker 容器默认共享宿主机的内核参数,部分参数(如 net.core.somaxconn)需要在宿主机或容器运行时中配置。

参考资源#

sysctl-explorer.net

支持与分享

如果这篇文章对你有帮助,欢迎支持作者或分享给更多人

Linux 内核参数调优指南
https://blog.souloss.com/posts/os/linux-kernel-params/
作者
Souloss
发布于
2021-07-22
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

相关文章 智能推荐
1
内核架构全景
Linux内核 宏观视角下的 Linux 内核设计——用户空间与内核空间的隔离、七大子系统概览、执行上下文、内核通用数据结构,以及 /proc 和 /sys 文件系统——内核向用户空间暴露信息的窗口。
2
内核模块
Linux内核 深入解析 Linux 内核模块机制——.ko 文件的 ELF 结构与特殊段、模块加载与卸载完整流程、符号导出与依赖解析、模块参数运行时传参、内核调试接口 printk、模块签名与安全、编写内核模块的最佳实践。
3
内核同步机制
Linux内核 深入解析 Linux 内核同步机制——并发来源与同步必要性、原子操作与内存屏障、自旋锁与互斥锁、读写锁与顺序锁、RCU 读无锁终极方案、Futex 用户态快速互斥锁、lockdep 死锁检测、percpu 变量。
4
Linux 启动流程
Linux内核 深入解析 Linux 启动流程——内核解压与重定位、start_kernel 50+子系统初始化调用链、rest_init 创建 init 与 kthreadd、initramfs 早期用户空间、pivot_root 切换根文件系统、systemd 作为 PID 1 的服务管理、内核命令行参数。
5
系列导读
eBPF 本系列从 eBPF 的底层原理出发,系统讲解 eBPF 虚拟机、验证器、Map 数据结构、Hook 机制、CO-RE 可移植性,再到 XDP/TC 网络处理、LSM 安全、Cilium 实践、Wasm 融合、Kubernetes 集成与生产部署,带你从「听说过 eBPF」进阶到「能用 eBPF 解决真实问题」。