调优的前提是 **“知道问题在哪”**,需先明确调优目标(如降低接口延迟、提高并发吞吐量、减少内存占用),再通过工具监控定位瓶颈。
不同子系统对应不同监控工具,需熟练掌握其核心指标:
- CPU 瓶颈:
top
中sy
(内核态)或us
(用户态)持续 > 80%,wa
(I/O 等待)低,上下文切换(cs)频繁(如 > 10000 次 / 秒)。
- 内存瓶颈:
free
中available
内存持续 < 10%,vmstat
中si
(换入)、so
(换出)频繁(非零),缓存(cache)被大量回收。
- 磁盘 I/O 瓶颈:
iostat -x 1
中%util
(设备繁忙度)持续 > 90%,avgqu-sz
(队列长度)>2,await
(平均 I/O 等待)>20ms。
- 网络瓶颈:
ifstat
中网卡吞吐量接近硬件上限,ss -s
中TCP: drops
(丢包)非零,ping
延迟高或tcpdump
抓包显示大量重传。
针对四大子系统的常见瓶颈,提供具体调优手段(以 CentOS/RHEL 7 + 为例)。
CPU 的核心矛盾是 “进程调度效率” 与 “资源分配合理性”,需避免进程频繁切换、核心争抢。
Linux 内核支持 3 种调度策略,针对不同进程类型选择:
- SCHED_FIFO/SCHED_RR:实时调度策略,优先于普通进程(适用于对延迟敏感的服务,如工业控制)。
- SCHED_OTHER:普通调度策略(默认),通过
nice
值(-20~19,值越小优先级越高)调整优先级。
操作示例:
给 MySQL 进程(PID=1234)提升优先级(nice=-10):
将进程绑定到固定 CPU 核心,避免进程在多核心间频繁切换(减少 TLB 缓存失效)。
适用场景:高 CPU 占用的单进程服务(如数据库、计算密集型应用)。
操作示例:
将 PID=1234 绑定到 CPU 0 和 1(核心编号从 0 开始):
taskset -cp 0,1 1234
ExecStart=/usr/sbin/mysqld --cpuset-cpus=0-1
CPU 中断(如网卡、磁盘 I/O 中断)会抢占进程资源,需通过irqbalance
服务均衡中断分配,或手动绑定高频率中断到独立核心。
操作示例:
- 启动 irqbalance 服务(自动均衡中断):
systemctl start irqbalance && systemctl enable irqbalance
- 手动绑定网卡中断(如 eth0)到 CPU 2:
cat /proc/interrupts | grep eth0
echo 0x4 > /proc/irq/123/smp_affinity
Linux 内存管理的核心是 “高效利用物理内存,避免频繁 swap”,需重点调整虚拟内存策略与缓存机制。
swappiness
(0~100)控制内核使用 swap 分区的倾向:
- 值越高,内核越倾向于使用 swap(默认 60);
- 值越低,内核优先使用物理内存(内存充足时建议设为 10~20,避免 swap 延迟)。
操作示例:
- 临时生效:
sysctl -w vm.swappiness=10
- 永久生效(修改
/etc/sysctl.conf
):
echo "vm.swappiness=10" >> /etc/sysctl.conf
sysctl -p
默认内存页大小为 4KB,大页(通常 2MB/1GB)可减少 TLB(Translation Lookaside Buffer)缓存失效,提升内存访问效率,适用于数据库(MySQL/Oracle)、虚拟化(KVM)等内存密集型应用。
操作示例(配置 2MB 大页):
- 计算所需大页数量(如需要 10GB 大页:10*1024MB / 2MB = 5120):
echo "vm.nr_hugepages=5120" >> /etc/sysctl.conf
sysctl -p
- 验证大页配置:
grep HugePages_Total /proc/meminfo
- 应用使用大页(如 MySQL):
在my.cnf
中添加:
Linux 会将空闲内存用于pagecache
(文件缓存),当应用需要内存时会自动回收,但可手动清理缓存(仅在内存紧张且缓存无复用价值时使用):
echo 1 > /proc/sys/vm/drop_caches
echo 2 > /proc/sys/vm/drop_caches
echo 3 > /proc/sys/vm/drop_caches
磁盘 I/O 是系统性能的常见瓶颈(尤其是机械硬盘 HDD),需从 “调度算法、文件系统、挂载参数、硬件配置” 四方面优化。
调度器决定磁盘 I/O 请求的处理顺序,不同磁盘类型适配不同调度器:
- 机械硬盘(HDD):推荐
mq-deadline
(多队列 deadline,优化顺序读写,减少磁头移动);
- 固态硬盘(SSD):推荐
none
(noop,无调度,直接转发请求,因 SSD 无磁头延迟)。
操作示例:
- 查看当前调度器(以 /dev/sda 为例):
cat /sys/block/sda/queue/scheduler
- 临时设置调度器为
mq-deadline
:
echo mq-deadline > /sys/block/sda/queue/scheduler
- 永久生效(修改
/etc/udev/rules.d/60-scheduler.rules
):
SUBSYSTEM=="block", ENV{ID_SERIAL}=="你的硬盘序列号", ENV{QUEUE_SCHEDULER}="mq-deadline"
SUBSYSTEM=="block", ENV{ID_SERIAL}=="你的SSD序列号", ENV{QUEUE_SCHEDULER}="none"
- 文件系统选择:
- 大文件 / 高 I/O 场景(如日志、数据库):推荐
XFS
(支持更大容量,并发读写性能优于 ext4);
- 普通场景:
ext4
(兼容性好,稳定性高)。
- 挂载参数优化:
关键参数减少磁盘写操作(如noatime
不记录文件访问时间),提升效率:
/dev/sda1 /data xfs defaults,noatime,nodiratime,discard 0 0
mount -o remount /data
参数说明:
noatime
:不记录文件访问时间(减少写操作);
nodiratime
:不记录目录访问时间;
discard
:启用 TRIM(SSD 专用,释放无用块,避免性能下降)。
- 分区对齐:SSD 和 RAID 需对齐(通常按 4KB 或 2MB 对齐),否则会导致 “双倍 I/O”,可用
parted
工具分区时指定align-check optimal 1
验证。
- RAID 级别选择:
- 读写均衡(如数据库):RAID 10(镜像 + 条带,性能高、可靠性高,需至少 4 块盘);
- 读多写少(如 Web 静态资源):RAID 5(条带 + 奇偶校验,容量利用率高,需至少 3 块盘)。
网络瓶颈常表现为 “连接队列溢出、丢包、延迟高”,需重点优化 TCP 参数与网卡配置。
TCP 连接建立需经过 “半连接队列(SYN 队列)” 和 “全连接队列(Accept 队列)”,队列满会导致连接失败。
关键参数(修改/etc/sysctl.conf
):
net.ipv4.tcp_max_syn_backlog=4096
net.core.somaxconn=4096
net.ipv4.tcp_syncookies=1
减少无效连接占用资源,加速连接回收:
net.ipv4.tcp_fin_timeout=30
net.ipv4.tcp_tw_reuse=1
net.ipv4.tcp_max_tw_buckets=50000
net.ipv4.tcp_syn_retries=3
TCP 滑动窗口决定数据传输的 “批量大小”,优化后提升大文件传输效率:
net.ipv4.tcp_window_scaling=1
net.ipv4.tcp_rmem=4096 87380 67108864
net.ipv4.tcp_wmem=4096 65536 67108864
net.ipv4.tcp_congestion_control=bbr
多队列网卡(如千兆 / 万兆网卡)可将中断分配到多个 CPU 核心,避免单核心中断瓶颈:
操作示例:
- 查看网卡是否支持多队列(以 eth0 为例):
- 启用多队列(如设置为 4 个队列):
ethtool -L eth0 combined 4
- 配合
irqbalance
服务自动分配中断,或手动绑定中断到不同 CPU。
除子系统外,需调整系统级资源限制(如文件描述符、进程数),避免应用因资源不足报错。
Linux 中 “一切皆文件”,网络连接、文件句柄均占用文件描述符,默认限制(1024)远不能满足高并发需求(如 Nginx、MySQL)。
操作示例:
- 临时生效(当前 Shell):
ulimit -n 65535
ulimit -u 65535
- 永久生效(全局配置):
编辑/etc/security/limits.conf
,添加:
* soft nofile 65535 # 软限制(警告阈值)
* hard nofile 65535 # 硬限制(不可超过)
* soft nproc 65535
* hard nproc 65535
- 对 systemd 管理的服务生效(如 Nginx):
编辑服务文件(/usr/lib/systemd/system/nginx.service
),添加:
[Service]
LimitNOFILE=65535
LimitNPROC=65535
重新加载配置:
systemctl daemon-reload && systemctl restart nginx
所有通过sysctl -w
修改的参数均为临时生效,需写入/etc/sysctl.conf
或/etc/sysctl.d/
目录下的文件,确保重启后生效:
sysctl -a > /etc/sysctl.d/custom.conf
sysctl --system
系统调优为应用提供 “硬件资源保障”,但应用本身的优化对性能影响更大,需结合具体服务调整。
worker_processes auto;
worker_connections 10240;
use epoll;
keepalive_timeout 60;
keepalive_requests 100;
innodb_buffer_pool_size=8G
max_connections=2000
slow_query_log=1
slow_query_log_file=/var/log/mysql/slow.log
long_query_time=2
- 减少不必要的系统调用(如频繁
open/close
文件,改为批量操作);
- 避免内存泄漏(如 Java 应用通过 JVM 参数
-Xms/-Xmx
限制堆大小,定期分析堆快照);
- 优化数据结构(如高频查询用哈希表替代数组,减少遍历耗时)。
- 定目标:明确性能指标(如 QPS 从 1000 提升到 2000,延迟从 100ms 降至 50ms);
- 查瓶颈:用监控工具采集调优前的基准数据(CPU、内存、I/O、网络);
- 改配置:针对瓶颈调整 1~2 个参数(避免同时改多个参数,无法定位效果);
- 验效果:重启服务 / 加载配置后,对比监控数据是否达到目标;
- 迭代优化:若未达标,重复 “查瓶颈→改配置→验效果”,直至满足需求。
- 备份配置:修改任何配置前(如
sysctl.conf
、nginx.conf
),先备份原文件(如cp /etc/sysctl.conf /etc/sysctl.conf.bak
);
- 避免盲目调优:参数并非 “越大越好”(如
max_connections
过大会导致 MySQL 内存溢出),需理解参数含义;
- 结合业务场景:高并发 Web 服务(优化网络、文件描述符)与数据库服务(优化内存、磁盘 I/O)的调重点不同;
- 监控长期效果:调优后需持续监控(如用 Prometheus+Grafana),避免负载变化导致新瓶颈。
Linux 性能调优的核心是 “数据驱动、针对性优化”—— 先通过监控工具定位瓶颈(CPU / 内存 / 磁盘 I/O/ 网络),再从 “系统参数→硬件配置→应用代码” 逐层优化,最后通过长期监控验证效果。需避免 “无瓶颈盲目调参”,同时牢记:应用优化是核心,系统调优是基础,二者结合才能最大化性能。