教程目录
Linux 系统监控 - 性能监控工具与实践
深入学习Ubuntu 24.10 Server系统监控的核心工具和技术,掌握htop、iotop、netstat、ss等监控工具的使用,学会系统性能分析和问题诊断。通过生活化类比和渐进式实践,让初学者轻松掌握系统监控技能。
🚀 实践环境(SSH)
欢迎使用Easylearning为您专属打磨的自由学习实践环境, 登录后马上开始边学边练吧!
StudyBoard
创建StudyBoard练习实例,系统自动连接到实例后,可以在教程中直接发送远程命令到实例中执行并能查看结果,享受更好的学习体验。
Linux 系统监控 - 性能监控工具与实践
系统监控是Linux运维的核心技能,就像医生为病人做健康检查一样重要。在掌握了Web服务器配置的基础上,我们现在要学习如何监控系统的"健康状况",及时发现和解决性能问题。本教程将通过生活化类比和实践操作,帮助您掌握系统监控的核心技能。
🎯 学习目标
完成本章学习后,您将能够:
- 监控概念理解: 深入理解系统监控的重要性和在运维中的核心作用
- 基础工具掌握: 熟练使用top、htop、ps等进程监控工具进行系统分析
- 资源监控技能: 学会内存、磁盘、网络等系统资源的监控和分析方法
- 性能分析能力: 掌握系统负载分析和性能瓶颈诊断的实用技能
- 监控脚本编写: 能够编写自动化监控脚本和配置告警系统
🏗️ 系统监控核心概念
系统监控是什么?
官方定义: 根据Linux官方文档,系统监控是一种持续收集、分析和展示计算机系统运行状态数据的技术和过程,通过实时监测CPU、内存、磁盘、网络等系统资源的使用情况,为系统管理员提供性能分析、故障诊断和容量规划的科学依据。
生活化类比: 系统监控就像现代化的智能医疗监护系统:
- 医疗监护仪 = 监控工具(htop、iotop),实时显示"生命体征"
- 心电图 = CPU使用率曲线,反映系统"心跳"状况
- 血压计 = 内存监控,检查系统"血液循环"
- 体温计 = 磁盘I/O监控,监测系统"新陈代谢"
- 听诊器 = 网络监控,检查系统"呼吸"状况
- 医生查房 = 定期巡检脚本,主动发现潜在问题
- 病历记录 = 监控日志,记录系统"健康档案"
为什么监控如此重要?
在上一节Web服务器配置中,我们学会了如何搭建Nginx和Apache服务。但是,仅仅搭建好服务是不够的,我们还需要确保这些服务能够稳定运行,为用户提供良好的访问体验。
监控的核心价值:
🔍 预防性维护价值
- 故障预防:就像定期体检能发现疾病征兆,监控能在故障发生前预警
- 性能优化:识别Web服务器的性能瓶颈,优化用户访问体验
- 容量规划:预测网站访问量增长,提前扩容服务器资源
⚡ 运维管理价值
- 快速定位:当网站访问缓慢时,快速定位是CPU、内存还是网络问题
- 根因分析:通过监控数据分析,找到问题的真正原因
- 变更影响评估:部署新版本后,监控性能变化情况
🎯 业务保障价值
- 服务可用性:确保Web服务器7×24小时稳定运行
- 用户体验:监控网站响应时间,保障用户访问速度
- 安全防护:监控异常访问模式,及时发现安全威胁
监控层次架构详解
Linux系统监控采用分层架构设计,从底层硬件到上层应用形成完整的监控体系。每一层都有其特定的监控重点和技术手段。
硬件层监控原理
- CPU监控:通过/proc/stat、/proc/cpuinfo等虚拟文件系统获取CPU使用率、负载、温度等信息
- 内存监控:读取/proc/meminfo获取内存使用情况,包括物理内存、缓存、交换空间等
- 磁盘监控:通过/proc/diskstats、/sys/block等接口监控磁盘I/O性能和空间使用
- 网络监控:利用/proc/net/dev、netlink socket等机制监控网络流量和连接状态
系统层监控原理
- 进程监控:通过/proc/[pid]/目录下的文件获取进程的CPU、内存使用情况和状态信息
- 服务监控:结合systemd、init系统监控服务状态,通过端口扫描检查服务可用性
- 内核监控:利用sysctl、/proc/sys等接口监控内核参数和系统调用统计
应用层监控原理
- 应用监控:通过应用程序提供的metrics接口或日志分析获取业务指标
- 日志监控:实时分析应用日志,提取错误信息和性能数据
- 指标监控:收集自定义业务指标,如用户访问量、交易成功率等
📊 基础监控工具
🏗️ 实验环境准备
在开始学习监控工具之前,让我们先准备好实验环境:
top 命令 - 实时进程监控
# 基本使用
top # 启动 top 监控
top -p 1234 # 监控特定进程
top -u username # 监控特定用户的进程
top -n 1 # 只显示一次快照
# top 界面操作
# 在 top 运行时按键:
# h - 显示帮助
# q - 退出
# k - 终止进程
# r - 重新设置进程优先级
# M - 按内存使用排序
# P - 按 CPU 使用排序
# T - 按运行时间排序
# 1 - 显示所有 CPU 核心
top 输出详解:
top命令的输出包含系统概览和进程详情两部分,每个字段都有其特定含义:
系统概览部分:
- 系统时间和运行时间:当前时间、系统运行时长、登录用户数
- 负载平均值:1分钟、5分钟、15分钟的平均负载,反映系统繁忙程度
- 任务统计:总进程数、运行/睡眠/停止/僵尸进程数量
- CPU使用率:用户态(us)、系统态(sy)、空闲(id)、等待I/O(wa)等
- 内存使用情况:总内存、已用、空闲、缓冲区/缓存、可用内存
进程详情部分:
- PID:进程ID,系统唯一标识符
- USER:进程所有者用户名
- PR/NI:优先级(Priority)和Nice值,影响进程调度
- VIRT/RES/SHR:虚拟内存、物理内存、共享内存使用量
- S:进程状态(R=运行,S=睡眠,D=不可中断睡眠,Z=僵尸)
- %CPU/%MEM:CPU和内存使用百分比
- TIME+:进程累计CPU使用时间
- COMMAND:启动进程的命令
# top 输出示例及详细解释
top - 14:30:25 up 5 days, 2:15, 3 users, load average: 0.15, 0.25, 0.20
# 当前时间 运行时长 用户数 1分钟 5分钟 15分钟负载
Tasks: 245 total, 1 running, 244 sleeping, 0 stopped, 0 zombie
# 总进程数 运行中 睡眠中 停止的 僵尸进程
%Cpu(s): 2.3 us, 1.2 sy, 0.0 ni, 96.2 id, 0.3 wa, 0.0 hi, 0.0 si, 0.0 st
# CPU使用率: 用户态 系统态 nice值 空闲 I/O等待 硬中断 软中断 虚拟化
MiB Mem : 7936.2 total, 1234.5 free, 3456.7 used, 3245.0 buff/cache
# 内存(MB): 总内存 空闲内存 已用内存 缓冲区/缓存
MiB Swap: 2048.0 total, 2048.0 free, 0.0 used. 4123.4 avail Mem
# 交换空间: 总交换空间 空闲交换 已用交换 实际可用内存
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1234 root 20 0 123456 45678 12345 S 5.2 0.6 1:23.45 nginx
5678 www-data 20 0 98765 32109 8765 S 3.1 0.4 0:45.67 apache2
# 进程ID 用户 优先级 Nice 虚拟内存 物理内存 共享内存 状态 CPU% 内存% 运行时间 命令
✅ 学习检查点1:基础监控概念
自检问题:
- 能否解释监控的三个层次(硬件层、系统层、应用层)?
- 能否区分top命令中的%CPU和%MEM含义?
- 能否说出load average三个数值分别代表什么时间段?
htop - 增强版进程监控
# 安装 htop
sudo apt update
sudo apt install htop
# 使用 htop
htop # 启动 htop
htop -u username # 监控特定用户
htop -p 1234,5678 # 监控特定进程
htop 优势特性:
- 彩色界面,更直观
- 支持鼠标操作
- 树状进程显示
- 内置进程搜索和过滤
- 支持多种排序方式
ps 命令 - 进程快照
💾 内存监控工具
free 命令 - 内存使用情况
内存指标详解:
Linux内存管理采用复杂的缓存策略,理解各项指标的真实含义对于准确评估系统内存状态至关重要:
- total: 系统总物理内存容量,由硬件决定
- used: 当前被进程实际使用的内存,不包括缓存
- free: 完全未使用的内存,通常数值较小是正常现象
- shared: 多个进程共享的内存区域,如共享库和IPC
- buff/cache:
- buffers: 块设备I/O缓冲区,用于磁盘读写优化
- cached: 页面缓存,存储文件内容以加速访问
- available: 真正可用于新进程的内存,包括free + 可释放的cache
内存使用评估原则:
- 关注available而非free:Linux会充分利用内存作为缓存
- buff/cache可以被快速释放:当进程需要内存时,系统会自动释放缓存
- 真正的内存压力指标:available接近0或swap使用量增加
vmstat 命令 - 虚拟内存统计
# vmstat 基本使用
vmstat # 显示系统统计信息
vmstat 5 # 每 5 秒显示一次
vmstat 5 10 # 每 5 秒显示一次,共 10 次
vmstat -a # 显示活跃和非活跃内存
vmstat -s # 显示内存统计摘要
# vmstat 输出示例
# procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
# r b swpd free buff cache si so bi bo in cs us sy id wa st
# 1 0 0 1234567 89012 345678 0 0 12 34 567 890 5 2 92 1 0
💿 磁盘 I/O 监控
iotop 命令 - I/O 监控
# 安装 iotop
sudo apt install iotop
# iotop 使用
sudo iotop # 启动 iotop(需要 root 权限)
sudo iotop -o # 只显示有 I/O 活动的进程
sudo iotop -a # 显示累积 I/O
sudo iotop -p 1234 # 监控特定进程
sudo iotop -u username # 监控特定用户的进程
iostat 命令 - I/O 统计
# 安装 sysstat 包(包含 iostat)
sudo apt install sysstat
# iostat 使用
iostat # 显示 CPU 和 I/O 统计
iostat -x # 显示扩展统计信息
iostat -x 5 # 每 5 秒显示一次
iostat -x 5 10 # 每 5 秒显示一次,共 10 次
iostat -d # 只显示设备统计
iostat -c # 只显示 CPU 统计
# 磁盘性能分析
iostat -x 1
# Device r/s w/s rkB/s wkB/s rrqm/s wrqm/s %rrqm %wrqm r_await w_await aqu-sz rareq-sz wareq-sz svctm %util
# sda 2.34 5.67 123.45 234.56 0.12 1.23 4.87 17.85 2.34 5.67 0.02 52.73 41.38 1.23 0.98
df 和 du 命令 - 磁盘空间监控
# df - 文件系统磁盘空间使用情况
df -h # 人类可读格式
df -i # 显示 inode 使用情况
df -T # 显示文件系统类型
df /path/to/directory # 显示特定目录所在文件系统
# du - 目录磁盘使用情况
du -h /path/to/dir # 显示目录大小
du -sh /path/to/dir # 只显示总大小
du -ah /path/to/dir # 显示所有文件和目录大小
du -h --max-depth=1 /path/to/dir # 限制显示深度
# 磁盘空间监控脚本
#!/bin/bash
# 检查磁盘使用率
THRESHOLD=80
df -h | awk 'NR>1 {
usage = substr($5, 1, length($5)-1)
if (usage > '$THRESHOLD') {
print "WARNING: " $6 " is " $5 " full"
}
}'
🌐 网络监控工具
netstat 命令 - 网络连接监控
# netstat 基本使用
netstat -tuln # 显示所有监听端口
netstat -tulpn # 显示监听端口和进程信息
netstat -an # 显示所有连接
netstat -rn # 显示路由表
netstat -i # 显示网络接口统计
netstat -s # 显示网络统计信息
# 常用网络监控命令组合
netstat -tuln | grep :80 # 检查 80 端口是否监听
netstat -an | grep ESTABLISHED | wc -l # 统计建立的连接数
netstat -an | grep TIME_WAIT | wc -l # 统计 TIME_WAIT 连接数
ss 命令 - 现代网络监控工具
# ss 命令(推荐使用,比 netstat 更快)
ss -tuln # 显示所有监听端口
ss -tulpn # 显示监听端口和进程信息
ss -an # 显示所有连接
ss -s # 显示统计摘要
ss -o # 显示计时器信息
# ss 高级用法
ss -t state established # 只显示已建立的 TCP 连接
ss -t state time-wait # 只显示 TIME_WAIT 状态的连接
ss dst :80 # 显示目标端口为 80 的连接
ss src 192.168.1.100 # 显示源 IP 为指定地址的连接
# 网络连接监控脚本
#!/bin/bash
echo "=== Network Connection Summary ==="
echo "Listening ports:"
ss -tuln | grep LISTEN
echo -e "\nConnection states:"
ss -tan | awk 'NR>1 {state[$2]++} END {for (s in state) print s": "state[s]}'
echo -e "\nTop 10 connections by remote IP:"
ss -tan | awk 'NR>1 && $1=="ESTAB" {split($5,a,":"); ip[a[1]]++} END {for (i in ip) print ip[i], i}' | sort -nr | head -10
w 命令 - 用户活动监控
# 显示当前登录用户和系统负载
w # 显示所有登录用户
w username # 显示特定用户信息
w -h # 不显示头部信息
w -s # 简短格式
# w 命令输出示例
# 14:30:25 up 5 days, 2:15, 3 users, load average: 0.15, 0.25, 0.20
# USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
# root pts/0 192.168.1.100 12:30 0.00s 0.12s 0.01s w
# user1 pts/1 192.168.1.101 14:00 5:30 0.05s 0.05s vim file.txt
🔧 综合监控工具
nmon - 全面系统监控
# 安装 nmon
sudo apt install nmon
# nmon 使用
nmon # 启动交互式监控
nmon -f -s 30 -c 120 # 后台运行,每30秒采样,共120次
# nmon 交互式按键:
# c - CPU 使用率
# m - 内存使用情况
# d - 磁盘 I/O
# n - 网络统计
# t - 进程信息
# q - 退出
📊 监控数据收集与分析
系统监控脚本示例
#!/bin/bash
# 系统监控数据收集脚本
# 文件名: system_monitor.sh
LOG_FILE="/var/log/system_monitor.log"
DATE=$(date '+%Y-%m-%d %H:%M:%S')
# 创建日志函数
log_info() {
echo "[$DATE] $1" >> $LOG_FILE
}
# CPU 使用率
CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d'%' -f1)
log_info "CPU Usage: ${CPU_USAGE}%"
# 内存使用率
MEMORY_USAGE=$(free | grep Mem | awk '{printf "%.2f", $3/$2 * 100.0}')
log_info "Memory Usage: ${MEMORY_USAGE}%"
# 磁盘使用率
DISK_USAGE=$(df -h / | awk 'NR==2 {print $5}' | cut -d'%' -f1)
log_info "Disk Usage: ${DISK_USAGE}%"
# 系统负载
LOAD_AVG=$(uptime | awk -F'load average:' '{print $2}')
log_info "Load Average:${LOAD_AVG}"
# 网络连接数
CONNECTIONS=$(ss -tan | grep ESTAB | wc -l)
log_info "Active Connections: $CONNECTIONS"
# 检查关键服务状态
SERVICES=("ssh" "nginx" "mysql")
for service in "${SERVICES[@]}"; do
if systemctl is-active --quiet $service; then
log_info "Service $service: Running"
else
log_info "Service $service: Stopped"
fi
done
# 检查磁盘空间警告
df -h | awk 'NR>1 {
usage = substr($5, 1, length($5)-1)
if (usage > 80) {
print "[$DATE] WARNING: " $6 " is " $5 " full"
}
}' >> $LOG_FILE
🎯 实战演练
📊 实际案例分析:Web服务器性能问题诊断
背景:某电商网站在促销期间响应缓慢,需要快速定位问题。
诊断步骤:
- 快速概览:使用
htop
查看整体资源使用情况 - 进程分析:识别高CPU/内存占用进程
- I/O分析:使用
iotop
检查磁盘瓶颈 - 网络分析:使用
ss
检查连接状态
实际操作:
# 第一步:系统概览
htop
# 观察:CPU使用率85%,内存使用率78%
# 第二步:找出问题进程
ps aux --sort=-%cpu | head -10
# 发现:nginx进程占用大量CPU
# 第三步:检查磁盘I/O
sudo iotop -o
# 发现:数据库进程有大量磁盘读写
# 第四步:网络连接分析
ss -tuln | grep :80
ss -tan | grep ESTAB | wc -l
# 发现:大量并发连接
问题定位:数据库查询效率低导致I/O瓶颈,进而影响Web服务响应。
解决方案:
- 优化数据库查询语句
- 增加数据库连接池
- 启用Web服务器缓存
- 考虑负载均衡分散压力
演练1:系统性能分析
# 1. 全面系统检查
echo "=== System Health Check ==="
# 检查系统负载
echo "Current Load:"
uptime
# 检查 CPU 使用率
echo -e "\nTop CPU processes:"
ps aux --sort=-%cpu | head -6
# 检查内存使用
echo -e "\nMemory Usage:"
free -h
# 检查磁盘使用
echo -e "\nDisk Usage:"
df -h
# 检查网络连接
echo -e "\nNetwork Connections:"
ss -tuln | grep LISTEN | head -10
演练2:性能瓶颈诊断
# 2. 性能瓶颈诊断流程
#!/bin/bash
echo "=== Performance Bottleneck Analysis ==="
# CPU 瓶颈检查
CPU_LOAD=$(uptime | awk -F'load average:' '{print $2}' | awk -F',' '{print $1}' | tr -d ' ')
CPU_CORES=$(nproc)
CPU_THRESHOLD=$(echo "$CPU_CORES * 0.8" | bc)
if (( $(echo "$CPU_LOAD > $CPU_THRESHOLD" | bc -l) )); then
echo "⚠️ CPU bottleneck detected!"
echo "Load: $CPU_LOAD, Cores: $CPU_CORES"
echo "Top CPU processes:"
ps aux --sort=-%cpu | head -6
fi
# 内存瓶颈检查
MEMORY_USAGE=$(free | grep Mem | awk '{printf "%.0f", $3/$2 * 100.0}')
if [ $MEMORY_USAGE -gt 80 ]; then
echo "⚠️ Memory bottleneck detected!"
echo "Memory usage: ${MEMORY_USAGE}%"
echo "Top memory processes:"
ps aux --sort=-%mem | head -6
fi
# 磁盘 I/O 瓶颈检查
echo "Checking disk I/O..."
iostat -x 1 3 | tail -n +4 | awk 'NF>0 && $1!="Device" {
if ($10 > 80) {
print "⚠️ Disk I/O bottleneck on " $1 ": " $10 "% utilization"
}
}'
# 网络瓶颈检查
CONNECTIONS=$(ss -tan | grep ESTAB | wc -l)
if [ $CONNECTIONS -gt 1000 ]; then
echo "⚠️ High network connection count: $CONNECTIONS"
fi
🎯 监控工具选择指南
🤔 思考题
- 如何区分 CPU 密集型和 I/O 密集型的性能问题?
- 什么情况下需要关注 load average 而不是 CPU 使用率?
- 如何设计一个完整的系统监控告警策略?
- 在容器化环境中,系统监控有哪些特殊考虑?
实践练习
通过实际操作来巩固所学知识,在真实的系统化的训练环境中练习本教程的内容。
Linux 系统监控 - 性能监控工具与实践 - 实践练习
基于 Linux 系统监控 - 性能监控工具与实践 教程的实践练习