Linux 系统调优全指南:从基础到高级实践
Linux 凭借其稳定性、灵活性和开源特性,广泛应用于服务器、嵌入式设备、云计算等场景。然而,默认的 Linux 系统配置往往是“通用型”的,难以满足特定 workload(如高并发 web 服务、数据库、实时计算)的性能需求。系统调优的目标是通过调整内核参数、硬件资源分配、应用配置等,最大化资源利用率、减少瓶颈、提升响应速度,并增强系统稳定性。
本文将从“系统诊断→分层调优→验证监控”的流程出发,详细介绍 Linux 调优的核心领域(CPU、内存、磁盘 I/O、网络等),结合最佳实践和具体案例,帮助读者系统性掌握调优方法。
目录#
- 调优前的准备:系统诊断与工具
- CPU 调优:调度、频率与隔离
- 内存调优:缓存、交换与 OOM 管理
- 磁盘 I/O 调优:文件系统、调度器与 mount 选项
- 网络调优:TCP/IP 栈与接口优化
- 内核参数调优:sysctl 与持久化配置
- 应用级调优:以 Nginx 和 MySQL 为例
- 调优验证与监控:从基准测试到持续观测
- 调优最佳实践与注意事项
- 参考资料
1. 调优前的准备:系统诊断与工具#
调优的第一步是明确瓶颈。盲目修改参数可能导致性能下降甚至系统不稳定。需通过工具收集关键指标,定位 CPU、内存、磁盘 I/O 或网络中的瓶颈。
1.1 核心诊断工具#
| 工具 | 用途 | 关键指标示例 |
|---|---|---|
top/htop | 实时进程监控 | CPU 使用率(%us/%sy/%id)、内存占用 |
vmstat | 系统整体资源统计(CPU/内存/I/O) | r(运行队列长度)、si/so(swap 活动) |
iostat | 磁盘 I/O 性能 | %util(设备利用率)、r/s/w/s(读写次数) |
sar | 系统活动报告(支持历史数据) | sar -u 5(每 5 秒输出 CPU 统计) |
perf | 内核级性能分析(函数调用、中断等) | perf top(热点函数分析) |
ss/netstat | 网络连接与吞吐量监控 | ESTABLISHED 连接数、recv_q/send_q |
free | 内存使用情况 | buff/cache(缓存占用)、swap 使用量 |
1.2 诊断示例#
示例 1:用 vmstat 定位 CPU 瓶颈#
vmstat 2 5 # 每 2 秒输出 1 次,共 5 次输出关键指标:
r(运行队列长度):若持续 > CPU 核心数,说明 CPU 饱和;us(用户态 CPU 占比):高则可能是应用逻辑问题(如循环效率低);sy(内核态 CPU 占比):高则可能是系统调用频繁(如频繁 I/O)。
示例 2:用 iostat 检测磁盘 I/O 瓶颈#
iostat -x 2 # 每 2 秒输出磁盘详细统计输出关键指标:
%util(设备利用率):接近 100% 表示磁盘 I/O 饱和;await(平均 I/O 等待时间,毫秒):>20ms 可能存在 I/O 延迟问题。
2. CPU 调优:调度、频率与隔离#
CPU 是系统的“大脑”,其性能瓶颈常表现为高负载、调度延迟或资源争用。调优需围绕调度策略、频率控制、NUMA 架构适配展开。
2.1 CPU 调度器:CFS 与实时调度#
Linux 默认使用 CFS(Completely Fair Scheduler,完全公平调度器),适用于通用场景。若需低延迟(如实时任务),可切换至 SCHED_FIFO 或 SCHED_RR 实时调度器。
CFS 调优参数(通过 /proc/sys/kernel/sched_*)#
sched_latency_ns:调度周期(默认 6ms),任务数多时可增大(如 10ms)以减少调度开销;sched_min_granularity_ns:任务最小运行时间(默认 0.75ms),高优先级任务可减小以提升响应速度。
临时修改:
echo 10000000 > /proc/sys/kernel/sched_latency_ns # 调度周期设为 10ms2.2 CPU 频率与功耗控制#
CPU 频率通过 cpufreq 子系统 管理,核心是“调度器”(governor)。常见调度器:
performance:固定最高频率,优先性能(服务器推荐);powersave:固定最低频率,优先节能(笔记本/嵌入式);ondemand:负载高时提频,低时降频(平衡型)。
配置方法#
- 查看当前调度器:
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor- 临时切换为
performance:
echo performance | tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor- 持久化(以 systemd 为例):
创建
/etc/systemd/system/cpufreq.service:
[Unit]
Description=Set CPU governor to performance
[Service]
Type=oneshot
ExecStart=/bin/sh -c "echo performance | tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor"
[Install]
WantedBy=multi-user.target启用:systemctl enable --now cpufreq
2.3 NUMA 架构与 CPU 隔离#
NUMA(非统一内存访问) 架构中,CPU 访问本地内存速度远快于远程内存。需避免跨节点内存访问。
工具:numactl#
numactl --hardware # 查看 NUMA 节点信息
numactl --cpunodebind=0 --membind=0 ./app # 将 app 绑定到节点 0 的 CPU 和内存CPU 隔离(实时场景):通过内核启动参数隔离 CPU 核心,避免普通进程干扰实时任务。
修改 /etc/default/grub,添加:
GRUB_CMDLINE_LINUX_DEFAULT="isolcpus=2,3 nohz_full=2,3 rcu_nocbs=2,3"更新 grub:update-grub(Ubuntu/Debian)或 grub2-mkconfig -o /boot/grub2/grub.cfg(CentOS/RHEL)。
3. 内存调优:缓存、交换与 OOM 管理#
内存调优的核心是 减少 swap 使用、优化缓存效率、避免 OOM(内存溢出)。
3.1 Swap 策略:swappiness 与缓存回收#
swappiness 控制内核交换内存的积极性(0-100,默认 60):
- 低
swappiness(如 0-10):优先回收缓存(buff/cache),减少 swap 写入(适合内存充足场景); - 高
swappiness(如 80-100):优先交换不活跃进程(适合内存紧张场景)。
临时调整:#
sysctl vm.swappiness=10 # 减少 swap 使用持久化:#
编辑 /etc/sysctl.conf 或 /etc/sysctl.d/99-swap.conf:
vm.swappiness=103.2 透明大页(THP):性能与延迟的权衡#
THP(Transparent Huge Pages) 自动将小内存页(4KB)合并为大页(2MB/1GB),减少 TLB(页表缓存) miss,提升内存访问效率。但合并/拆分可能导致延迟毛刺(如数据库场景)。
查看状态:#
cat /sys/kernel/mm/transparent_hugepage/enabled
# [always] madvise never # 表示默认启用禁用 THP(数据库推荐,如 MySQL/PostgreSQL):#
临时禁用:
echo never > /sys/kernel/mm/transparent_hugepage/enabled持久化(通过 systemd 服务或 rc.local):
echo "echo never > /sys/kernel/mm/transparent_hugepage/enabled" >> /etc/rc.local
chmod +x /etc/rc.local3.3 OOM 杀手:避免关键进程被终止#
OOM 杀手(Out-of-Memory Killer)在内存耗尽时会终止进程,需保护核心服务(如 sshd、数据库)。
调整 OOM 优先级:#
通过 /proc/[pid]/oom_score_adj 调整(范围 -1000 ~ 1000,值越低越不易被 kill):
# 保护 sshd(假设 pid=1234)
echo -1000 > /proc/1234/oom_score_adj永久配置(systemd 服务):#
在服务文件中添加 OOMScoreAdjust=-1000,如 /etc/systemd/system/mysql.service:
[Service]
OOMScoreAdjust=-10004. 磁盘 I/O 调优:文件系统、调度器与 mount 选项#
磁盘 I/O 是常见瓶颈,调优需从 文件系统选择、I/O 调度器、mount 选项 三方面入手。
4.1 文件系统选择与优化#
不同文件系统特性不同,需根据场景选择:
- ext4:成熟稳定,适合中小文件、通用场景;
- XFS:高性能,支持大文件/大容量,适合视频存储、日志服务器;
- Btrfs:支持快照、RAID,适合需要数据恢复的场景;
- ZFS:强校验、压缩、快照,适合数据可靠性优先的场景(如存储服务器)。
XFS 调优示例(格式化时):#
mkfs.xfs -f -i size=512 -l size=128m /dev/sdb1 # inode 大小 512B,日志大小 128MB4.2 I/O 调度器:减少延迟与提升吞吐量#
I/O 调度器决定磁盘请求的处理顺序,需根据设备类型选择:
- noop:简单队列,适合 SSD/RAID 或虚拟机(底层设备已优化);
- deadline:按请求 deadlines 排序,适合低延迟场景(数据库);
- cfq(默认):公平队列,适合机械硬盘(HDD)。
临时切换调度器(以 sda 为例):#
echo deadline > /sys/block/sda/queue/scheduler持久化(内核启动参数):#
修改 /etc/default/grub,添加 elevator=deadline:
GRUB_CMDLINE_LINUX_DEFAULT="elevator=deadline"更新 grub 并重启。
4.3 mount 选项:减少不必要的 I/O#
通过 /etc/fstab 配置 mount 选项,可显著减少磁盘写入:
noatime:禁用文件访问时间记录(最有效优化);nodiratime:禁用目录访问时间记录;barrier=0:关闭写屏障(提升性能,SSD/RAID 卡有电池时可用,否则可能丢数据);discard:启用 TRIM(SSD 必开,延长寿命)。
示例 fstab 配置(ext4 分区):#
UUID=xxx /data ext4 defaults,noatime,nodiratime,discard 0 04.4 SSD 优化:TRIM 与对齐#
-
TRIM:通知 SSD 擦除无效数据块,避免性能下降。
临时执行:fstrim /data
持久化(systemd 定时任务):启用fstrim.timer:systemctl enable --now fstrim.timer # 每周自动执行 TRIM -
分区对齐:确保分区起始位置对齐 SSD 块大小(如 4KB),可通过
parted的align-check验证:parted /dev/sda align-check optimal 1 # 检查第 1 分区对齐
5. 网络调优:TCP/IP 栈与接口优化#
网络调优目标是 提升吞吐量、降低延迟、优化连接管理,核心是调整 TCP/IP 参数与接口配置。
5.1 TCP 缓冲区:提升吞吐量#
TCP 发送/接收缓冲区过小会限制吞吐量,需调大默认值:
net.core.rmem_max:最大接收缓冲区;net.core.wmem_max:最大发送缓冲区;net.ipv4.tcp_rmem:接收缓冲区默认值(min, default, max);net.ipv4.tcp_wmem:发送缓冲区默认值(min, default, max)。
优化配置(高带宽场景):#
编辑 /etc/sysctl.d/99-network.conf:
net.core.rmem_max=67108864 # 64MB
net.core.wmem_max=67108864
net.ipv4.tcp_rmem=4096 87380 67108864
net.ipv4.tcp_wmem=4096 65536 67108864
net.ipv4.tcp_moderate_rcvbuf=1 # 启用自动调整缓冲区生效:sysctl -p /etc/sysctl.d/99-network.conf
5.2 拥塞控制算法:BBR 提升高延迟网络性能#
默认拥塞控制算法 cubic 在高带宽延迟积(BDP)网络(如跨地域传输)表现不佳,而 BBR(Bottleneck Bandwidth and RTT) 可充分利用带宽。
启用 BBR(内核 ≥ 4.9):#
sysctl net.ipv4.tcp_congestion_control=bbr
# 持久化:添加到 /etc/sysctl.d/99-network.conf5.3 连接管理:减少 TIME_WAIT 与 SYN 攻击风险#
-
TIME_WAIT 连接过多:占用端口资源,可通过
tcp_tw_reuse复用连接:net.ipv4.tcp_tw_reuse=1 # 允许复用 TIME_WAIT 连接(仅客户端) net.ipv4.tcp_tw_recycle=0 # 禁用快速回收(NAT 环境可能丢包) net.ipv4.tcp_fin_timeout=30 # TIME_WAIT 超时时间(默认 60s) -
SYN 洪水攻击防护:启用
tcp_syncookies:net.ipv4.tcp_syncookies=1
5.4 网络接口优化:MTU 与硬件卸载#
-
MTU(最大传输单元):增大 MTU(如 9000,即“巨帧”)可减少分片,提升吞吐量(需网络设备支持):
ip link set eth0 mtu 9000 -
硬件卸载:启用网卡的 TSO(TCP 分段卸载)、GSO(通用分段卸载),减轻 CPU 负担:
ethtool -K eth0 tso on gso on # 检查支持:ethtool -k eth0
6. 内核参数调优:sysctl 与持久化配置#
内核参数是调优的核心,通过 sysctl 工具管理,配置文件通常位于 /etc/sysctl.conf 或 /etc/sysctl.d/ 目录。
6.1 常用核心参数#
| 参数 | 作用 | 推荐值(示例) |
|---|---|---|
vm.swappiness | swap 使用积极性 | 10(内存充足场景) |
vm.vfs_cache_pressure | 内核回收缓存的倾向(值越低缓存越优先) | 50(优先保留缓存) |
net.core.somaxconn | 最大监听队列长度(backlog) | 1024(高并发服务) |
net.ipv4.ip_local_port_range | 本地端口范围 | 1024 65535(增加可用端口) |
fs.file-max | 系统最大打开文件数 | 1000000(高并发场景) |
6.2 持久化配置步骤#
- 创建自定义配置文件(避免修改默认
sysctl.conf):
vim /etc/sysctl.d/99-custom.conf- 添加参数:
vm.swappiness=10
net.core.somaxconn=1024
fs.file-max=1000000- 生效配置:
sysctl -p /etc/sysctl.d/99-custom.conf7. 应用级调优:以 Nginx 和 MySQL 为例#
系统调优需与应用配置配合,才能发挥最大效果。以下以常用服务为例说明。
7.1 Nginx 调优#
Nginx 性能依赖于 ** worker 进程数、连接数、缓存配置**:
worker_processes auto; # 自动设置为 CPU 核心数
worker_connections 10240; # 每个 worker 最大连接数(需系统打开文件数支持)
http {
# 开启 TCP 复用(减少 TIME_WAIT)
tcp_nopush on;
tcp_nodelay on;
# 连接超时
keepalive_timeout 65;
keepalive_requests 100; # 单个连接处理的请求数
# 缓存配置(静态资源)
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=STATIC:10m inactive=7d max_size=10g;
}7.2 MySQL 调优#
MySQL 性能核心是 内存分配(InnoDB 缓存)、连接数、I/O 配置:
[mysqld]
# 内存:InnoDB 缓存(占可用内存 50-70%)
innodb_buffer_pool_size=4G
# 连接数
max_connections=1000
wait_timeout=60 # 空闲连接超时
# I/O 优化(SSD 场景)
innodb_flush_log_at_trx_commit=2 # 每秒刷盘(权衡一致性与性能)
innodb_log_file_size=512M # 日志文件大小(增大减少切换开销)
innodb_io_capacity=2000 # I/O 能力上限(SSD 设为 2000+)8. 调优验证与监控:从基准测试到持续观测#
调优后需验证效果,避免“调优反降效”。
8.1 基准测试工具#
-
CPU/内存:
sysbenchsysbench cpu --cpu-max-prime=20000 run # CPU 性能测试 sysbench memory --memory-block-size=1M --memory-total-size=1G run # 内存带宽测试 -
磁盘 I/O:
fiofio --name=randwrite --rw=randwrite --bs=4k --direct=1 --size=1G --numjobs=4 --runtime=60 # 随机写测试 -
网络:
iperf3iperf3 -s # 服务端 iperf3 -c <server_ip> -t 60 # 客户端测试吞吐量
8.2 持续监控#
通过 Prometheus + Grafana 或 Zabbix 监控关键指标,确保调优效果稳定:
- 监控项:CPU 使用率、内存使用率、磁盘 I/O %util、网络吞吐量、应用响应时间;
- 告警阈值:如 CPU
us+sy > 80%、磁盘%util > 90%触发告警。
9. 调优最佳实践与注意事项#
- 备份优先:修改关键配置前备份(如
/etc/sysctl.conf、/etc/fstab); - 增量调优:一次修改一个参数,测试后再调整下一个;
- 场景适配:调优无“银弹”,需结合具体 workload(如数据库 vs web 服务);
- 避免过度调优:默认参数通常经过优化,非瓶颈领域无需修改;
- 文档化:记录每次调优的参数、原因、效果,便于回溯。
10. 参考资料#
- Linux 内核文档
- Red Hat 性能调优指南
- Linux Performance(Brendan Gregg 著作)
- MySQL 官方调优文档
- Nginx 性能调优最佳实践
通过本文的步骤,你可以系统性地诊断 Linux 系统瓶颈,并从 CPU、内存、磁盘、网络等维度进行调优。记住:调优是一个“观察→调整→验证”的循环,持续监控和迭代优化才是关键。