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

【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%
waIO 等待< 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,而非 free

3.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-10

3.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_based

4.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-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 综合性能监控脚本

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

  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
08Shell 脚本变量、条件、循环、函数、实战脚本
09定时任务cron、Ansible、自动化运维
10日志与排查journalctl、日志分析、故障排查
11防火墙与安全firewalld、iptables、SELinux、SSH 加固
12性能监控CPU/内存/IO/网络监控与优化

掌握这些内容,你已经具备了 Linux 运维工程师的核心技能。运维是一个需要不断实践和积累经验的领域,建议在实际工作中多动手、多总结。


上一篇:11 - 防火墙与安全加固
返回目录:README - 教程目录