Ubuntu 系统系列 | 第 23 天:性能调优与内核参数——sysctl、ulimit、CPU 频率调节、IO 调度

第 23/30 天

引言

运行 Ubuntu 的服务器不仅要”能用”,更要”跑得快”。无论是高并发的 Web 服务、密集计算的数据分析任务,还是日常桌面体验,系统性能调优都是必不可少的技能。Ubuntu 基于 Linux 内核,提供了丰富的可调参数,从内核网络栈到内存管理,从 CPU 调度策略到磁盘 IO 算法,几乎所有子系统都可以通过内核参数进行微调。

今天,我们将深入 Ubuntu 性能调优的核心领域:

  • sysctl — 运行时内核参数调整的瑞士军刀
  • ulimit — 用户进程资源限制的精细控制
  • CPU 频率调节 — 省电与性能的平衡艺术
  • IO 调度器 — 磁盘读写性能的关键

掌握这些工具,你将能够把一台普通的 Ubuntu 服务器调校成针对特定工作负载优化的高性能机器。


一、sysctl:内核参数的运行时控制

sysctl 是 Linux 内核提供的运行时参数配置接口,允许在不重启系统的情况下修改内核行为。Ubuntu 上的内核参数配置主要通过 /etc/sysctl.conf/etc/sysctl.d/ 目录下的配置文件来管理。

1.1 查看当前内核参数

# 查看所有内核参数(输出量很大,建议配合 grep)
sysctl -a | head -30

# 查看特定参数
sysctl net.ipv4.tcp_tw_reuse
sysctl vm.swappiness
sysctl kernel.hostname

# 使用通配符查询
sysctl -a | grep -E "net.(ipv4|core)."

示例输出:

net.ipv4.tcp_tw_reuse = 0
vm.swappiness = 60
kernel.hostname = ubuntu-server

1.2 临时修改参数(立即生效,重启失效)

# 修改 TCP TIME_WAIT 快速复用
sudo sysctl -w net.ipv4.tcp_tw_reuse=1

# 修改内核缓冲区大小
sudo sysctl -w net.core.rmem_max=16777216
sudo sysctl -w net.core.wmem_max=16777216

# 修改文件句柄上限
sudo sysctl -w fs.file-max=2097152

注意sysctl -w 的修改仅在当前运行期间有效,重启后恢复默认值。要永久生效,需要写入配置文件。

1.3 永久修改参数

将参数写入 /etc/sysctl.conf 或在 /etc/sysctl.d/ 下创建专用配置文件:

# 创建针对 Web 服务器的优化配置
sudo tee /etc/sysctl.d/99-web-server.conf << 'EOF'
# ===== 网络优化 =====
# 启用 TCP BBR 拥塞控制算法
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr

# 增加网络缓冲区
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216

# 启用 TCP 快速打开
net.ipv4.tcp_fastopen = 3

# 提高连接队列长度
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535

# 启用 TIME_WAIT 套接字快速回收和复用
net.ipv4.tcp_tw_reuse = 1

# ===== 内存优化 =====
# 降低 swap 使用倾向(数值越小,越少使用 swap)
vm.swappiness = 10

# 增加文件句柄上限
fs.file-max = 2097152

# ===== 内核安全 =====
# 禁用 IP 转发(除非是路由器)
net.ipv4.ip_forward = 0

# 防范 SYN 洪水攻击
net.ipv4.tcp_syncookies = 1
EOF

# 立即生效
sudo sysctl --system

1.4 常用性能调优参数速查表

参数 默认值 推荐值(高并发场景) 作用
net.core.somaxconn 4096 65535 监听队列最大长度
net.ipv4.tcp_tw_reuse 0 1 允许复用 TIME_WAIT 连接
vm.swappiness 60 10-30 控制 swap 使用倾向
fs.file-max 随内存 2097152+ 系统级文件句柄上限
net.core.rmem_max 212992 16777216 接收缓冲区最大值
net.core.wmem_max 212992 16777216 发送缓冲区最大值
vm.dirty_ratio 20 10-30 脏页占内存百分比触发回写
vm.vfs_cache_pressure 100 50-200 回收缓存 inode/dentry 的倾向

二、ulimit:用户级资源限制

ulimit 是 shell 内置命令,用于控制 shell 进程及其子进程可以使用的系统资源。对于数据库、Web 服务器等需要大量并发连接的应用,正确配置 ulimit 至关重要。

2.1 查看当前限制

# 查看所有资源限制
ulimit -a

# 查看特定限制
ulimit -n   # 打开文件数(文件句柄)
ulimit -u   # 最大用户进程数
ulimit -s   # 堆栈大小

典型输出:

$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 386511
max locked memory       (kbytes, -l) 65536
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 386511
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

看到 open files (-n) 1024 了吗?对于生产环境的数据库或 Web 服务器,这个值远远不够。

2.2 临时修改(当前 shell 会话)

# 将打开文件数限制提升到 65535
ulimit -n 65535

# 验证
ulimit -n

2.3 永久修改(系统级)

对于生产环境,需要修改 /etc/security/limits.conf

# 编辑 limits.conf
sudo tee -a /etc/security/limits.conf << 'EOF'

# ===== 系统级资源限制 =====
# soft = 软限制(当前值),hard = 硬限制(最大值,不可超过)
# * 表示所有用户,@group 表示用户组

# 所有用户:打开文件数
*               soft    nofile          65535
*               hard    nofile          65535

# 所有用户:最大进程数
*               soft    nproc           65535
*               hard    nproc           65535

# 所有用户:堆栈大小
*               soft    stack           65536
*               hard    stack           65536

# 针对特定用户(如 nginx 或 mysql)的更高限制
nginx           soft    nofile          100000
nginx           hard    nofile          100000
mysql           soft    nofile          100000
mysql           hard    nofile          100000
EOF

2.4 systemd 服务限制

对于 systemd 管理的服务(这是 Ubuntu 的默认方式),limits.conf 不生效。需要单独配置服务单元:

# 为 Docker 服务配置资源限制
sudo mkdir -p /etc/systemd/system/docker.service.d
sudo tee /etc/systemd/system/docker.service.d/limits.conf << 'EOF'
[Service]
LimitNOFILE=1048576
LimitNPROC=1048576
LimitSTACK=67108864
EOF

# 重新加载并重启
sudo systemctl daemon-reload
sudo systemctl restart docker

# 验证
cat /proc/$(pidof dockerd)/limits | grep "Max open files"

2.5 实战:检查 Nginx 是否受限于 ulimit

# 查看 Nginx worker 进程的实际限制
cat /proc/$(pgrep -f "nginx: worker" | head -1)/limits | grep -E "Max open files|Max processes"

# 如果限制过低,Nginx 在高并发时会报错:
# 502 Bad Gateway 或 "too many open files"

三、CPU 频率调节:性能与功耗的平衡

Linux 内核的 CPU 频率调节器(cpufreq)允许动态调整 CPU 运行频率,在性能和功耗之间取得平衡。Ubuntu 默认使用 ondemandpowersave 调节器,但对于服务器场景,我们通常需要更激进的性能策略。

3.1 查看当前 CPU 频率和可用调节器

# 安装 cpufreq 工具
sudo apt install -y linux-tools-common cpufrequtils

# 查看 CPU 频率信息
cpufreq-info

# 查看所有可用的调节器
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors

# 查看当前使用的调节器
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

示例输出:

$ cpufreq-info
analyzing CPU 0:
  driver: intel_pstate
  CPUs which run at the same hardware frequency: 0
  hardware limits: 800 MHz - 4.20 GHz
  available cpufreq governors: performance, powersave
  current policy: frequency should be within 800 MHz and 4.20 GHz.
                  The governor "powersave" may decide which speed to use
                  within this range.
  current CPU frequency: 1.20 GHz (asserted by call to hardware)

3.2 常见的 CPU 频率调节器

调节器 策略 适用场景
performance 始终运行在最高频率 数据库、实时计算、低延迟服务
powersave 始终运行在最低频率 笔记本电脑、省电场景
ondemand 根据负载动态调整(默认) 通用桌面、轻量服务器
conservative 缓慢调整频率 需要稳定性能的桌面
schedutil 基于调度器提示调整 新内核推荐,兼顾性能和功耗

3.3 设置性能模式

# 方法一:临时切换(立即生效,重启恢复)
echo performance | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor

# 验证
cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor | sort -u

3.4 永久设置性能模式

在 Ubuntu 上使用 systemd 服务:

# 创建 systemd 服务
sudo tee /etc/systemd/system/cpufreq-performance.service << 'EOF'
[Unit]
Description=Set CPU governor to performance
After=multi-user.target

[Service]
Type=oneshot
ExecStart=/bin/bash -c 'echo performance | tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor'

[Install]
WantedBy=multi-user.target
EOF

# 启用并启动
sudo systemctl enable cpufreq-performance.service
sudo systemctl start cpufreq-performance.service

3.5 使用 tuned 自动优化

tuned 是 Red Hat 开发的系统调优工具,Ubuntu 也支持。它提供了预设的调优方案(profile),一键应用:

# 安装 tuned
sudo apt install -y tuned

# 查看可用方案
tuned-adm list

# 查看当前活跃方案
tuned-adm active

# 切换到吞吐量优化方案
sudo tuned-adm profile throughput-performance

# 切换到低延迟方案
sudo tuned-adm profile latency-performance

# 自定义方案
sudo tuned-adm profile custom

tuned 的预设方案:
balanced — 平衡性能与功耗(默认)
powersave — 最大省电
throughput-performance — 高吞吐量(服务器推荐)
latency-performance — 低延迟(数据库推荐)
network-latency — 网络延迟优化
virtual-host — 虚拟化宿主机
virtual-guest — 虚拟机


四、IO 调度器:磁盘性能的关键

IO 调度器负责决定磁盘读写请求的排队顺序,直接影响存储系统的吞吐量和延迟。Ubuntu 使用 mq-deadlinenone 作为默认调度器(取决于内核版本),但对于不同的存储介质,最佳调度器也不同。

4.1 查看当前 IO 调度器

# 查看所有磁盘的调度器
cat /sys/block/sda/queue/scheduler

# 更详细的信息
for disk in /sys/block/sd*; do
    echo "$(basename $disk): $(cat $disk/queue/scheduler)"
done

示例输出:

$ cat /sys/block/sda/queue/scheduler
[mq-deadline] kyber bfq none

方括号 [] 中的是当前活跃的调度器。

4.2 三大 IO 调度器对比

调度器 特点 最佳场景
mq-deadline 保证每个请求不超过 deadline,公平性好 传统 HDD、通用场景
bfq 基于进程的公平排队,防止 IO 饥饿 桌面环境、多用户共享
kyber 自适应延迟目标,轻量级 NVMe SSD、低延迟场景
none 无调度器,直接传递给硬件 高性能 NVMe SSD、硬件 RAID

4.3 修改 IO 调度器

# 临时修改(立即生效)
echo bfq | sudo tee /sys/block/sda/queue/scheduler

# 验证
cat /sys/block/sda/queue/scheduler

4.4 永久修改 IO 调度器

使用 udev 规则(推荐):

# 创建 udev 规则
sudo tee /etc/udev/rules.d/60-iosched.rules << 'EOF'
# NVMe SSD — 使用 kyber 或 none 调度器
ACTION=="add|change", KERNEL=="nvme[0-9]*n[0-9]*", ATTR{queue/scheduler}="kyber"

# SATA SSD — 使用 mq-deadline
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="mq-deadline"

# HDD — 使用 bfq 或 mq-deadline
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="1", ATTR{queue/scheduler}="bfq"
EOF

# 重载 udev 规则
sudo udevadm control --reload-rules
sudo udevadm trigger

4.5 其他磁盘 IO 优化参数

# 调整 IO 队列深度(NVMe 建议调大)
echo 1024 | sudo tee /sys/block/nvme0n1/queue/nr_requests

# 启用磁盘写入缓存(默认已启用)
sudo hdparm -W1 /dev/sda

# 调整预读大小(顺序读场景建议增大)
# 默认 256,数据库建议 4096
sudo blockdev --setra 4096 /dev/sda

# 查看当前预读值
sudo blockdev --getra /dev/sda

五、综合实战:打造高性能 Ubuntu 服务器

下面是一个完整的性能调优方案,适用于高并发 Web 服务或数据库服务器。

5.1 一键调优脚本

#!/bin/bash
# ubuntu-performance-tune.sh — Ubuntu 服务器性能调优脚本

set -euo pipefail

echo "=== Ubuntu 服务器性能调优 ==="

# 1. 内核参数优化
echo "[1/5] 配置内核参数..."
cat > /etc/sysctl.d/99-server-tune.conf << 'CONF'
# 网络优化
net.core.somaxconn = 65535
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fastopen = 3
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216

# 内存优化
vm.swappiness = 10
vm.dirty_ratio = 20
vm.dirty_background_ratio = 5
vm.vfs_cache_pressure = 50

# 文件系统
fs.file-max = 2097152
CONF
sysctl --system

# 2. 用户资源限制
echo "[2/5] 配置用户资源限制..."
cat >> /etc/security/limits.conf << 'LIMITS'
*               soft    nofile          65535
*               hard    nofile          65535
*               soft    nproc           65535
*               hard    nproc           65535
LIMITS

# 3. CPU 性能模式
echo "[3/5] 设置 CPU 性能模式..."
echo performance | tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor

# 4. IO 调度器优化
echo "[4/5] 优化 IO 调度器..."
for disk in /sys/block/nvme*; do
    [ -d "$disk" ] && echo kyber > "$disk/queue/scheduler" 2>/dev/null
done
for disk in /sys/block/sd*; do
    [ -d "$disk" ] && echo mq-deadline > "$disk/queue/scheduler" 2>/dev/null
done

# 5. 安装 tuned 并应用优化方案
echo "[5/5] 安装 tuned..."
apt-get install -y tuned 2>/dev/null
tuned-adm profile throughput-performance 2>/dev/null || true

echo "=== 调优完成,重启后部分配置生效 ==="
echo "查看当前状态:"
sysctl vm.swappiness net.core.somaxconn fs.file-max

5.2 压测验证

调优后,使用工具进行基准测试验证效果:

# 安装测试工具
sudo apt install -y sysbench fio iperf3

# CPU 基准测试
sysbench cpu run

# 内存基准测试
sysbench memory run

# 磁盘 IO 基准测试(随机读写 4K)
fio --name=randwrite --ioengine=libaio --iodepth=64 --rw=randwrite 
    --bs=4k --direct=1 --size=1G --numjobs=4 --runtime=30 
    --group_reporting

# 磁盘 IO 基准测试(顺序读写 1M)
fio --name=seqwrite --ioengine=libaio --iodepth=64 --rw=write 
    --bs=1M --direct=1 --size=1G --numjobs=4 --runtime=30 
    --group_reporting

# 网络基准测试(需要服务端和客户端)
iperf3 -c <server_ip> -t 30 -P 4

六、注意事项与常见问题

6.1 调优前先做基准测试

永远不要盲目调优。调优前记录基准性能数据,每次修改后重新测试,确认改动带来了正向收益。

# 记录修改前的关键参数
echo "=== 调优前基线 ===" > /tmp/baseline.txt
echo "--- CPU ---" >> /tmp/baseline.txt
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor >> /tmp/baseline.txt
echo "--- IO 调度器 ---" >> /tmp/baseline.txt
cat /sys/block/sda/queue/scheduler >> /tmp/baseline.txt
echo "--- sysctl ---" >> /tmp/baseline.txt
sysctl vm.swappiness net.core.somaxconn fs.file-max >> /tmp/baseline.txt
echo "--- ulimit ---" >> /tmp/baseline.txt
ulimit -n >> /tmp/baseline.txt

6.2 云环境特殊注意事项

  • AWS/GCP/Azure 等云 VM:CPU 频率调节器通常由虚拟化层控制,cpufreq 设置可能不生效
  • 云磁盘性能:IO 调度器对云环境(EBS、Persistent Disk)影响较小,使用 nonemq-deadline 即可
  • 突发性能:vCPU 有突发积分机制(如 AWS T 系列),长时高负载会耗尽积分

6.3 常见问题排查

Q: 修改 ulimit 后不生效?
A: 检查是否使用了 PAM 模块。确认 /etc/pam.d/common-session 包含 pam_limits.so

grep pam_limits.so /etc/pam.d/common-session
# 如果没有,添加: session required pam_limits.so

Q: sysctl 参数修改后重启失效?
A: 检查配置文件是否在 /etc/sysctl.d/ 中,且命名以 .conf 结尾。运行 sysctl --system 确认加载。

Q: NVMe 磁盘应使用哪个 IO 调度器?
A: 对于现代 NVMe SSD,none(不调度,直接硬件处理)通常性能最佳。kyber 是次优选择。

Q: tuned 和手动 sysctl 冲突吗?
A: tuned 会覆盖 /etc/sysctl.d/ 中的设置。如果同时使用,确保 tuned profile 包含你的调优参数,或通过 tuned-adm profile custom 自定义。


总结

今天我们从四个维度深入探讨了 Ubuntu 性能调优:

维度 核心工具 关键参数
内核参数 sysctl vm.swappiness, net.core.somaxconn, fs.file-max
用户资源 ulimit, limits.conf, systemd nofile, nproc, stack
CPU 频率 cpufreq, tuned performance 调节器
IO 调度 udev rules, queue/scheduler none, mq-deadline, bfq, kyber

性能调优的核心原则:测量 → 调整 → 再测量。不要凭感觉调参数,一切以数据为准。

下期预告:第 24 天——虚拟化技术:KVM/QEMU、libvirt、Virt-Manager 虚拟化方案。我们将从零开始搭建 Ubuntu 上的虚拟化环境,创建和管理虚拟机,实现资源隔离与灵活分配。


完整系列目录

天数 主题 状态
第 1 天 Ubuntu 简介与版本选择 ✅ 已发布
第 2 天 手把手安装 Ubuntu ✅ 已发布
第 3 天 Ubuntu 桌面环境初探 ✅ 已发布
第 4 天 Ubuntu 终端基础 ✅ 已发布
第 5 天 用户与权限管理 ✅ 已发布
第 6 天 软件包管理 ✅ 已发布
第 7 天 文件与文本操作 ✅ 已发布
第 8 天 系统服务管理 ✅ 已发布
第 9 天 磁盘与文件系统管理 ✅ 已发布
第 10 天 网络配置与管理 ✅ 已发布
第 11 天 进程管理与监控 ✅ 已发布
第 12 天 计划任务与自动化 ✅ 已发布
第 13 天 备份与恢复策略 ✅ 已发布
第 14 天 系统更新与升级管理 ✅ 已发布
第 15 天 SSH 远程管理与安全加固 ✅ 已发布
第 16 天 Web 服务器搭建 ✅ 已发布
第 17 天 数据库服务器部署 ✅ 已发布
第 18 天 Docker 在 Ubuntu 上的安装与容器化管理 ✅ 已发布
第 19 天 文件共享服务 ✅ 已发布
第 20 天 监控与告警系统 ✅ 已发布
第 21 天 邮件服务器基础 ✅ 已发布
第 22 天 系统安全加固 ✅ 已发布
第 23 天 性能调优与内核参数 📝 今日发布
第 24 天 虚拟化技术:KVM/QEMU、libvirt、Virt-Manager ⏳ 待发布
第 25 天 容器编排入门:Docker Compose 与 Kubernetes ⏳ 待发布
第 26 天 高可用与负载均衡:Keepalived、HAProxy ⏳ 待发布
第 27 天 Ubuntu 自动部署:PXE、Preseed、Cloud-init ⏳ 待发布
第 28 天 故障排查实战 ⏳ 待发布
第 29 天 Ubuntu 社区与文档 ⏳ 待发布
第 30 天 30 天回顾:从入门到精通的学习路线图 ⏳ 待发布
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片快捷回复

    暂无评论内容