【Linux运维极简教程】12-性能监控与优化

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 优化原则

  1. 先监控后优化:用数据说话,不凭感觉
  2. 找准瓶颈:一次只优化一个资源
  3. 测试验证:优化后要对比效果
  4. 适度即可:不要过度优化,满足需求即可
  5. 硬件 vs 软件:先优化软件和配置,再考虑升级硬件
  6. 可扩展性:优先通过水平扩展解决,而非单机优化

八、全系列总结

至此,《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 - 教程目录

相关推荐
爆浇牛肉面4 小时前
Linux进阶命令:测开必学的curl和jq
linux
Sinclair4 小时前
安企CMS的安装-常见安装问题排查
运维·后端
Sinclair4 小时前
安企CMS的安装-安装引导与初始化
运维·后端
Sinclair4 小时前
安企CMS的安装-源码编译安装
运维·后端·go
Sinclair4 小时前
安企CMS的安装-同一服务器多站点部署
运维·后端
Sinclair4 小时前
安企CMS的安装-Docker 部署
运维·docker·容器
Sinclair4 小时前
安企CMS的安装-服务器手动部署
运维·后端
shujudang4 小时前
业务闭环视角下的营销自动化(MA)平台选型逻辑
大数据·运维·数据分析·自动化·营销自动化
希望奇迹很安静5 小时前
数通基本实验
运维·服务器·网络
minglie15 小时前
zynq的linux驱动版终端AtShellDrv
linux