Linux 系统调优全指南:从基础到高级实践

Linux 凭借其稳定性、灵活性和开源特性,广泛应用于服务器、嵌入式设备、云计算等场景。然而,默认的 Linux 系统配置往往是“通用型”的,难以满足特定 workload(如高并发 web 服务、数据库、实时计算)的性能需求。系统调优的目标是通过调整内核参数、硬件资源分配、应用配置等,最大化资源利用率、减少瓶颈、提升响应速度,并增强系统稳定性。

本文将从“系统诊断→分层调优→验证监控”的流程出发,详细介绍 Linux 调优的核心领域(CPU、内存、磁盘 I/O、网络等),结合最佳实践和具体案例,帮助读者系统性掌握调优方法。

目录#

  1. 调优前的准备:系统诊断与工具
  2. CPU 调优:调度、频率与隔离
  3. 内存调优:缓存、交换与 OOM 管理
  4. 磁盘 I/O 调优:文件系统、调度器与 mount 选项
  5. 网络调优:TCP/IP 栈与接口优化
  6. 内核参数调优:sysctl 与持久化配置
  7. 应用级调优:以 Nginx 和 MySQL 为例
  8. 调优验证与监控:从基准测试到持续观测
  9. 调优最佳实践与注意事项
  10. 参考资料

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_FIFOSCHED_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  # 调度周期设为 10ms

2.2 CPU 频率与功耗控制#

CPU 频率通过 cpufreq 子系统 管理,核心是“调度器”(governor)。常见调度器:

  • performance:固定最高频率,优先性能(服务器推荐);
  • powersave:固定最低频率,优先节能(笔记本/嵌入式);
  • ondemand:负载高时提频,低时降频(平衡型)。

配置方法#

  1. 查看当前调度器:
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
  1. 临时切换为 performance
echo performance | tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
  1. 持久化(以 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=10

3.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.local

3.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=-1000

4. 磁盘 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,日志大小 128MB

4.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 0

4.4 SSD 优化:TRIM 与对齐#

  • TRIM:通知 SSD 擦除无效数据块,避免性能下降。
    临时执行:fstrim /data
    持久化(systemd 定时任务):启用 fstrim.timer

    systemctl enable --now fstrim.timer  # 每周自动执行 TRIM
  • 分区对齐:确保分区起始位置对齐 SSD 块大小(如 4KB),可通过 partedalign-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.conf

5.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.swappinessswap 使用积极性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 持久化配置步骤#

  1. 创建自定义配置文件(避免修改默认 sysctl.conf):
vim /etc/sysctl.d/99-custom.conf
  1. 添加参数:
vm.swappiness=10
net.core.somaxconn=1024
fs.file-max=1000000
  1. 生效配置:
sysctl -p /etc/sysctl.d/99-custom.conf

7. 应用级调优:以 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/内存sysbench

    sysbench cpu --cpu-max-prime=20000 run  # CPU 性能测试
    sysbench memory --memory-block-size=1M --memory-total-size=1G run  # 内存带宽测试
  • 磁盘 I/Ofio

    fio --name=randwrite --rw=randwrite --bs=4k --direct=1 --size=1G --numjobs=4 --runtime=60  # 随机写测试
  • 网络iperf3

    iperf3 -s  # 服务端
    iperf3 -c <server_ip> -t 60  # 客户端测试吞吐量

8.2 持续监控#

通过 Prometheus + GrafanaZabbix 监控关键指标,确保调优效果稳定:

  • 监控项:CPU 使用率、内存使用率、磁盘 I/O %util、网络吞吐量、应用响应时间;
  • 告警阈值:如 CPU us+sy > 80%、磁盘 %util > 90% 触发告警。

9. 调优最佳实践与注意事项#

  1. 备份优先:修改关键配置前备份(如 /etc/sysctl.conf/etc/fstab);
  2. 增量调优:一次修改一个参数,测试后再调整下一个;
  3. 场景适配:调优无“银弹”,需结合具体 workload(如数据库 vs web 服务);
  4. 避免过度调优:默认参数通常经过优化,非瓶颈领域无需修改;
  5. 文档化:记录每次调优的参数、原因、效果,便于回溯。

10. 参考资料#


通过本文的步骤,你可以系统性地诊断 Linux 系统瓶颈,并从 CPU、内存、磁盘、网络等维度进行调优。记住:调优是一个“观察→调整→验证”的循环,持续监控和迭代优化才是关键。