前言
服务器性能优化是运维人员的核心技能之一。很多站长在网站变慢时第一反应是「加机器」,但事实上,大多数性能瓶颈通过合理的系统调优就能解决。本文基于我在生产环境中的实际经验,系统性地梳理 Linux 服务器的性能调优方法论,覆盖 CPU、内存、磁盘 I/O、网络和内核参数五个维度。
一、CPU 性能调优
1.1 判断 CPU 是否成为瓶颈
在动手之前,先用工具确认问题所在。top 和 htop 是最直观的工具,但真正有用的指标是 mpstat -P ALL 1,它能展示每个核心的负载分布。如果单个核心满载而其他核心空闲,说明存在锁竞争或单线程瓶颈;如果所有核心都跑满,说明需要扩容或优化代码。
另一个关键工具是 perf top,它能直接展示哪些函数占用 CPU 最多。我曾经用这个工具发现一个 PHP 程序在循环中重复调用 file_get_contents 读取同一个配置文件,改造成全局变量后性能提升了 5 倍。
1.2 进程优先级与 CPU 亲和性
nice 和 renice 可以调整进程优先级,让后台任务不影响前端响应。taskset 则用于绑定进程到指定 CPU 核心,对 NUMA 架构的服务器特别有效。例如,将数据库绑定到前 4 个核心,Web 服务绑定到后 4 个核心,可以显著减少缓存抖动。
1.3 中断负载均衡
高并发服务器上,网卡中断可能集中在 CPU0 上,导致这个核心成为瓶颈。通过 set_irq_affinity 脚本可以将中断分散到多个核心。配合 RPS(Receive Packet Steering)和 RFS(Receive Flow Steering)技术,可以在软件层面实现更精细的负载均衡。
二、内存管理优化
2.1 Swap 的合理配置
很多人的误区是「Swap 越慢越好不设就行」。实际上,合理配置 Swap 可以提升系统稳定性。内核参数 vm.swappiness 控制内存回收的倾向程度,默认 60 对服务器来说太高,建议降为 10 甚至 1。如果内存充足,可以设为 0 但要注意 OOM Killer 的风险。
2.2 大内存页配置
对于数据库和 Java 应用,开启 HugePages 可以大幅减少 TLB Miss。MySQL 的 InnoDB 引擎和 JVM 都原生支持大页。配置方法很简单:
echo 1024 > /proc/sys/vm/nr_hugepages然后修改应用的配置文件启用大页即可。实测 MySQL 在 OLTP 场景下开启大页后吞吐量提升约 15%。
2.3 OOM 管理
vm.overcommit_memory 和 vm.overcommit_ratio 控制内核是否允许超额分配内存。数据库服务器建议设为 2(禁止超额),Web 服务器可以保持 0。配合 oom_score_adj 可以为关键进程设置较低的 OOM 分数,避免被误杀。
三、磁盘 I/O 优化
3.1 I/O 调度器选择
Linux 内核提供三种 I/O 调度器:mq-deadline、kyber 和 BFQ。NVMe 固态硬盘推荐使用 none(即 noop),传统机械硬盘推荐 BFQ 或 mq-deadline。可以通过 cat /sys/block/sda/queue/scheduler 查看当前调度器,并通过 echo mq-deadline > /sys/block/sda/queue/scheduler 切换。
3.2 文件系统挂载参数
noatime 和 nodiratime 是最简单的优化,禁止记录文件访问时间,可以显著减少磁盘写入。barrier=0 在断电风险低的场景可以提升性能。data=writeback(仅 ext4)牺牲一定的崩溃安全性换取写入性能。
3.3 预读与缓存
blockdev --setra 可以调整磁盘预读大小,顺序读为主的场景增加预读值能大幅提升性能。vm.dirty_ratio 和 vm.dirty_background_ratio 控制脏页回写策略,写密集场景适当降低这两个值可以防止 I/O 尖峰。
四、网络优化
4.1 TCP 参数调优
net.core.somaxconn 默认 128,高并发 Web 服务器需要调大到 1024 以上。net.ipv4.tcp_tw_reuse 允许复用 TIME_WAIT 状态的连接。net.ipv4.tcp_fin_timeout 减小 FIN 等待时间。
net.core.rmem_max 和 net.core.wmem_max 增加收发缓冲区大小,net.ipv4.tcp_rmem 和 net.ipv4.tcp_wmem 设置 TCP 缓冲区自动调整范围。对于文件传输服务器,增大缓冲区可以显著提升吞吐量。
4.2 网卡多队列
现代网卡支持多队列 RSS(Receive Side Scaling),配合 CPU 亲和性可以将网络处理分散到多个核心。通过 ethtool -l eth0 查看队列数,ethtool -L eth0 combined N 调整队列数量。
五、内核参数一键优化脚本
以下是我整理的常用优化参数集合,可以直接应用到 /etc/sysctl.conf:
# 减少 Swap 倾向
vm.swappiness = 10
vm.vfs_cache_pressure = 50
# 网络优化
net.core.somaxconn = 1024
net.ipv4.tcp_max_syn_backlog = 1024
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_tw_reuse = 1
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
# 文件系统
fs.file-max = 1000000
fs.inotify.max_user_watches = 524288
# 内核安全
kernel.pid_max = 65536
net.ipv4.tcp_syncookies = 1总结
性能优化不是一蹴而就的工作,核心方法论是「测量 — 分析 — 调优 — 再测量」的循环。不要盲目套用网上的优化参数,每个业务场景的需求不同,只有结合自己的监控数据才能做出正确决策。推荐配合使用 sysstat 包中的 sar、iostat、pidstat 等工具做长期性能数据收集,为每次优化提供数据支撑。