Linux性能调优实战指南

前言

系统性能问题是运维工作中最常见的挑战之一。一个慢查询、一次内存泄漏、一个I/O瓶颈都可能导致服务不可用。本文将系统讲解Linux性能分析和调优的方法论,帮助你快速定位和解决性能问题。


一、性能分析方法论

1.1 USE方法

Utilization(使用率)、Saturation(饱和度)、Errors(错误)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# CPU使用率
top
mpstat -P ALL 1

# 内存使用率
free -m
vmstat 1

# 磁盘使用率
iostat -xz 1
df -h

# 网络使用率
sar -n DEV 1
netstat -s

1.2 性能分析工具图谱

1
2
3
4
5
6
7
8
观测层次:
应用层 → 系统调用 → 内核 → 硬件

工具分类:
• 监控工具:top, htop, vmstat, iostat
• 追踪工具:strace, perf, ftrace
• 剖析工具:perf, gprof
• 基准测试:sysbench, fio, iperf

二、CPU性能优化

2.1 CPU性能指标

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 查看CPU信息
lscpu
cat /proc/cpuinfo

# CPU使用率
top
# 关注指标:
# - %us: 用户空间CPU使用率
# - %sy: 内核空间CPU使用率
# - %wa: I/O等待时间
# - %id: 空闲率

# 更详细的CPU统计
mpstat -P ALL 1 5
# P ALL: 显示所有CPU
# 1 5: 每秒采样一次,共5次

# 查看CPU队列长度
uptime
# load average: 0.52, 0.58, 0.59
# 1分钟、5分钟、15分钟平均负载

2.2 CPU瓶颈排查

高CPU使用率:

1
2
3
4
5
6
7
8
9
10
11
# 找出占用CPU最多的进程
top -o %CPU

# 查看具体进程的线程
top -H -p <PID>

# 使用ps查看
ps aux --sort=-%cpu | head -10

# 查看进程详细信息
pidstat -u 1 5 -p <PID>

上下文切换过多:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 查看上下文切换
vmstat 1
# 关注:
# - cs: 每秒上下文切换次数
# - in: 每秒中断次数

# 查看进程上下文切换
pidstat -w 1 5
# cswch/s: 自愿上下文切换(进程等待I/O)
# nvcswch/s: 非自愿上下文切换(时间片用完)

# 使用perf分析
perf record -e sched:sched_switch -a sleep 10
perf report

CPU缓存未命中:

1
2
3
4
5
6
# 使用perf分析缓存
perf stat -e cache-references,cache-misses ./your_program

# 输出示例:
# 100,000,000 cache-references
# 20,000,000 cache-misses # 20% miss rate

2.3 CPU调优技巧

CPU亲和性:

1
2
3
4
5
6
7
8
# 绑定进程到特定CPU
taskset -c 0,1 ./your_program

# 查看进程的CPU亲和性
taskset -p <PID>

# 设置进程亲和性
taskset -cp 0,1 <PID>

进程优先级:

1
2
3
4
5
6
7
8
# 调整nice值(-20到19,越小优先级越高)
nice -n -10 ./your_program

# 修改已运行进程的nice值
renice -10 -p <PID>

# 实时优先级
chrt -f 99 ./realtime_program

中断绑定:

1
2
3
4
5
# 查看中断分布
cat /proc/interrupts

# 绑定中断到特定CPU
echo 2 > /proc/irq/50/smp_affinity_list

三、内存性能优化

3.1 内存性能指标

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 查看内存使用情况
free -h
# total used free shared buff/cache available
# Mem: 15Gi 8.0Gi 1.0Gi 200Mi 6.0Gi 6.5Gi
# Swap: 8.0Gi 100Mi 7.9Gi

# 详细内存统计
vmstat 1
# 关注:
# - swpd: 使用的swap空间
# - free: 空闲内存
# - buff: 用作buffer的内存
# - cache: 用作cache的内存
# - si/so: swap in/out速率

# 查看进程内存
ps aux --sort=-%mem | head -10

# 详细的进程内存信息
cat /proc/<PID>/status
# VmRSS: 实际物理内存
# VmSwap: 被swap出去的内存

3.2 内存泄漏排查

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 监控进程内存变化
while true; do
ps -o pid,vsz,rss,comm -p <PID>
sleep 5
done

# 使用valgrind检测内存泄漏
valgrind --leak-check=full ./your_program

# 使用pmap查看进程内存映射
pmap -x <PID>

# 使用smem查看内存使用
smem -p | grep your_process

3.3 内存调优

swappiness调整:

1
2
3
4
5
6
7
8
9
10
# 查看当前swappiness
cat /proc/sys/vm/swappiness
# 默认60

# 临时修改(越小越倾向使用物理内存)
sysctl vm.swappiness=10

# 永久修改
echo "vm.swappiness=10" >> /etc/sysctl.conf
sysctl -p

透明大页:

1
2
3
4
5
6
7
8
9
# 查看透明大页状态
cat /sys/kernel/mm/transparent_hugepage/enabled

# 禁用(数据库场景推荐)
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag

# 永久禁用
# 在/etc/rc.local添加上述命令

Page Cache优化:

1
2
3
4
5
6
7
8
# 手动清理Page Cache
sync; echo 1 > /proc/sys/vm/drop_caches # 清理pagecache
sync; echo 2 > /proc/sys/vm/drop_caches # 清理dentries和inodes
sync; echo 3 > /proc/sys/vm/drop_caches # 清理所有

# 调整dirty比例(脏页刷盘阈值)
sysctl -w vm.dirty_background_ratio=5
sysctl -w vm.dirty_ratio=10

四、磁盘I/O性能优化

4.1 I/O性能指标

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# iostat查看I/O统计
iostat -xz 1
# 关注指标:
# - %util: 设备使用率
# - await: 平均I/O响应时间
# - r/s, w/s: 每秒读写次数
# - rkB/s, wkB/s: 每秒读写KB数

# 查看进程I/O
iotop

# pidstat查看进程I/O
pidstat -d 1 5

# 查看磁盘队列
cat /sys/block/sda/queue/nr_requests

4.2 I/O瓶颈排查

找出I/O密集型进程:

1
2
3
4
5
6
7
8
9
10
# iotop按I/O排序
iotop -o

# 查看进程打开的文件
lsof -p <PID>

# 统计进程读写情况
cat /proc/<PID>/io
# read_bytes: 读取的字节数
# write_bytes: 写入的字节数

分析I/O模式:

1
2
3
4
5
6
7
# 使用blktrace追踪I/O
blktrace -d /dev/sda -o trace
blkparse trace.blktrace.0 > trace.txt

# 使用perf追踪
perf record -e block:block_rq_issue -a sleep 10
perf script

4.3 I/O优化

I/O调度器:

1
2
3
4
5
6
7
8
9
10
11
12
# 查看当前调度器
cat /sys/block/sda/queue/scheduler
# [mq-deadline] kyber bfq none

# 修改调度器
echo bfq > /sys/block/sda/queue/scheduler

# 调度器选择:
# - mq-deadline: 通用,平衡
# - kyber: SSD优化
# - bfq: 交互式负载
# - none: 无调度(NVMe推荐)

文件系统调优:

1
2
3
4
5
6
7
8
# ext4挂载选项
mount -o noatime,nodiratime,data=writeback /dev/sda1 /mnt

# XFS挂载选项
mount -o noatime,nodiratime,logbufs=8,logbsize=256k /dev/sda1 /mnt

# 修改/etc/fstab永久生效
/dev/sda1 /mnt ext4 defaults,noatime,nodiratime 0 2

预读优化:

1
2
3
4
5
# 查看预读值
blockdev --getra /dev/sda

# 调整预读(单位512字节)
blockdev --setra 8192 /dev/sda # 4MB

使用SSD优化:

1
2
3
4
5
6
7
8
# 启用TRIM
fstrim -v /

# 定时TRIM(添加到crontab)
0 3 * * 0 /sbin/fstrim -av

# 检查TRIM支持
lsblk --discard

五、网络性能优化

5.1 网络性能指标

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 查看网络接口统计
ip -s link

# sar查看网络
sar -n DEV 1 5
# rxkB/s: 接收KB/s
# txkB/s: 发送KB/s
# rxpck/s: 接收包/s

# netstat查看连接
netstat -s # 协议统计
netstat -antp # TCP连接

# ss更快的查看连接
ss -s # 统计
ss -tanp # TCP连接

5.2 网络瓶颈排查

找出网络流量大的进程:

1
2
3
4
5
6
7
8
# nethogs实时监控进程网络
nethogs

# iftop监控连接
iftop -i eth0

# 使用ss查看进程连接
ss -tp

丢包排查:

1
2
3
4
5
6
7
8
9
# 查看丢包统计
netstat -s | grep -i drop
netstat -s | grep -i error

# 查看接口错误
ip -s link show eth0

# 检查ring buffer
ethtool -S eth0 | grep drop

5.3 网络调优

TCP参数优化:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# /etc/sysctl.conf

# TCP缓冲区
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216

# 连接队列
net.core.somaxconn = 32768
net.ipv4.tcp_max_syn_backlog = 8192

# TIME_WAIT复用和回收
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30

# TCP快速打开
net.ipv4.tcp_fastopen = 3

# 拥塞控制算法
net.ipv4.tcp_congestion_control = bbr

# 应用配置
sysctl -p

网卡优化:

1
2
3
4
5
6
7
8
9
10
11
12
13
# 查看网卡设置
ethtool eth0

# 增大ring buffer
ethtool -G eth0 rx 4096 tx 4096

# 启用网卡offload
ethtool -K eth0 tso on
ethtool -K eth0 gso on
ethtool -K eth0 lro on

# 调整中断合并
ethtool -C eth0 rx-usecs 50

多队列优化:

1
2
3
4
5
6
7
8
9
10
# 查看网卡队列
ethtool -l eth0

# 设置队列数
ethtool -L eth0 combined 4

# 绑定队列到CPU
for i in {0..3}; do
echo $i > /sys/class/net/eth0/queues/rx-$i/rps_cpus
done

六、系统调优实战案例

6.1 高并发Web服务器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 系统参数
sysctl -w fs.file-max=1000000
sysctl -w net.core.somaxconn=65535
sysctl -w net.ipv4.tcp_max_syn_backlog=8192
sysctl -w net.ipv4.ip_local_port_range="10000 65535"

# Nginx配置
worker_processes auto;
worker_rlimit_nofile 65535;

events {
use epoll;
worker_connections 65535;
multi_accept on;
}

http {
keepalive_timeout 65;
keepalive_requests 100;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
}

6.2 数据库服务器

1
2
3
4
5
6
7
8
9
10
11
12
13
# 内存优化
vm.swappiness = 1
vm.dirty_ratio = 15
vm.dirty_background_ratio = 5

# I/O调度
echo deadline > /sys/block/sda/queue/scheduler

# 文件系统
mount -o noatime,nodiratime,data=writeback

# 禁用透明大页
echo never > /sys/kernel/mm/transparent_hugepage/enabled

七、性能监控和告警

7.1 监控脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#!/bin/bash
# performance_monitor.sh

LOG_FILE="/var/log/performance.log"

while true; do
timestamp=$(date '+%Y-%m-%d %H:%M:%S')

# CPU
cpu_usage=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}')

# Memory
mem_free=$(free -m | awk 'NR==2{print $4}')

# Disk I/O
disk_util=$(iostat -x 1 2 | awk '/^sda/ {print $14}' | tail -1)

# Network
net_rx=$(sar -n DEV 1 1 | awk '/eth0/ {print $5}' | tail -1)

echo "$timestamp CPU:$cpu_usage% MEM_FREE:${mem_free}MB DISK:$disk_util% NET_RX:$net_rx" >> $LOG_FILE

sleep 60
done

7.2 性能基准测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# CPU测试
sysbench cpu --cpu-max-prime=20000 run

# 内存测试
sysbench memory --memory-block-size=1K --memory-total-size=10G run

# 磁盘I/O测试
fio --name=randwrite --ioengine=libaio --iodepth=16 \
--rw=randwrite --bs=4k --direct=1 \
--size=1G --numjobs=4 --runtime=60 --group_reporting

# 网络测试(服务端)
iperf3 -s

# 网络测试(客户端)
iperf3 -c server_ip -t 60 -P 4

八、总结

性能优化原则

  1. 测量优先:先测量,再优化
  2. 找瓶颈:优化瓶颈才有效果
  3. 权衡取舍:没有银弹,根据场景选择
  4. 持续监控:建立监控体系

常用工具清单

  • CPU: top, htop, mpstat, perf
  • 内存: free, vmstat, smem
  • I/O: iostat, iotop, fio
  • 网络: ss, netstat, iftop, iperf
  • 综合: sar, sysstat, glances

掌握这些技能,你就能成为Linux性能优化专家!


参考资料