在完成系统安全加固、监控告警与高可用架构的搭建之后,运维工作便进入了一个更深层次的阶段——性能调优。一台 Ubuntu 服务器能否在高并发、大数据量下稳定运行,除了依赖硬件资源,更取决于内核参数是否合理。很多线上故障,表面上表现为 CPU 飙高、内存不足或磁盘 IO 阻塞,追根溯源往往是默认的内核参数并不适合当前业务场景。
今天我们将系统讲解 Ubuntu 内核调优的核心思路,重点围绕 sysctl 这一内核参数管理工具,深入剖析 CPU、内存、IO 三大资源方向的常见参数,并给出可直接落地的配置示例与验证方法。

核心概念:内核参数与 sysctl 的工作原理
Linux 内核在运行时会暴露大量可调节的参数,这些参数分散在 /proc/sys/ 目录下,每个文件对应一个内核配置项。例如 /proc/sys/net/ipv4/ip_forward 控制是否开启 IP 转发,/proc/sys/vm/swappiness 控制内核使用交换分区的倾向。
sysctl 是操作这些参数的官方工具,它允许我们即时查看和修改内核参数。参数名采用点号分隔的命名方式,与 /proc/sys/ 下的目录结构一一对应,只需把路径中的斜杠替换为点即可。
# 查看单个参数
sysctl net.ipv4.ip_forward
cat /proc/sys/net/ipv4/ip_forward
# 查看所有参数
sysctl -a
# 临时修改参数(重启后失效)
sudo sysctl -w net.ipv4.ip_forward=1
sysctl 的配置通常写在 /etc/sysctl.conf 以及 /etc/sysctl.d/ 目录下的 *.conf 文件中,其中 /etc/sysctl.d/ 里的文件会被 systemd-sysctl 服务统一加载,优先级更高,也更便于分模块管理。
# 重新加载配置使其立即生效
sudo sysctl --system
# 或直接读取指定文件
sudo sysctl -p /etc/sysctl.d/99-tuning.conf
调优前必须建立基线:用 top、vmstat、iostat、sar 等工具采集系统在典型负载下的 CPU、内存、IO、网络指标,调优后再对比。盲目修改参数不仅无益,反而可能引发系统不稳定。
实战步骤:三大资源方向的参数优化
一、CPU 调度与负载相关
CPU 方向的内核参数主要影响进程调度、负载均衡与上下文切换行为,多用于多核服务器和容器场景。
# 查看当前 CPU 相关参数
sysctl kernel.sched_child_runs_first kernel.sched_rt_runtime_us
# 开启内核抢占优化(桌面/交互场景可选)
sysctl kernel.sched_autogroup_enabled=1
对于运行大量短生命周期进程的 Web 服务,适当减少 CFS 调度器的最小粒度与唤醒抢占延迟,可以降低请求延迟抖动。
cat >> /etc/sysctl.d/99-tuning.conf <<'EOF'
# CPU 调度调优
kernel.sched_min_granularity_ns = 2000000
kernel.sched_wakeup_granularity_ns = 1500000
kernel.sched_migration_cost_ns = 500000
EOF
二、内存管理与 swappiness
内存方向最核心的参数是 vm.swappiness,它决定内核在物理内存与交换分区之间的取舍,取值范围 0 到 100。值越大越倾向于使用 swap,值越小越倾向于保留在物理内存。对于数据库这类不希望被交换出去的场景,通常把 swappiness 调到较低值。
# 查看当前 swappiness
cat /proc/sys/vm/swappiness
# 临时设置为 10(生产常见值)
sudo sysctl -w vm.swappiness=10
同时,vm.vfs_cache_pressure 控制内核回收目录项和 inode 缓存(dentry/inode cache)的激进程度,默认 100,适当调低可保留更多文件系统元数据缓存,提升文件频繁访问场景的性能。
cat >> /etc/sysctl.d/99-tuning.conf <<'EOF'
# 内存调优
vm.swappiness = 10
vm.vfs_cache_pressure = 50
vm.dirty_ratio = 15
vm.dirty_background_ratio = 5
EOF
其中 vm.dirty_ratio 与 vm.dirty_background_ratio 控制脏页写回时机:后台写回阈值设低一点,可避免瞬时大量脏页导致 IO 尖峰。
三、磁盘 IO 与文件系统
IO 方向的调优更多依赖 IO 调度器(scheduler)的选择,这一点通过 sysctl 无法直接完成,而要通过 /sys/block/ 下的接口设置,但也属于系统调优的重要组成部分。
# 查看磁盘使用的调度器
cat /sys/block/sda/queue/scheduler
# 固态硬盘建议使用 none(即 noop/mq-deadline 之上的直通模式)
echo none | sudo tee /sys/block/sda/queue/scheduler
# 增大预读,提升顺序读吞吐
sudo blockdev --setra 1024 /dev/sda
对于 MySQL、PostgreSQL 等数据库,推荐使用 deadline 或 mq-deadline 调度器,并配合 vm.dirty 系列参数,可有效缓解写入抖动。
四、网络与文件描述符
网络方向常见参数包括连接数、缓冲区大小与文件描述符上限,直接决定高并发服务能否扛住流量。
cat >> /etc/sysctl.d/99-tuning.conf <<'EOF'
# 网络与文件描述符
fs.file-max = 2097152
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 15
EOF
修改 sysctl 之外,还需同步调整系统的 ulimit 与 systemd 服务的 LimitNOFILE,否则内核层放开了限制,用户态进程仍会被卡住。
# 查看当前进程可打开文件数限制
ulimit -n
# 修改 systemd 服务限制(以 nginx 为例)
sudo systemctl edit nginx
[Service]
LimitNOFILE=65535
常见问题
问:修改了 /etc/sysctl.conf 为什么不生效?
答:可能是没有执行 sudo sysctl –system 或 sudo sysctl -p 重新加载,也可能参数写在了被更高优先级文件覆盖的位置。建议统一放在 /etc/sysctl.d/99-tuning.conf,再用 sysctl -p 指定加载验证。
问:swappiness 设置为 0 是不是意味着完全不用 swap?
答:不是。0 表示尽可能避免使用 swap,但在内存极度紧张时内核仍可能交换,只是倾向最低。真正想禁用交换需关闭 swap 分区或使用 cgroup 的 memory.swappiness。
问:调优后如何判断是否有效?
答:用相同负载压测,对比调优前后的平均响应时间、CPU 使用率、上下文切换次数、缺页中断(vmstat 的 si/so 列)等指标。任何单一参数的变化都应以数据为准。
总结
内核调优是一个基于数据、循序渐进的过程。sysctl 为我们提供了统一、可持久化的参数管理入口,CPU 调度、内存 swappiness 与脏页写回、磁盘 IO 调度器、网络缓冲区与文件描述符上限,是四个最值得优先关注的方向。建议将调优参数按模块拆分成多个 conf 文件,纳入版本管理,并在每次变更前做好基线记录与回滚预案。
下一期(第 25 天),我们将进入「高可用与负载均衡——Keepalived 与 HAProxy 实战」,一起搭建真正具备故障切换能力的生产级服务入口,敬请期待。















暂无评论内容