【Linux运维极简教程】12-性能监控与优化
📅 2026/7/17 23:52:22
👁️ 阅读次数
📝 编程学习
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 监控工具
# uptime - 快速查看负载uptime# load average: 0.50, 0.35, 0.20# 三个数分别表示 1/5/15 分钟的平均负载# top - 实时监控top# 按 1 查看每个 CPU 核心# 按 P 按 CPU 排序# vmstat - 系统整体状态vmstat15# 每秒采样,共 5 次# 关键列:r(运行队列), us(用户CPU), sy(系统CPU), wa(IO等待), id(空闲)# mpstat - 多核 CPU 监控(需安装 sysstat)mpstat-PALL1# 每秒显示所有核心# pidstat - 进程级 CPU 监控pidstat1# 每秒显示各进程 CPU 使用pidstat-p12341# 监控指定进程2.3 CPU 分析
# 查看 CPU 信息lscpucat/proc/cpuinfo|grep"model name"nproc# 核心数# 查看中断分布cat/proc/interrupts# 查看进程的线程 CPU 使用top-H-p<PID>ps-T-p<PID># 使用 perf 分析 CPU 热点(高级)perftop# 实时显示 CPU 热点函数perf record-g-p<PID># 采样perf report# 分析报告# 使用 strace 跟踪系统调用strace-c-p<PID># 统计系统调用strace-p<PID># 实时跟踪2.4 CPU 优化方向
# 1. 调整进程优先级nice-n-5./critical_app# 提高renice-n10-p<PID># 降低# 2. 绑定 CPU 核心(CPU 亲和性)taskset-c0,1./app# 绑定到 0 和 1 号核心taskset-pc0,1<PID># 修改运行中进程# 3. 调整 CPU 调度器# 查看当前调度策略cat/sys/block/sda/queue/scheduler# 4. 内核参数优化echo"performance">/sys/devices/system/cpu/cpu*/cpufreq/scaling_governor三、内存监控与优化
3.1 内存指标
# free - 内存使用概览free-h# total used free shared buff/cache available# Mem: 16G 4G 2G 0.5G 10G 11G# 重要概念:# - buff/cache:系统用于缓冲和缓存的内存(可回收)# - available:实际可用内存(包含可回收的缓存)# - 判断内存是否紧张看 available,而非 free3.2 监控工具
# vmstat - 内存与交换分区vmstat15# 关键列:swpd(使用swap), free(空闲), buff(缓冲), cache(缓存), si/so(swap换入换出)# si/so 持续大于 0 说明内存不足,在使用 swap# sar - 历史内存数据(需安装 sysstat)sar-r# 内存使用sar-r15# 实时每秒sar-W# swap 使用sar-B# 分页统计# pidstat - 进程内存pidstat-r1# 每秒各进程内存使用pidstat-r-p12341# smem - 更准确的进程内存(需安装)smem-r-k# 按 RSS 排序smem-t-k|tail-5# 总计3.3 内存分析
# 查看 /proc/meminfo(最详细)cat/proc/meminfo|head-20# 查看进程内存映射pmap-x<PID>|tail-1# 进程总内存pmap-x<PID>|sort-k3-rn|head# 按内存排序# 查看 slab 缓存(内核内存)slabtopcat/proc/slabinfo|head# 查看 swap 使用swapon-scat/proc/swaps# 查找占用内存最多的进程ps-eopid,user,%mem,rss,comm--sort=-%mem|head-103.4 内存优化
# 1. 调整 swappiness(0-100,越低越少用 swap)sysctlvm.swappiness=10echo"vm.swappiness=10">>/etc/sysctl.conf# 2. 清理缓存(谨慎使用)sync# 先将脏数据写入磁盘echo1>/proc/sys/vm/drop_caches# 清理 pagecacheecho2>/proc/sys/vm/drop_caches# 清理 dentries 和 inodesecho3>/proc/sys/vm/drop_caches# 清理所有# 3. 限制进程内存(systemd)# 在 service 文件中:# MemoryLimit=2G# MemoryMax=2G# 4. 调整 overcommit 策略# vm.overcommit_memory=2 严格模式,不允许超额分配四、磁盘 IO 监控与优化
4.1 IO 监控工具
# iostat - 磁盘 IO 统计(需安装 sysstat)iostat-d15# 每秒显示磁盘 IOiostat-x15# 扩展统计# 关键列:# %util 磁盘利用率(>80% 说明瓶颈)# await IO 平均等待时间(ms,>10 需关注)# r/s w/s 每秒读写次数# rkB/s wkB/s 每秒读写数据量# iotop - 查看哪个进程在做 IO(需安装)iotop iotop-o# 只显示有 IO 的进程iotop-P# 按进程显示# pidstat - 进程级 IOpidstat-d1pidstat-d-p12341# vmstat - IO 概览vmstat15# 关键列:bi(块读), bo(块写), wa(IO等待CPU百分比)4.2 IO 分析
# 查看磁盘性能基准# 测试读性能hdparm-Tt/dev/sda# 使用 dd 测试(注意:会写入数据)# 测试写速度ddif=/dev/zeroof=/tmp/testfilebs=1Mcount=1024oflag=direct# 测试读速度ddif=/tmp/testfileof=/dev/nullbs=1Miflag=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_based4.3 IO 优化
# 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,nodiratime00# 3. 调整预读大小blockdev--getra/dev/sda# 查看预读blockdev--setra4096/dev/sda# 设置预读为 2MB# 4. ext4 优化参数# 格式化时:mkfs.ext4-Oextent,dir_index-b4096/dev/sdb1# 5. 使用 SSD 替代机械盘# 6. 使用 RAID 提升性能# 7. 读写分离、冷热数据分离五、网络性能监控
5.1 网络监控工具
# 网卡流量ifconfigeth0# 传统ip-slinkshow eth0# 现代sar-nDEV15# 每秒网卡流量统计nethogs# 按进程显示网络流量(需安装)iftop# 按连接显示流量(需安装)nload# 简单的流量监控(需安装)# TCP 连接统计ss-s# 连接概览ss-tnstate ESTABLISHED|wc-lss-tnstate TIME-WAIT|wc-lnetstat-an|awk'/tcp/ {print $NF}'|sort|uniq-c# 网络延迟ping-c10targetmtrtarget# 综合路由与延迟# 带宽测试iperf3-s# 服务端iperf3-c<server_ip># 客户端测试iperf3-c<server_ip>-u-b100M# UDP 测试iperf3-c<server_ip>-R# 反向测试(下载)5.2 网络内核参数优化
# /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_WAITnet.ipv4.tcp_fin_timeout=15# FIN-WAIT-2 超时net.ipv4.tcp_keepalive_time=600# keepalive 间隔# TCP 缓冲区net.core.rmem_max=16777216net.core.wmem_max=16777216net.ipv4.tcp_rmem=40968738016777216net.ipv4.tcp_wmem=40966553616777216# TCP 快速回收net.ipv4.tcp_timestamps=1net.ipv4.tcp_window_scaling=1# 网卡队列net.core.netdev_max_backlog=65535# 连接跟踪表(防火墙用)net.netfilter.nf_conntrack_max=655350# 应用sysctl-p六、综合监控工具
6.1 sar - 系统活动报告
# 安装yuminstall-ysysstat# CentOSaptinstall-ysysstat# Ubuntu# 开启数据收集(CentOS)# 编辑 /etc/sysconfig/sysstatENABLED="true"systemctlenable--nowsysstat# 实时监控sar-u15# CPU 使用率sar-r15# 内存使用sar-b15# IO 传输sar-nDEV15# 网络流量sar-q15# 队列长度和负载sar-W15# swap 使用# 查看历史数据sar-u-f/var/log/sa/sa15# 查看 15 号的 CPU 数据sar-r-s10:00:00-e12:00:00# 指定时间段6.2 dstat - 综合监控(需安装)
yuminstall-ydstat# CentOSaptinstall-ydstat# Ubuntu# 综合显示 CPU、磁盘、网络、内存dstat# 自定义显示dstat-cdnymdstat --top-cpu --top-mem --top-io6.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 综合性能监控脚本
#!/bin/bash# perf_monitor.sh - 性能监控告警脚本# 阈值设置CPU_THRESHOLD=80MEM_THRESHOLD=85DISK_THRESHOLD=90LOAD_THRESHOLD=$(nproc)ALERT_LOG="/var/log/perf_alert.log"alert(){echo"[$(date'+%Y-%m-%d %H:%M:%S')] [ALERT]$1">>$ALERT_LOGecho"$1"}# CPU 使用率CPU_IDLE=$(top-b-n1|grep"Cpu(s)"|awk'{print $8}'|cut-d'%'-f1)CPU_USED=$(echo"100 -$CPU_IDLE"|bc2>/dev/null|cut-d'.'-f1)if["$CPU_USED"-gt"$CPU_THRESHOLD"];thenalert"CPU 使用率过高:${CPU_USED}%"fi# 内存使用率MEM_USED=$(free|awk'/Mem/ {printf "%.0f", $3/$2*100}')if["$MEM_USED"-gt"$MEM_THRESHOLD"];thenalert"内存使用率过高:${MEM_USED}%"fi# 磁盘使用率df-h|awk'NR>1 && $5 != "-" {gsub(/%/,"",$5); if($5 > '$DISK_THRESHOLD') print $5"% "$6}'|whilereadline;doalert"磁盘空间不足:$line"done# 系统负载LOAD_1=$(uptime|awk-F'load average:''{print $2}'|awk'{print $1}'|tr-d',')if["$(echo"$LOAD_1>$LOAD_THRESHOLD"|bc2>/dev/null)"="1"];thenalert"系统负载过高:$LOAD_1(阈值:$LOAD_THRESHOLD)"fi# IO 等待IO_WAIT=$(vmstat12|tail-1|awk'{print $16}')if["$IO_WAIT"-gt20];thenalert"IO 等待过高:${IO_WAIT}%"fiecho"[$(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 - 教程目录
编程学习
技术分享
实战经验