系统监控与性能分析
大约 23 分钟约 6801 字
系统监控与性能分析
简介
系统监控与性能分析是保障 Linux 服务器稳定运行的关键环节。通过掌握 top、vmstat、iostat、sar、perf 等核心监控工具,运维工程师可以实时掌握系统资源使用状况,快速定位 CPU、内存、磁盘 I/O 和网络等方面的性能瓶颈,从而及时进行优化和容量规划,确保业务系统的高可用性。
特点
进程与 CPU 监控
top 和 htop
# top 基本使用
top
# top 常用交互命令:
# M - 按内存使用率排序
# P - 按CPU使用率排序
# T - 按累计CPU时间排序
# 1 - 显示所有CPU核心使用率
# c - 显示完整命令行
# k - 终止指定进程
# q - 退出
# 批处理模式输出(可用于脚本)
top -b -n 1 | head -20
# 按CPU使用率排序输出前10个进程
top -b -n 1 -o +%CPU | head -17
# htop 交互式进程查看器(需要安装)
htop
# htop 查看指定用户的进程
htop -u nginx
# htop 常用交互键:
# F5 - 树形视图(查看父子进程关系)
# F6 - 选择排序字段
# F9 - 杀进程
# / - 搜索进程
# H - 显示/隐藏用户线程
# s - 跟踪系统调用(strace)
# htop 按指定列排序启动
htop --sort-key PERCENT_CPU
# htop 高亮指定PID
htop -p 1234,5678,9012top 输出字段详解
# top 头部信息解读
# top - 14:30:00 up 30 days, 5:23, 2 users, load average: 1.25, 0.98, 0.76
# | | | | |
# | | | | +-- 15分钟平均负载
# | | | +-- 5分钟平均负载
# | | | +-- 登录用户数
# | | +-- 系统运行时间
# | +-- 当前时间
# +-- 任务信息
# CPU 行解读
# %Cpu(s): 3.2 us, 1.1 sy, 0.0 ni, 95.0 id, 0.3 wa, 0.2 si, 0.2 st
# | | | | | | | |
# | | | | | | | +-- 虚拟化偷取时间
# | | | | | | +-- 软中断
# | | | | | +-- I/O等待
# | | | | +-- 空闲
# | | | +-- nice优先级进程
# | | +-- 内核空间
# | +-- 用户空间
# +-- CPU行
# 进程行解读
# PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
# | | | | | | | | | | | |
# | | | | | | | | | | | +-- 进程名/命令
# | | | | | | | | | | +-- 累计CPU时间
# | | | | | | | | | +-- 内存占比
# | | | | | | | | +-- CPU占比
# | | | | | | | +-- 状态(S=睡眠,R=运行,Z=僵尸,D=不可中断)
# | | | | | | +-- 共享内存
# | | | | | +-- 常驻内存(实际物理内存)
# | | | | +-- 虚拟内存
# | | | +-- nice值
# | | +-- 优先级
# | +-- 用户
# +-- 进程IDps 进程查看
# 查看所有进程(类似ps -e)
ps aux
# 查看进程树
ps auxf
ps -ef --forest
# 查看指定用户的进程
ps -u nginx -o pid,ppid,cmd,%mem,%cpu --sort=-%mem
# 查看指定PID的详细信息
ps -p 12345 -o pid,ppid,user,stat,start,time,%cpu,%mem,rss,vsz,cmd
# 按内存使用率排序查看前10个进程
ps aux --sort=-%mem | head -11
# 按CPU使用率排序查看前10个进程
ps aux --sort=-%cpu | head -11
# 查找指定名称的进程
ps aux | grep nginx
# 查看僵尸进程
ps aux | awk '$8 ~ /Z/ {print}'
# 统计各状态的进程数量
ps aux | awk '{print $8}' | sort | uniq -c | sort -rn
# 实时查看进程启动(类似Windows任务管理器)
watch -n 1 "ps aux --sort=-%cpu | head -11"
# pstree 查看进程树关系
pstree -p nginx
pstree -paul # 显示PID、用户、命令行参数
# 查看某个进程打开的文件描述符数量
ls -l /proc/12345/fd | wc -l
# 查看某个进程打开的文件列表
ls -l /proc/12345/fd
# 查看某个进程的内存映射
cat /proc/12345/maps | head -20
# 查看某个进程的环境变量
cat /proc/12345/environ | tr '\0' '\n'
# 查看某个进程的命令行参数
cat /proc/12345/cmdline | tr '\0' ' 'mpstat 多核 CPU 分析
# 安装
yum install -y sysstat
# 查看所有CPU核心的使用情况
mpstat -P ALL 2 5
# 仅查看总体CPU使用率
mpstat 2 5
# 输出字段说明:
# %usr: 用户空间CPU时间
# %nice: nice优先级进程CPU时间
# %sys: 内核空间CPU时间
# %iowait: I/O等待时间
# %irq: 硬中断时间
# %soft: 软中断时间
# %steal: 虚拟化偷取时间
# %guest: 运行虚拟CPU时间
# %idle: 空闲时间
# 查看CPU中断统计
mpstat -I SUM 2 5
# 查看指定CPU核心
mpstat -P 0 2 5
mpstat -P 2 2 5vmstat 系统活动监控
# 每隔2秒采样一次,共采样5次
vmstat 2 5
# 输出字段说明:
# procs: r(运行队列) b(阻塞进程)
# memory: swpd(虚拟内存) free(空闲) buff(缓冲) cache(缓存)
# swap: si(从磁盘换入) so(换出到磁盘)
# io: bi(块写入) bo(块读出)
# system: in(中断) cs(上下文切换)
# cpu: us(用户) sy(系统) id(空闲) wa(等待IO) st(虚拟化偷取)
# 查看活动和非活动内存
vmstat -a 2 5
# 查看磁盘统计信息
vmstat -d
# 查看slab信息
vmstat -m
# 查看分区级别统计
vmstat -p /dev/sda1 2 5
# 以时间戳格式输出(方便日志分析)
vmstat -t 2 5
# vmstat 性能判断标准:
# r值持续大于CPU核心数 -> CPU瓶颈
# b值持续大于0 -> I/O瓶颈
# si/so持续大于0 -> 内存不足,发生swap
# cs值异常高 -> 上下文切换过多(可能线程数过多)
# wa值持续大于20% -> 磁盘I/O瓶颈内存监控
free 内存监控
# 以MB为单位显示内存使用情况
free -m
# 以GB为单位显示
free -h
# 每隔2秒刷新一次
free -h -s 2
# 输出说明:
# total: 总内存
# used: 已使用内存
# free: 空闲内存
# shared: 共享内存
# buff/cache: 缓冲和缓存
# available: 实际可用内存(包含可回收的缓存)
# 显示详细内存信息(包含low/high)
free -h -l
# 以宽格式显示(旧版兼容)
free -h -w
# 持续监控内存并记录到日志
free -h -s 60 >> /var/log/memory_monitor.log &/proc/meminfo 深入分析
# 查看完整的内存信息
cat /proc/meminfo
# 关键字段说明:
# MemTotal: 物理内存总量
# MemFree: 空闲内存
# MemAvailable: 可用内存(含可回收缓存)
# Buffers: 块设备缓冲区大小
# Cached: 页面缓存大小
# SwapCached: 被缓存的swap大小
# Active: 活跃内存(近期被访问)
# Inactive: 非活跃内存(近期未被访问)
# SwapTotal: swap总量
# SwapFree: swap空闲量
# Dirty: 需要写回磁盘的脏页
# Writeback: 正在写回磁盘的脏页
# AnonPages: 匿名映射页(进程堆栈)
# Mapped: 文件映射页
# Slab: 内核slab缓存
# SReclaimable: 可回收的slab缓存
# SUnreclaim: 不可回收的slab缓存
# HugePages_Total: 大页总量
# HugePages_Free: 空闲大页数量
# 提取关键内存指标
awk '/MemTotal/{total=$2} /MemAvailable/{avail=$2} END{printf "总内存: %.1fGB\n可用内存: %.1fGB\n使用率: %.1f%%\n", total/1048576, avail/1048576, (1-avail/total)*100}' /proc/meminfo
# 查看大页使用情况
grep -i huge /proc/meminfo
# 查看透明大页(THP)状态
cat /sys/kernel/mm/transparent_hugepage/enabled
# 输出: always [madvise] never
# 数据库环境建议关闭THP: echo never > /sys/kernel/mm/transparent_hugepage/enabled
# 查看内存碎片情况
cat /proc/buddyinfo
# 查看slab缓存详情
slabtop -o -s cpmap 进程内存映射
# 查看指定进程的内存映射详情
pmap -x 12345
# 查看进程内存汇总
pmap -x 12345 | tail -1
# 以更详细的格式查看
pmap -XX 12345
# 输出字段说明:
# Address: 内存地址范围
# Kbytes: 映射大小(KB)
# RSS: 常驻内存(实际使用的物理内存)
# Dirty: 脏页大小
# Mode: 权限(r=读,w=写,x=执行,s=共享,p=私有)
# Mapping: 映射的文件或区域名称磁盘 I/O 监控
iostat 磁盘 I/O 统计
# 查看所有磁盘的I/O统计(扩展模式)
iostat -x 2 5
# 仅查看指定磁盘
iostat -x sda 2 5
# 输出关键字段说明:
# %util: 磁盘繁忙程度(接近100%表示饱和)
# await: 平均I/O等待时间(毫秒)
# svctm: 平均服务时间
# r/s w/s: 每秒读写请求数
# rkB/s wkB/s: 每秒读写吞吐量(KB)
# 查看NFS文件系统统计
iostat -n 2 5
# 以KB/MB为单位显示
iostat -x -k 2 5
iostat -x -m 2 5
# iostat 性能判断标准:
# %util > 80%: 磁盘接近饱和,需要关注
# await > 20ms: I/O延迟过高(SSD应<5ms)
# avgqu-sz > 3: I/O队列深度过大,说明磁盘处理不过来
# svctm 接近 await: 说明几乎没有排队等待
# 查看系统启动以来的累计统计
iostat
# 查看CPU和磁盘的综合报告
iostat -c -d -x 2 5iotop 实时 I/O 监控
# 安装
yum install -y iotop
# 实时查看进程I/O
iotop
# 只显示有I/O活动的进程
iotop -o
# 只显示指定PID的I/O
iotop -p 12345
# 非交互模式(脚本中使用)
iotop -b -n 1 -o
# 以累计模式显示
iotop -a
# 按磁盘写入排序
iotop -o -Ppidstat 进程级资源监控
# 查看所有进程的CPU使用情况
pidstat -u 2 5
# 查看指定进程的CPU使用
pidstat -u -p 12345 2 5
# 查看所有进程的内存使用
pidstat -r 2 5
# 查看指定进程的内存使用
pidstat -r -p 12345 2 5
# 查看所有进程的I/O使用
pidstat -d 2 5
# 查看指定进程的I/O使用
pidstat -d -p 12345 2 5
# 查看所有进程的上下文切换
pidstat -w 2 5
# 查看所有进程的线程统计
pidstat -t 2 5
# 查看进程的页面错误
pidstat -r -p 12345 -s
# 综合报告(CPU+内存+I/O+上下文切换)
pidstat -urd -h 2 5
# 输出关键字段说明:
# UID: 进程用户ID
# PID: 进程ID
# %usr: 用户空间CPU使用率
# %system: 内核空间CPU使用率
# %CPU: 总CPU使用率
# %MEM: 内存使用率
# minflt/s: 每秒次缺页错误(不需要从磁盘读取)
# majflt/s: 每秒主缺页错误(需要从磁盘读取)
# VSZ: 虚拟内存大小
# RSS: 常驻内存大小
# read_kB/s: 每秒读取KB
# write_kB/s: 每秒写入KB
# cswch/s: 每秒自愿上下文切换
# nvcswch/s: 每秒非自愿上下文切换网络监控
ss 网络连接统计
# 查看所有TCP连接
ss -tan
# 查看所有监听端口
ss -tlnp
# 查看所有UDP连接
ss -uanp
# 按状态统计TCP连接
ss -tan | awk 'NR>1 {print $1}' | sort | uniq -c | sort -rn
# 常见TCP状态说明:
# ESTAB: 已建立连接
# TIME-WAIT: 等待足够时间确保远程TCP收到连接中断请求的确认
# CLOSE-WAIT: 对方已关闭连接,本地尚未关闭
# SYN-SENT: 已发送连接请求,等待确认
# SYN-RECV: 已收到并发送连接请求,等待对方确认
# FIN-WAIT-1: 已发送关闭请求
# FIN-WAIT-2: 已收到对方确认,等待对方发送关闭请求
# LAST-ACK: 等待远程TCP对连接中断请求的确认
# 统计各状态的连接数(排查连接泄漏)
ss -tan state established | wc -l
ss -tan state time-wait | wc -l
ss -tan state close-wait | wc -l
# 查看某个端口的所有连接
ss -tanp sport = :80
ss -tanp dport = :3306
# 查看某个进程的所有网络连接
ss -tanp pid = 12345
# 查看socket统计摘要
ss -s
# 查看所有TCP socket选项
ss -ti
# 按连接数排序查看IP地址
ss -tan state established | awk '{print $4}' | cut -d: -f1 | sort | uniq -c | sort -rn | head -20sar 网络监控
# 查看网络接口流量
sar -n DEV 2 5
# 查看网络错误统计
sar -n EDEV 2 5
# 查看TCP连接统计
sar -n TCP,ETCP 2 5
# 查看SOCKET统计
sar -n SOCK 2 5
# 查看IPv4流量统计
sar -n IP 2 5
# 查看ICMP统计
sar -n ICMP,EICMP 2 5
# 关键字段说明:
# rxpck/s: 每秒接收包数
# txpck/s: 每秒发送包数
# rxkB/s: 每秒接收字节数(KB)
# txkB/s: 每秒发送字节数(KB)
# rxerr/s: 每秒接收错误包数
# txerr/s: 每秒发送错误包数
# %ifutil: 接口利用率网络抓包与诊断
# tcpdump 抓包(需要安装tcpdump)
yum install -y tcpdump
# 抓取指定网卡的HTTP流量
tcpdump -i eth0 port 80
# 抓取指定IP的通信
tcpdump -i eth0 host 192.168.1.100
# 抓取指定网段的所有流量
tcpdump -i eth0 net 192.168.1.0/24
# 保存抓包到文件
tcpdump -i eth0 -w /tmp/capture.pcap
# 读取抓包文件
tcpdump -r /tmp/capture.pcap
# 抓取指定端口的TCP SYN包
tcpdump -i eth0 'tcp[tcpflags] & (tcp-syn) != 0 and port 3306'
# 抓取指定数量的包
tcpdump -i eth0 -c 100
# 以十六进制+ASCII显示包内容
tcpdump -i eth0 -X -c 10
# nc 端口连通性测试
nc -zv 192.168.1.100 3306
nc -zv 192.168.1.100 80
nc -zv 192.168.1.100 443
# 跟踪路由
traceroute 8.8.8.8
traceroute -n -w 2 -q 2 8.8.8.8 # 不解析域名,超时2秒,每个hop发2个包
# mtr 网络质量综合诊断
mtr 8.8.8.8
mtr -r -c 10 8.8.8.8 # 报告模式,发10个包
# 查看网络接口详细信息
ip -s link show eth0
# 查看ARP表
ip neigh show
arp -a
# 查看路由表
ip route show
route -n综合系统监控
sar 系统活动报告
# 安装sysstat包(包含sar)
yum install -y sysstat
systemctl enable --now sysstat
# 修改sar采样间隔(默认10分钟)
cat /etc/sysconfig/sysstat
# HISTORY=7 # 保留7天的数据
# COMPRESSAFTER=10 # 10天后压缩
# SADC_OPTIONS="-S DISK" # 采集磁盘数据
# 修改采集频率(默认每10分钟)
cat /etc/cron.d/sysstat
# */10 * * * * root /usr/lib64/sa/sa1 1 1
# 查看CPU使用情况(今天)
sar -u
# 查看指定日期的CPU历史数据
sar -u -f /var/log/sa/sa12
# 查看内存使用情况
sar -r 2 5
# 查看内存和swap的详细信息
sar -r ALL 2 5
# 查看大页使用情况
sar -H 2 5
# 查看内核表统计
sar -v 2 5
# 查看磁盘I/O情况
sar -d 2 5
# 查看指定磁盘的I/O
sar -d -p sda 2 5
# 查看网络流量
sar -n DEV 2 5
# 查看网络TCP连接统计
sar -n TCP,ETCP 2 5
# 查看上下文切换和中断
sar -w 2 5
# 查看运行队列和平均负载
sar -q 2 5
# 查看文件系统使用情况
sar -F 2 5
# 生成每日系统报告
sar -A > /root/sar_report_$(date +%Y%m%d).txt
# 查看sar数据保留天数
cat /etc/sysconfig/sysstat | grep HISTORY
# sa2 生成每日报告(默认已配置在cron中)
/usr/lib64/sa/sa2 -Adstat 多功能系统监控
# 安装
yum install -y dstat
# 默认输出(CPU、磁盘、网络、分页、系统)
dstat
# 每2秒刷新一次
dstat 2
# 查看CPU使用率(分解为user/system/idle/wait/hard/soft/steal)
dstat -c
# 查看磁盘读写速率
dstat -d
# 查看网络收发速率
dstat -n
# 查看内存使用
dstat -m
# 查看分页活动
dstat -p
# 查看系统信息(中断+上下文切换)
dstat -y
# 查看最耗CPU/内存的进程
dstat --top-cpu
dstat --top-mem
dstat --top-io
dstat --top-latency
# 组合查看(CPU+磁盘+网络+最耗CPU进程)
dstat -cdngy --top-cpu 2
# 输出到CSV文件
dstat -cdngy --output /tmp/dstat.csv 2
# 查看指定时间范围内的数据
dstat -t 2uptime 与平均负载
# 查看系统运行时间和平均负载
uptime
# 查看详细信息
cat /proc/loadavg
# 输出: 1.25 0.98 0.76 2/432 12345
# | | | | |
# | | | | +-- 最近运行的进程PID
# | | | +-- 运行进程数/总进程数
# | | +-- 15分钟平均负载
# | +-- 5分钟平均负载
# +-- 1分钟平均负载
# 平均负载判断标准:
# 单核CPU: load > 1 表示过载
# 4核CPU: load > 4 表示过载
# 8核CPU: load > 8 表示过载
# 一般经验:load不超过CPU核心数的70%为正常
# 查看CPU核心数
nproc
lscpu | grep "^CPU(s):"
cat /proc/cpuinfo | grep "processor" | wc -l
# 结合核心数判断负载是否过高
echo "CPU核心数: $(nproc)"
echo "1分钟负载: $(cat /proc/loadavg | awk '{print $1}')"
echo "5分钟负载: $(cat /proc/loadavg | awk '{print $2}')"
echo "15分钟负载: $(cat /proc/loadavg | awk '{print $3}')"磁盘空间与文件系统监控
df 磁盘使用率
# 查看文件系统使用情况
df -h
# 查看指定类型的文件系统
df -h -t ext4
# 查看inode使用情况
df -i
# 查看所有文件系统(包括伪文件系统)
df -ha
# 查看指定挂载点
df -h /data
df -h /var
# 按使用率排序
df -h | sort -k5 -rn | head -10
# 查看block大小
df -hT
# 查找使用率超过80%的分区
df -h | awk 'NR>1 && int($5) > 80 {print $6, $5}'
# 查看inode使用率超过80%的分区
df -i | awk 'NR>1 && int($5) > 80 {print $6, $5}'du 目录大小统计
# 查看当前目录的总大小
du -sh .
# 查看当前目录下各子目录大小
du -sh */ 2>/dev/null | sort -rh
# 查看指定目录的总大小
du -sh /var/log
# 查看指定目录下各子目录大小(按大小排序)
du -h /var/log --max-depth=1 | sort -rh
# 查看当前目录下最大的前10个文件/目录
du -ah . 2>/dev/null | sort -rh | head -10
# 只显示目录大小(不包含文件)
du -sh --max-depth=1 / | sort -rh
# 排除某些目录
du -sh / --exclude=/proc --exclude=/sys
# 统计指定类型的文件总大小
find /var/log -name "*.log" -exec du -ch {} + | grep total
# 查看某个分区下最大的目录
du -xh / | sort -rh | head -20
# -x 参数限制在同一文件系统,避免遍历挂载点lsblk 和 blkid
# 查看块设备信息(树形结构)
lsblk
# 查看详细信息(包括UUID、文件系统类型)
lsblk -f
# 查看设备大小和挂载点
lsblk -o NAME,SIZE,TYPE,MOUNTPOINT,FSTYPE
# 查看块设备UUID
blkid
# 查看指定设备的详细信息
blkid /dev/sda1perf 内核级性能分析
perf 基本使用
# 安装perf工具
yum install -y perf
# 实时查看系统热点函数(类似top)
perf top
# 对指定命令进行性能分析
perf stat nginx -t
# 采样分析指定进程(PID)
perf record -g -p 12345 sleep 30
perf report
# 分析CPU缓存命中情况
perf stat -e cache-misses,cache-references ./my_program
# 查看系统级性能事件
perf list
# 跟踪系统调用
perf trace -p 12345
# 火焰图生成(需要FlameGraph工具)
perf record -g -p 12345 sleep 60
perf script | /opt/FlameGraph/stackcollapse-perf.pl | /opt/FlameGraph/flamegraph.pl > flamegraph.svg
# perf stat 详细输出
perf stat -d sleep 5
# 分析指定事件的计数
perf stat -e cycles,instructions,cache-references,cache-misses,branch-instructions,branch-misses ./my_program
# 分析进程的内存访问
perf stat -e cache-misses,cache-references,dTLB-load-misses,dTLB-store-misses ./my_program
# 记录调度器事件
perf record -e sched:sched_switch -a sleep 10
perf scriptperf 高级用法
# 分析内核函数调用频率
perf record -f -a -g -e cpu-clock:sleep 10
perf report --stdio
# 分析指定函数的调用路径
perf record -g -p 12345 -e cpu-clock -- sleep 30
perf report -g graph,0.5,caller
# 查看进程的系统调用耗时
perf trace -e 'syscalls:sys_enter_*' -p 12345
# 统计系统调用频率
perf trace -e 'syscalls:sys_enter_*' -a sleep 10 2>&1 | awk '{print $NF}' | sort | uniq -c | sort -rn | head -20
# offcpu分析(分析进程不在CPU上运行的时间)
perf record -e sched:sched_stat_sleep -e sched:sched_switch -a -g -- sleep 30
perf report
# 分析锁竞争
perf record -e lock:lock_acquire -e lock:lock_release -a -g -- sleep 30
perf report系统监控最佳实践
自动化监控脚本
# 综合系统监控脚本
cat > /usr/local/bin/sys_monitor.sh << 'SCRIPT'
#!/bin/bash
LOG_FILE="/var/log/sys_monitor.log"
ALERT_FILE="/var/log/sys_alert.log"
TIMESTAMP=$(date "+%Y-%m-%d %H:%M:%S")
HOSTNAME=$(hostname)
echo "===== System Monitor Report - $TIMESTAMP ($HOSTNAME) =====" >> "$LOG_FILE"
# CPU使用率
CPU_IDLE=$(top -b -n 1 | grep "Cpu(s)" | awk '{print $8}' | cut -d'.' -f1)
CPU_USED=$((100 - CPU_IDLE))
# 内存使用率
MEM_INFO=$(free -m | awk 'NR==2{printf "%d/%dMB (%.1f%%)", $3, $2, $3*100/$2}')
MEM_USED_PCT=$(free | awk 'NR==2{printf "%.0f", $3*100/$2}')
# Swap使用率
SWAP_INFO=$(free -m | awk 'NR==3{printf "%d/%dMB", $3, $2}')
# 磁盘使用率
DISK_INFO=$(df -h / | awk 'NR==2{print $5}')
DISK_USED_PCT=$(df -h / | awk 'NR==2{print $5}' | tr -d '%')
# 平均负载和核心数
LOAD_AVG=$(cat /proc/loadavg | awk '{print $1, $2, $3}')
CPU_CORES=$(nproc)
LOAD_1MIN=$(cat /proc/loadavg | awk '{print $1}')
# 网络连接统计
ESTAB_CONN=$(ss -tan state established | wc -l)
TIME_WAIT_CONN=$(ss -tan state time-wait | wc -l)
CLOSE_WAIT_CONN=$(ss -tan state close-wait | wc -l)
# 进程统计
ZOMBIE_COUNT=$(ps aux | awk '$8 ~ /Z/ {print}' | wc -l)
TOTAL_PROC=$(ps aux | wc -l)
# 磁盘I/O(iostat)
IO_UTIL=$(iostat -x 1 2 | awk 'NR>=4 && $14 ~ /[0-9]/ {sum+=$14; count++} END{if(count>0) printf "%.0f", sum/count; else print "N/A"}')
echo "CPU使用率: ${CPU_USED}%" >> "$LOG_FILE"
echo "内存使用: ${MEM_INFO}" >> "$LOG_FILE"
echo "Swap使用: ${SWAP_INFO}" >> "$LOG_FILE"
echo "磁盘使用: ${DISK_INFO}" >> "$LOG_FILE"
echo "平均负载: ${LOAD_AVG} (CPU核心数: ${CPU_CORES})" >> "$LOG_FILE"
echo "网络连接: ESTABLISHED=${ESTAB_CONN}, TIME_WAIT=${TIME_WAIT_CONN}, CLOSE_WAIT=${CLOSE_WAIT_CONN}" >> "$LOG_FILE"
echo "进程统计: 总数=${TOTAL_PROC}, 僵尸=${ZOMBIE_COUNT}" >> "$LOG_FILE"
echo "磁盘I/O利用率: ${IO_UTIL}%" >> "$LOG_FILE"
# 告警逻辑
send_alert() {
local msg="[$TIMESTAMP][$HOSTNAME] $1"
echo "$msg" >> "$ALERT_FILE"
echo "$msg" # 可替换为邮件/钉钉/企业微信通知
}
if [ "$CPU_USED" -gt 80 ]; then
send_alert "告警: CPU使用率 ${CPU_USED}% 超过80%!"
fi
if [ "$MEM_USED_PCT" -gt 85 ]; then
send_alert "告警: 内存使用率 ${MEM_USED_PCT}% 超过85%!"
fi
if [ "$DISK_USED_PCT" -gt 85 ]; then
send_alert "告警: 磁盘使用率 ${DISK_USED_PCT}% 超过85%!"
fi
if [ "$CLOSE_WAIT_CONN" -gt 200 ]; then
send_alert "告警: CLOSE_WAIT连接数 ${CLOSE_WAIT_CONN} 过多!"
fi
if [ "$ZOMBIE_COUNT" -gt 10 ]; then
send_alert "告警: 僵尸进程数 ${ZOMBIE_COUNT} 超过10!"
fi
echo "" >> "$LOG_FILE"
SCRIPT
chmod +x /usr/local/bin/sys_monitor.sh
# 配合crontab每5分钟执行一次
echo "*/5 * * * * /usr/local/bin/sys_monitor.sh" | crontab -一键系统巡检脚本
cat > /usr/local/bin/system_check.sh << 'SCRIPT'
#!/bin/bash
echo "=========================================="
echo " 系统巡检报告 - $(date '+%Y-%m-%d %H:%M:%S')"
echo " 主机名: $(hostname)"
echo "=========================================="
echo -e "\n[1] 系统基本信息"
echo " 操作系统: $(cat /etc/redhat-release 2>/dev/null || cat /etc/os-release | grep PRETTY_NAME | cut -d'"' -f2)"
echo " 内核版本: $(uname -r)"
echo " 运行时间: $(uptime -p)"
echo " CPU核心数: $(nproc)"
echo " 总内存: $(free -h | awk 'NR==2{print $2}')"
echo -e "\n[2] CPU使用率 TOP5"
ps aux --sort=-%cpu | head -6 | awk '{printf " %-8s %-8s %-6s %-6s %s\n", $1, $2, $3"%", $4"%", $11}'
echo -e "\n[3] 内存使用率 TOP5"
ps aux --sort=-%mem | head -6 | awk '{printf " %-8s %-8s %-6s %-6s %s\n", $1, $2, $3"%", $4"%", $11}'
echo -e "\n[4] 磁盘使用率"
df -h | awk 'NR==1 || $6 != ""' | head -10 | awk '{printf " %-20s %-8s %-8s %-8s %s\n", $1, $2, $3, $5, $6}'
echo -e "\n[5] 网络连接统计"
echo " ESTABLISHED: $(ss -tan state established | wc -l)"
echo " TIME_WAIT: $(ss -tan state time-wait | wc -l)"
echo " CLOSE_WAIT: $(ss -tan state close-wait | wc -l)"
echo " LISTEN: $(ss -tlnp | wc -l)"
echo -e "\n[6] 异常进程"
ZOMBIE=$(ps aux | awk '$8 ~ /Z/ {print}' | wc -l)
echo " 僵尸进程数: $ZOMBIE"
echo -e "\n[7] 最近登录"
last -n 5 | awk '{printf " %-12s %-20s %-20s %s\n", $1, $2, $3" "$4" "$5, $6}'
echo -e "\n[8] 系统错误日志(最近10条)"
journalctl -p err -n 10 --no-pager 2>/dev/null | tail -10 | while read line; do
echo " $line"
done
echo -e "\n=========================================="
echo " 巡检完成"
echo "=========================================="
SCRIPT
chmod +x /usr/local/bin/system_check.sh常用性能分析场景
# 场景1: 服务器响应变慢,判断是CPU还是I/O瓶颈
# 步骤1: 查看平均负载和CPU核心数
echo "负载: $(cat /proc/loadavg | awk '{print $1, $2, $3}'), 核心数: $(nproc)"
# 步骤2: 查看CPU使用率和I/O等待
vmstat 1 5
# 步骤3: 查看磁盘I/O
iostat -x 1 5
# 步骤4: 查看最耗CPU的进程
ps aux --sort=-%cpu | head -11
# 步骤5: 查看最耗I/O的进程
iotop -b -n 1 -o
# 场景2: 内存使用率持续增长,怀疑内存泄漏
# 步骤1: 查看总体内存
free -h
# 步骤2: 查看各进程内存使用
ps aux --sort=-%mem | head -11
# 步骤3: 查看指定进程的详细内存
pidstat -r -p <PID> 2 5
# 步骤4: 查看可回收的缓存
echo "可回收缓存: $(awk '/SReclaimable/{print $2}' /proc/meminfo) kB"
# 步骤5: 查看swap使用(如果swap在增长说明内存确实不足)
vmstat 1 5 # 关注si/so列
# 场景3: 网络连接数异常
# 步骤1: 查看连接统计
ss -s
# 步骤2: 按状态分类统计
ss -tan | awk 'NR>1 {print $1}' | sort | uniq -c | sort -rn
# 步骤3: 查看连接最多的IP
ss -tan state established | awk '{print $4}' | cut -d: -f1 | sort | uniq -c | sort -rn | head -20
# 步骤4: 查看连接最多的进程
ss -tanp | awk '{print $7}' | cut -d, -f2 | sort | uniq -c | sort -rn | head -20
# 场景4: 磁盘空间告警
# 步骤1: 查看分区使用率
df -h | sort -k5 -rn | head -10
# 步骤2: 找最大的目录
du -xh / | sort -rh | head -20
# 步骤3: 检查大文件
find / -xdev -type f -size +100M -exec ls -lh {} \; 2>/dev/null | sort -k5 -rh | head -20
# 步骤4: 检查已删除但未释放空间的文件
lsof +L1 2>/dev/null | awk '{print $7, $1, $2, $NF}' | sort -rn | head -20
# 场景5: 上下文切换过高
# 步骤1: 查看上下文切换频率
vmstat 1 5 # 关注cs列
# 步骤2: 查看各进程的上下文切换
pidstat -w 2 5
# 步骤3: 查看中断频率
mpstat -I SUM 2 5
# 步骤4: 查看线程数最多的进程
ps -eo nlwp,pid,cmd | sort -rn | head -10优点
缺点
总结
系统监控与性能分析是保障服务器稳定运行的重要手段。通过 top/htop 监控进程状态、vmstat 分析系统整体负载、iostat 定位磁盘瓶颈、sar 回溯历史趋势、perf 深入分析性能热点,运维工程师可以构建起全方位的监控体系。建议在生产环境中建立自动化监控与告警机制,将各类工具的输出接入统一的可观测性平台,实现从被动响应到主动预防的转变。
关键知识点
- 部署类主题的核心不是"装成功",而是"稳定运行、可排障、可回滚"。
- 同一个服务通常至少要关注版本、目录、端口、权限、数据、日志和备份。
- Linux 问题经常跨越系统层、网络层、服务层和应用层。
项目落地视角
- 把安装步骤补成可重复执行的清单,必要时写成脚本或配置文件。
- 把配置目录、数据目录、日志目录和挂载点明确拆开。
- 上线前检查防火墙、SELinux、时区、磁盘、系统服务和健康检查。
常见误区
- 使用 latest 或未固定版本,导致环境不可复现。
- 只验证启动成功,不验证持久化、开机自启和故障恢复。
- 遇到问题先改配置而不是先看日志和依赖链路。
进阶路线
- 继续补齐 systemd、性能监控、安全加固和备份恢复。
- 把单机操作升级成 Docker、Kubernetes 或 IaC 方案。
- 建立标准化运维手册,包括巡检、扩容、回滚和灾备演练。
适用场景
- 当你准备把《系统监控与性能分析》真正落到项目里时,最适合先在一个独立模块或最小样例里验证关键路径。
- 适合单机环境初始化、中间件快速搭建、测试环境验证和生产部署前准备。
- 当服务稳定性依赖端口、权限、目录、网络和系统参数时,这类主题会直接影响成败。
落地建议
- 固定版本号与镜像标签,避免"latest"带来的不可预期变化。
- 把配置、数据、日志目录拆开管理,并记录恢复步骤。
- 上线前确认端口、防火墙、SELinux、时区和磁盘空间。
排错清单
- 先查 systemctl、容器日志和应用日志,确认失败发生在哪一层。
- 检查端口占用、目录权限、挂载路径和网络连通性。
- 如果是新环境问题,优先对比与已知正常环境的差异。
复盘问题
- 如果把《系统监控与性能分析》放进你的当前项目,最先要验证的输入、输出和失败路径分别是什么?
- 《系统监控与性能分析》最容易在什么规模、什么边界条件下暴露问题?你会用什么指标或日志去确认?
- 相比默认实现或替代方案,采用《系统监控与性能分析》最大的收益和代价分别是什么?
