《UNIX/Linux系统管理技术手册-读书笔记-第二十九章
性能分析
1. 性能调校哲学与原则
1.1 核心观点
| 观点 |
说明 |
| 性能调校是科学+艺术 |
科学:定量测量+科学方法;艺术:在资源需求间平衡 |
| 现代系统依然存在性能问题 |
云/虚拟化增加了复杂性,但基本决定因素未变 |
| 魔法式调优不靠谱 |
内核已针对通用场景优化,随意调参常适得其反 |
| 真正瓶颈多在应用层 |
系统性调优只是辅助,应用设计才是根本 |
1.2 调校黄金规则
| 规则 |
说明 |
| 历史基准 |
采集历史数据,对比当前状态;审查日志先找硬件问题 |
| 一次只改一处 |
每次改动记录在案,评估后再继续 |
| 准备回滚计划 |
任何时候都有备份方案 |
| 监控工具本身有开销 |
轻量级工具日常使用,发现问题后再用重量级工具深入 |
| 不要故意过载 |
系统过载时内核忙于资源管理,反而降低效率 |
2. 提高性能的方法(按有效性排序)
| 方法 |
效果 |
说明 |
| 增加内存 |
⭐⭐⭐⭐⭐ |
物理内存不足导致严重分页,几乎总是性能问题的首要原因 |
| 换用SSD |
⭐⭐⭐⭐⭐ |
消除机械寻道延迟,随机I/O提升巨大 |
| 负载均衡 |
⭐⭐⭐⭐ |
分散流量到多台服务器,增加冗余 |
| 应用层调优 |
⭐⭐⭐⭐ |
优化数据库查询、缓存、连接池等效果显著 |
| 磁盘布局优化 |
⭐⭐⭐ |
分散I/O到多块磁盘,选择合适的RAID级别 |
| 系统配置调优 |
⭐⭐ |
调整内核参数、调度器,效果有限 |
| 网络优化 |
⭐⭐ |
监控带宽/错误率,避免饱和 |
3. 影响性能的四大资源
| 资源 |
特点 |
瓶颈表现 |
| CPU |
最容易测量,但现实中相对次要 |
高%us+%sy,平均负载 > CPU核心数 |
| 内存 |
最重要资源之一,不足将导致分页 |
大量swap I/O,vmstat si/so持续非零 |
| 存储I/O |
机械硬盘寻道慢,常为主要瓶颈 |
iostat高await、高%util,进程频繁D状态 |
| 网络I/O |
延迟高,带宽受限 |
netstat错误率高,丢包,超时 |
4. CPU窃取(云/虚拟化环境)
| 概念 |
说明 |
| CPU窃取(st) |
Hypervisor从VM中“偷走”CPU周期,VM无法使用全部已分配算力 |
| 成因 |
①CPU配额限制;②物理硬件超额认购 |
| 监控 |
top/vmstat/mpstat的st列 |
| 示例 |
%Cpu: 16.2 st → 16.2%时间在等待被偷走的CPU |
解决方法:①升级实例规格;②重启VM换物理机;③减少同宿主其他VM负载。
5. 性能问题分析五步法
| 步骤 |
内容 |
| 1. 形成问题 |
具体化技术领域、组件、替代方案和关注点 |
| 2. 采集证据 |
文档、知识库、遥测数据、系统仪表化 |
| 3. 批判评估 |
检查数据相关性和有效性,提取关键信息 |
| 4. 总结证据 |
叙述性摘要+图形化展示 |
| 5. 形成结论 |
回答问题,给出结论可信度评分 |
6. 系统性能检查工具
6.1 硬件信息查看
| 命令 |
平台 |
用途 |
/proc/cpuinfo |
Linux |
CPU型号/核心数/超线程 |
/proc/meminfo |
Linux |
内存总量/使用情况 |
/proc/diskstats |
Linux |
磁盘统计 |
dmidecode -t type |
Linux/FreeBSD |
硬件DMI信息(CPU/内存/主板) |
ifconfig -a / ip a |
FreeBSD/Linux |
网络接口信息 |
sysctl hw |
FreeBSD |
硬件信息 |
6.2 CPU分析
| 命令 |
功能 |
关键列 |
uptime |
平均负载(1/5/15分钟) |
load average |
vmstat 5 |
CPU/内存/交换汇总 |
us, sy, id, wa, st |
mpstat -P ALL |
每核心CPU使用率 |
user, sys, idle, iowait, steal |
top / htop |
进程级实时CPU占用 |
%CPU, TIME+ |
ps auxww |
进程列表(含CPU占用) |
%CPU, VSZ, RSS |
平均负载解读:
- 负载值 > CPU核心数 → 系统过载
- 与历史基线对比判断异常
6.3 内存分析
| 命令 |
功能 |
关键指标 |
free -h |
内存+交换总量/使用 |
used, free, available |
vmstat 5 |
分页活动 |
si(换入)、so(换出) |
swapon -s |
交换空间使用 |
Used, Priority |
虚拟内存公式:虚拟内存总量 = 物理内存 + 已用交换
关键阈值:
si/so持续非零 → 内存不足
vmstat中w列(可运行但被交换的进程)非零 → 严重内存不足
swappiness参数(/proc/sys/vm/swappiness):
- 范围0~100,默认60
- 值越低越倾向回收文件缓存;值越高越倾向使用交换
- 调整此参数通常意味着该加内存了
6.4 磁盘I/O分析
| 命令 |
功能 |
关键列 |
iostat -x 1 |
磁盘吞吐量/利用率/延迟 |
tps, kB_read/s, await, %util |
fio |
存储子系统性能测试 |
IOPS, 延迟, 带宽 |
lsof |
打开文件 |
找出正在使用磁盘的进程 |
fuser |
文件系统使用进程 |
关联进程与文件系统 |
磁盘性能指标:
- IOPS:每秒I/O操作数(机械硬盘~100-300,SSD数万)
- await:平均I/O等待时间(机械硬盘~5-10ms,SSD<1ms)
- %util:设备繁忙百分比(接近100%表示饱和)
fio测试示例:
1
2
|
# 4K随机读写测试
fio --rw=randrw --bs=4k --size=1G --name=test
|
6.5 历史数据采集:sar
| 特性 |
说明 |
| 功能 |
采集并报告历史性能数据(CPU/磁盘/网络) |
| 配置 |
sa1脚本通过cron定期运行,数据存/var/log/sa/ |
| 常用 |
sar(CPU汇总)、sar -d(磁盘)、sar -n DEV(网络) |
6.6 深入分析:perf(Linux)
| 用途 |
说明 |
| perf top |
实时显示CPU热点函数(类似top) |
| perf record / report |
采样并生成报告 |
| 要求 |
安装linux-tools-common和对应内核版本包 |
示例:
1
2
|
sudo perf top
# 显示各函数CPU占用比例,定位内核/库/应用热点
|
7. Linux I/O调度器
| 调度器 |
适用场景 |
说明 |
| CFQ(完全公平队列) |
机械硬盘,通用服务器(默认) |
公平分配I/O带宽 |
| Deadline |
机械硬盘,延迟敏感场景 |
最小化每个请求延迟 |
| NOOP |
SSD,SAN环境 |
简单FIFO,假设底层已优化 |
查看/设置:
1
2
|
cat /sys/block/sda/queue/scheduler
echo noop > /sys/block/sda/queue/scheduler
|
永久生效:内核引导参数elevator=noop
8. 紧急排查:服务器突然变慢
8.1 步骤
| 步骤 |
操作 |
目标 |
| 1 |
top / ps auxww |
找CPU>50%或大量10%+的进程 |
| 2 |
uptime |
检查平均负载是否过高 |
| 3 |
vmstat 5 |
检查si/so(分页)、wa(I/O等待) |
| 4 |
iostat -x 1 |
检查磁盘是否饱和 |
| 5 |
使用lsof/fuser |
关联磁盘活动与进程 |
| 6 |
考虑网络或远程服务延迟 |
DNS超时、NFS挂起等 |
8.2 处理措施
| 情况 |
措施 |
| CPU密集进程 |
renice降低优先级 |
| 磁盘密集进程 |
ionice -c3 -p PID(Linux,仅在空闲时I/O) |
| 内存不足 |
增加内存或限制进程内存(ulimit -m) |
| 网络过载 |
检查cron定时任务是否集中;检查远程服务可用性 |
| 远程服务慢 |
检查DNS、NFS、Kerberos响应时间 |
9. 本章核心命令速查表
| 命令 |
功能 |
uptime |
运行时长+平均负载 |
top / htop |
进程实时资源占用 |
ps auxww |
完整进程列表 |
vmstat 5 10 |
系统统计(CPU/内存/交换/I/O) |
mpstat -P ALL 1 |
每CPU核心使用率 |
iostat -x 1 |
磁盘详细统计(延迟/利用率) |
sar -u -n DEV |
历史CPU/网络汇总 |
free -h |
内存使用 |
swapon -s |
交换空间 |
fio read-write.fio |
存储性能测试 |
perf top |
CPU热点函数分析(Linux) |
ionice -c3 -p PID |
设置I/O调度等级(Linux) |
renice -n 10 PID |
降低CPU优先级 |
ulimit -m 32000000 |
限制进程物理内存(shell内) |
lsof / fuser |
查找文件/文件系统使用进程 |
/proc/cpuinfo、/proc/meminfo |
硬件信息 |
DBA视角补充:
- 数据库性能分析工具包:DBA日常应结合系统工具(
iostat/vmstat/top)和数据库自身监控(SHOW PROCESSLIST、pg_stat_activity、EXPLAIN分析)进行联合诊断。
- 内存不足是最常见数据库性能杀手:数据库(尤其是MySQL/InnoDB和PostgreSQL)严重依赖内存缓存(buffer pool/shared buffers)。
vmstat中持续非零的si/so → 加内存或调整数据库缓冲区配置。
- 磁盘I/O诊断:数据库的随机读写(索引查找、日志写入)对I/O延迟极度敏感。若
iostat的await > 10ms(机械盘)或 > 2ms(SSD),需检查:
- 是否使用了错误的存储(如将数据库数据放在NFS上)
- 是否日志和数据同盘(应将WAL/binlog和data分开)
- 是否存在大量全表扫描(通过慢查询定位)
- I/O调度器选择:数据库服务器强烈建议使用NOOP或Deadline调度器(避免CFQ的公平性带来的额外延迟)。
- fio测试:迁移数据库到新存储前,务必用
fio测出IOPS和延迟是否符合数据库负载要求。
- CPU窃取(st):云数据库实例尤其要关注此指标。若
st持续>5%,说明实例资源争抢严重,应升级实例规格或迁移。
- 平均负载与实际CPU利用率:数据库服务器有时负载高但CPU空闲——这通常表示大量I/O等待(
wa高)或进程调度等待。用vmstat区分wa(I/O等待)和us/sy。
- 长期监控:推荐用Prometheus + Grafana + 数据库专用Exporter(如
mysqld_exporter、postgres_exporter)建立性能基线,趋势异常比单点值更有参考价值。
- 调优先观察,后行动:先采集至少一周的代表性数据(含峰值),再决定调优方向,避免盲目改参数。