第 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 默认使用 ondemand 或 powersave 调节器,但对于服务器场景,我们通常需要更激进的性能策略。
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-deadline 或 none 作为默认调度器(取决于内核版本),但对于不同的存储介质,最佳调度器也不同。
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)影响较小,使用
none或mq-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 天回顾:从入门到精通的学习路线图 | ⏳ 待发布 |















暂无评论内容