12 - 性能监控与优化
一、性能监控概述
系统性能由四大核心资源决定:
CPU → 内存 → 磁盘 IO → 网络
性能问题通常是某个资源成为瓶颈,导致整个系统变慢。运维的目标是及时发现瓶颈并优化。
性能排查思路
1. 确认问题:是否真的有性能问题?
2. 定位瓶颈:CPU?内存?IO?网络?
3. 深入分析:哪个进程/线程导致?
4. 解决优化:调参、扩容、优化代码
二、CPU 监控与优化
2.1 CPU 性能指标
| 指标 | 说明 | 健康值 |
|---|---|---|
| load average | 系统负载(1/5/15 分钟平均) | < CPU 核心数 |
| us | 用户态 CPU | < 70% |
| sy | 内核态 CPU | < 30% |
| wa | IO 等待 | < 20% |
| id | 空闲 | > 30% |
| st | 被虚拟化偷走 | < 5% |
2.2 监控工具
bash
# uptime - 快速查看负载
uptime
# load average: 0.50, 0.35, 0.20
# 三个数分别表示 1/5/15 分钟的平均负载
# top - 实时监控
top
# 按 1 查看每个 CPU 核心
# 按 P 按 CPU 排序
# vmstat - 系统整体状态
vmstat 1 5 # 每秒采样,共 5 次
# 关键列:r(运行队列), us(用户CPU), sy(系统CPU), wa(IO等待), id(空闲)
# mpstat - 多核 CPU 监控(需安装 sysstat)
mpstat -P ALL 1 # 每秒显示所有核心
# pidstat - 进程级 CPU 监控
pidstat 1 # 每秒显示各进程 CPU 使用
pidstat -p 1234 1 # 监控指定进程
2.3 CPU 分析
bash
# 查看 CPU 信息
lscpu
cat /proc/cpuinfo | grep "model name"
nproc # 核心数
# 查看中断分布
cat /proc/interrupts
# 查看进程的线程 CPU 使用
top -H -p <PID>
ps -T -p <PID>
# 使用 perf 分析 CPU 热点(高级)
perf top # 实时显示 CPU 热点函数
perf record -g -p <PID> # 采样
perf report # 分析报告
# 使用 strace 跟踪系统调用
strace -c -p <PID> # 统计系统调用
strace -p <PID> # 实时跟踪
2.4 CPU 优化方向
bash
# 1. 调整进程优先级
nice -n -5 ./critical_app # 提高
renice -n 10 -p <PID> # 降低
# 2. 绑定 CPU 核心(CPU 亲和性)
taskset -c 0,1 ./app # 绑定到 0 和 1 号核心
taskset -pc 0,1 <PID> # 修改运行中进程
# 3. 调整 CPU 调度器
# 查看当前调度策略
cat /sys/block/sda/queue/scheduler
# 4. 内核参数优化
echo "performance" > /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
三、内存监控与优化
3.1 内存指标
bash
# free - 内存使用概览
free -h
# total used free shared buff/cache available
# Mem: 16G 4G 2G 0.5G 10G 11G
# 重要概念:
# - buff/cache:系统用于缓冲和缓存的内存(可回收)
# - available:实际可用内存(包含可回收的缓存)
# - 判断内存是否紧张看 available,而非 free
3.2 监控工具
bash
# vmstat - 内存与交换分区
vmstat 1 5
# 关键列:swpd(使用swap), free(空闲), buff(缓冲), cache(缓存), si/so(swap换入换出)
# si/so 持续大于 0 说明内存不足,在使用 swap
# sar - 历史内存数据(需安装 sysstat)
sar -r # 内存使用
sar -r 1 5 # 实时每秒
sar -W # swap 使用
sar -B # 分页统计
# pidstat - 进程内存
pidstat -r 1 # 每秒各进程内存使用
pidstat -r -p 1234 1
# smem - 更准确的进程内存(需安装)
smem -r -k # 按 RSS 排序
smem -t -k | tail -5 # 总计
3.3 内存分析
bash
# 查看 /proc/meminfo(最详细)
cat /proc/meminfo | head -20
# 查看进程内存映射
pmap -x <PID> | tail -1 # 进程总内存
pmap -x <PID> | sort -k3 -rn | head # 按内存排序
# 查看 slab 缓存(内核内存)
slabtop
cat /proc/slabinfo | head
# 查看 swap 使用
swapon -s
cat /proc/swaps
# 查找占用内存最多的进程
ps -eo pid,user,%mem,rss,comm --sort=-%mem | head -10
3.4 内存优化
bash
# 1. 调整 swappiness(0-100,越低越少用 swap)
sysctl vm.swappiness=10
echo "vm.swappiness=10" >> /etc/sysctl.conf
# 2. 清理缓存(谨慎使用)
sync # 先将脏数据写入磁盘
echo 1 > /proc/sys/vm/drop_caches # 清理 pagecache
echo 2 > /proc/sys/vm/drop_caches # 清理 dentries 和 inodes
echo 3 > /proc/sys/vm/drop_caches # 清理所有
# 3. 限制进程内存(systemd)
# 在 service 文件中:
# MemoryLimit=2G
# MemoryMax=2G
# 4. 调整 overcommit 策略
# vm.overcommit_memory=2 严格模式,不允许超额分配
四、磁盘 IO 监控与优化
4.1 IO 监控工具
bash
# iostat - 磁盘 IO 统计(需安装 sysstat)
iostat -d 1 5 # 每秒显示磁盘 IO
iostat -x 1 5 # 扩展统计
# 关键列:
# %util 磁盘利用率(>80% 说明瓶颈)
# await IO 平均等待时间(ms,>10 需关注)
# r/s w/s 每秒读写次数
# rkB/s wkB/s 每秒读写数据量
# iotop - 查看哪个进程在做 IO(需安装)
iotop
iotop -o # 只显示有 IO 的进程
iotop -P # 按进程显示
# pidstat - 进程级 IO
pidstat -d 1
pidstat -d -p 1234 1
# vmstat - IO 概览
vmstat 1 5
# 关键列:bi(块读), bo(块写), wa(IO等待CPU百分比)
4.2 IO 分析
bash
# 查看磁盘性能基准
# 测试读性能
hdparm -Tt /dev/sda
# 使用 dd 测试(注意:会写入数据)
# 测试写速度
dd if=/dev/zero of=/tmp/testfile bs=1M count=1024 oflag=direct
# 测试读速度
dd if=/tmp/testfile of=/dev/null bs=1M iflag=direct
# 查看磁盘队列深度
cat /sys/block/sda/queue/nr_requests
# 查看文件系统 IO 统计
cat /proc/diskstats
# 使用 fio 进行专业 IO 基准测试(需安装)
fio --name=test --filename=/tmp/testfile --size=1G \
--rw=randread --bs=4k --ioengine=libaio --iodepth=32 \
--runtime=60 --time_based
4.3 IO 优化
bash
# 1. 选择合适的 IO 调度器
# 查看
cat /sys/block/sda/queue/scheduler
# 修改(SSD 推荐 none/mq-deadline,机械盘推荐 deadline/cfq)
echo "mq-deadline" > /sys/block/sda/queue/scheduler
# 2. 文件系统挂载优化
# /etc/fstab
# noatime - 不更新访问时间
# nodiratime - 不更新目录访问时间
UUID=xxx /data ext4 defaults,noatime,nodiratime 0 0
# 3. 调整预读大小
blockdev --getra /dev/sda # 查看预读
blockdev --setra 4096 /dev/sda # 设置预读为 2MB
# 4. ext4 优化参数
# 格式化时:
mkfs.ext4 -O extent,dir_index -b 4096 /dev/sdb1
# 5. 使用 SSD 替代机械盘
# 6. 使用 RAID 提升性能
# 7. 读写分离、冷热数据分离
五、网络性能监控
5.1 网络监控工具
bash
# 网卡流量
ifconfig eth0 # 传统
ip -s link show eth0 # 现代
sar -n DEV 1 5 # 每秒网卡流量统计
nethogs # 按进程显示网络流量(需安装)
iftop # 按连接显示流量(需安装)
nload # 简单的流量监控(需安装)
# TCP 连接统计
ss -s # 连接概览
ss -tn state ESTABLISHED | wc -l
ss -tn state TIME-WAIT | wc -l
netstat -an | awk '/tcp/ {print $NF}' | sort | uniq -c
# 网络延迟
ping -c 10 target
mtr target # 综合路由与延迟
# 带宽测试
iperf3 -s # 服务端
iperf3 -c <server_ip> # 客户端测试
iperf3 -c <server_ip> -u -b 100M # UDP 测试
iperf3 -c <server_ip> -R # 反向测试(下载)
5.2 网络内核参数优化
bash
# /etc/sysctl.conf 网络优化
# TCP 连接优化
net.ipv4.tcp_max_syn_backlog = 65535 # SYN 队列
net.core.somaxconn = 65535 # 监听队列
net.ipv4.tcp_max_tw_buckets = 32768 # TIME_WAIT 最大数
net.ipv4.tcp_tw_reuse = 1 # 复用 TIME_WAIT
net.ipv4.tcp_fin_timeout = 15 # FIN-WAIT-2 超时
net.ipv4.tcp_keepalive_time = 600 # keepalive 间隔
# 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
# TCP 快速回收
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_window_scaling = 1
# 网卡队列
net.core.netdev_max_backlog = 65535
# 连接跟踪表(防火墙用)
net.netfilter.nf_conntrack_max = 655350
# 应用
sysctl -p
六、综合监控工具
6.1 sar - 系统活动报告
bash
# 安装
yum install -y sysstat # CentOS
apt install -y sysstat # Ubuntu
# 开启数据收集(CentOS)
# 编辑 /etc/sysconfig/sysstat
ENABLED="true"
systemctl enable --now sysstat
# 实时监控
sar -u 1 5 # CPU 使用率
sar -r 1 5 # 内存使用
sar -b 1 5 # IO 传输
sar -n DEV 1 5 # 网络流量
sar -q 1 5 # 队列长度和负载
sar -W 1 5 # swap 使用
# 查看历史数据
sar -u -f /var/log/sa/sa15 # 查看 15 号的 CPU 数据
sar -r -s 10:00:00 -e 12:00:00 # 指定时间段
6.2 dstat - 综合监控(需安装)
bash
yum install -y dstat # CentOS
apt install -y dstat # Ubuntu
# 综合显示 CPU、磁盘、网络、内存
dstat
# 自定义显示
dstat -cdnym
dstat --top-cpu --top-mem --top-io
6.3 监控系统部署建议
| 工具 | 类型 | 特点 |
|---|---|---|
| Prometheus + Grafana | 时序数据库+可视化 | 业界标准,功能强大 |
| Zabbix | 一体化监控 | 企业级,开箱即用 |
| Node Exporter | 系统指标采集 | 配合 Prometheus |
| Netdata | 实时监控 | 安装简单,实时性好 |
七、性能优化总结
7.1 常见性能问题与解决
| 症状 | 可能原因 | 排查工具 | 优化方向 |
|---|---|---|---|
| 系统负载高 | CPU 或 IO 瓶颈 | top, vmstat | 优化代码/升级硬件 |
| CPU us 高 | 计算密集 | top, pidstat | 优化算法/加节点 |
| CPU sy 高 | 系统调用过多 | strace, perf | 减少系统调用 |
| CPU wa 高 | IO 等待 | iostat, iotop | 优化 IO/换 SSD |
| 内存不足 | 内存泄漏/缓存少 | free, pmap | 修复泄漏/加内存 |
| swap 频繁 | 物理内存不足 | vmstat, sar | 加内存/调 swappiness |
| 磁盘 %util 高 | IO 瓶颈 | iostat | 换 SSD/RAID/分散 IO |
| 网络延迟高 | 带宽/路由问题 | mtr, iperf3 | 升级带宽/优化路由 |
| 大量 TIME_WAIT | 连接回收慢 | ss | 调内核参数 |
| 服务响应慢 | 综合因素 | 全链路分析 | 逐层排查 |
7.2 综合性能监控脚本
bash
#!/bin/bash
# perf_monitor.sh - 性能监控告警脚本
# 阈值设置
CPU_THRESHOLD=80
MEM_THRESHOLD=85
DISK_THRESHOLD=90
LOAD_THRESHOLD=$(nproc)
ALERT_LOG="/var/log/perf_alert.log"
alert() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] [ALERT] $1" >> $ALERT_LOG
echo "$1"
}
# CPU 使用率
CPU_IDLE=$(top -b -n 1 | grep "Cpu(s)" | awk '{print $8}' | cut -d'%' -f1)
CPU_USED=$(echo "100 - $CPU_IDLE" | bc 2>/dev/null | cut -d'.' -f1)
if [ "$CPU_USED" -gt "$CPU_THRESHOLD" ]; then
alert "CPU 使用率过高: ${CPU_USED}%"
fi
# 内存使用率
MEM_USED=$(free | awk '/Mem/ {printf "%.0f", $3/$2*100}')
if [ "$MEM_USED" -gt "$MEM_THRESHOLD" ]; then
alert "内存使用率过高: ${MEM_USED}%"
fi
# 磁盘使用率
df -h | awk 'NR>1 && $5 != "-" {gsub(/%/,"",$5); if($5 > '$DISK_THRESHOLD') print $5"% "$6}' | while read line; do
alert "磁盘空间不足: $line"
done
# 系统负载
LOAD_1=$(uptime | awk -F'load average:' '{print $2}' | awk '{print $1}' | tr -d ',')
if [ "$(echo "$LOAD_1 > $LOAD_THRESHOLD" | bc 2>/dev/null)" = "1" ]; then
alert "系统负载过高: $LOAD_1 (阈值: $LOAD_THRESHOLD)"
fi
# IO 等待
IO_WAIT=$(vmstat 1 2 | tail -1 | awk '{print $16}')
if [ "$IO_WAIT" -gt 20 ]; then
alert "IO 等待过高: ${IO_WAIT}%"
fi
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 监控检查完成"
7.3 优化原则
- 先监控后优化:用数据说话,不凭感觉
- 找准瓶颈:一次只优化一个资源
- 测试验证:优化后要对比效果
- 适度即可:不要过度优化,满足需求即可
- 硬件 vs 软件:先优化软件和配置,再考虑升级硬件
- 可扩展性:优先通过水平扩展解决,而非单机优化
八、全系列总结
至此,《Linux 运维教程》全 12 篇已全部完成。回顾整个系列:
| 篇号 | 主题 | 核心技能 |
|---|---|---|
| 01 | 基础命令 | 文件操作、文本处理、系统信息 |
| 02 | 文件系统与权限 | 目录结构、权限管理、ACL、链接 |
| 03 | 用户与组管理 | 用户增删改查、sudo、PAM |
| 04 | 进程与服务管理 | 进程控制、systemd、资源限制 |
| 05 | 软件包管理 | yum/dnf、apt、源码编译 |
| 06 | 网络配置 | IP 配置、网络诊断、内核参数 |
| 07 | 磁盘管理 | 分区、文件系统、LVM |
| 08 | Shell 脚本 | 变量、条件、循环、函数、实战脚本 |
| 09 | 定时任务 | cron、Ansible、自动化运维 |
| 10 | 日志与排查 | journalctl、日志分析、故障排查 |
| 11 | 防火墙与安全 | firewalld、iptables、SELinux、SSH 加固 |
| 12 | 性能监控 | CPU/内存/IO/网络监控与优化 |
掌握这些内容,你已经具备了 Linux 运维工程师的核心技能。运维是一个需要不断实践和积累经验的领域,建议在实际工作中多动手、多总结。
上一篇 :11 - 防火墙与安全加固
返回目录 :README - 教程目录