《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持续非零 → 内存不足
  • vmstatw列(可运行但被交换的进程)非零 → 严重内存不足

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 PROCESSLISTpg_stat_activityEXPLAIN分析)进行联合诊断。
  • 内存不足是最常见数据库性能杀手:数据库(尤其是MySQL/InnoDB和PostgreSQL)严重依赖内存缓存(buffer pool/shared buffers)。vmstat中持续非零的si/so → 加内存或调整数据库缓冲区配置。
  • 磁盘I/O诊断:数据库的随机读写(索引查找、日志写入)对I/O延迟极度敏感。若iostatawait > 10ms(机械盘)或 > 2ms(SSD),需检查:
    • 是否使用了错误的存储(如将数据库数据放在NFS上)
    • 是否日志和数据同盘(应将WAL/binlog和data分开)
    • 是否存在大量全表扫描(通过慢查询定位)
  • I/O调度器选择:数据库服务器强烈建议使用NOOPDeadline调度器(避免CFQ的公平性带来的额外延迟)。
  • fio测试:迁移数据库到新存储前,务必用fio测出IOPS和延迟是否符合数据库负载要求。
  • CPU窃取(st):云数据库实例尤其要关注此指标。若st持续>5%,说明实例资源争抢严重,应升级实例规格或迁移。
  • 平均负载与实际CPU利用率:数据库服务器有时负载高但CPU空闲——这通常表示大量I/O等待(wa高)或进程调度等待。用vmstat区分wa(I/O等待)和us/sy
  • 长期监控:推荐用Prometheus + Grafana + 数据库专用Exporter(如mysqld_exporterpostgres_exporter)建立性能基线,趋势异常比单点值更有参考价值。
  • 调优先观察,后行动:先采集至少一周的代表性数据(含峰值),再决定调优方向,避免盲目改参数。