🎉 限时公测|限量体验29元4核8G39元8核16G云开发环境一个月,助力Vibe Coding新时代!

Linux 系统监控 - 性能监控工具与实践

初级

深入学习Ubuntu 24.10 Server系统监控的核心工具和技术,掌握htop、iotop、netstat、ss等监控工具的使用,学会系统性能分析和问题诊断。通过生活化类比和渐进式实践,让初学者轻松掌握系统监控技能。

未知
easylearning团队
更新于 2025-01-23

🚀 实践环境(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接口或日志分析获取业务指标
  • 日志监控:实时分析应用日志,提取错误信息和性能数据
  • 指标监控:收集自定义业务指标,如用户访问量、交易成功率等

📊 基础监控工具

🏗️ 实验环境准备

在开始学习监控工具之前,让我们先准备好实验环境:

请登录以使用远程命令功能
# 更新软件包列表
$sudo apt update
# 安装必需的监控工具
$sudo apt install -y htop iotop sysstat net-tools
# 验证工具安装
$which htop iotop iostat netstat

top 命令 - 实时进程监控

BASH
# 基本使用
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:启动进程的命令
BASH
# 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:基础监控概念

自检问题

  1. 能否解释监控的三个层次(硬件层、系统层、应用层)?
  2. 能否区分top命令中的%CPU和%MEM含义?
  3. 能否说出load average三个数值分别代表什么时间段?

htop - 增强版进程监控

BASH
# 安装 htop
sudo apt update
sudo apt install htop
 
# 使用 htop
htop                  # 启动 htop
htop -u username      # 监控特定用户
htop -p 1234,5678     # 监控特定进程

htop 优势特性

  • 彩色界面,更直观
  • 支持鼠标操作
  • 树状进程显示
  • 内置进程搜索和过滤
  • 支持多种排序方式

ps 命令 - 进程快照

请登录以使用远程命令功能
# 常用 ps 命令组合
$ps aux # 显示所有进程详细信息
$ps -ef # 显示所有进程(另一种格式)
$ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%cpu # 自定义输出格式
$ps -C nginx # 显示特定命令的进程
$ps --forest # 树状显示进程关系

💾 内存监控工具

free 命令 - 内存使用情况

请登录以使用远程命令功能
# 基本内存信息
$free # 显示内存使用情况
$free -h # 人类可读格式
$free -m # 以 MB 为单位
$free -s 5 # 每 5 秒刷新一次
# 内存使用分析
$free -h
# total used free shared buff/cache available
# Mem: 7.8G 3.4G 1.2G 234M 3.2G 4.1G
# Swap: 2.0G 0B 2.0G

内存指标详解

Linux内存管理采用复杂的缓存策略,理解各项指标的真实含义对于准确评估系统内存状态至关重要:

  • total: 系统总物理内存容量,由硬件决定
  • used: 当前被进程实际使用的内存,不包括缓存
  • free: 完全未使用的内存,通常数值较小是正常现象
  • shared: 多个进程共享的内存区域,如共享库和IPC
  • buff/cache:
    • buffers: 块设备I/O缓冲区,用于磁盘读写优化
    • cached: 页面缓存,存储文件内容以加速访问
  • available: 真正可用于新进程的内存,包括free + 可释放的cache

内存使用评估原则

  • 关注available而非free:Linux会充分利用内存作为缓存
  • buff/cache可以被快速释放:当进程需要内存时,系统会自动释放缓存
  • 真正的内存压力指标:available接近0或swap使用量增加

vmstat 命令 - 虚拟内存统计

BASH
# 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 监控

BASH
# 安装 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 统计

BASH
# 安装 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 命令 - 磁盘空间监控

BASH
# 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 命令 - 网络连接监控

BASH
# 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 命令 - 现代网络监控工具

BASH
# 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 命令 - 用户活动监控

BASH
# 显示当前登录用户和系统负载
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 - 全面系统监控

BASH
# 安装 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 - 退出

📊 监控数据收集与分析

系统监控脚本示例

BASH
#!/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服务器性能问题诊断

背景:某电商网站在促销期间响应缓慢,需要快速定位问题。

诊断步骤

  1. 快速概览:使用htop查看整体资源使用情况
  2. 进程分析:识别高CPU/内存占用进程
  3. I/O分析:使用iotop检查磁盘瓶颈
  4. 网络分析:使用ss检查连接状态

实际操作

BASH
# 第一步:系统概览
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服务响应。

解决方案

  1. 优化数据库查询语句
  2. 增加数据库连接池
  3. 启用Web服务器缓存
  4. 考虑负载均衡分散压力

演练1:系统性能分析

BASH
# 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:性能瓶颈诊断

BASH
# 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

🎯 监控工具选择指南


🤔 思考题

  1. 如何区分 CPU 密集型和 I/O 密集型的性能问题?
  2. 什么情况下需要关注 load average 而不是 CPU 使用率?
  3. 如何设计一个完整的系统监控告警策略?
  4. 在容器化环境中,系统监控有哪些特殊考虑?

实践练习

通过实际操作来巩固所学知识,在真实的系统化的训练环境中练习本教程的内容。

Linux 系统监控 - 性能监控工具与实践 - 实践练习

待学习
ID: LINUX_05_SYSTEM_MONITORING
未登录
训练服务器:
训练内容:

基于 Linux 系统监控 - 性能监控工具与实践 教程的实践练习