【Linux日新月异(八)】CentOS 7系统资源监控与排查深度指南:性能调优全景图

🌌提供:

  1. Kimi K2 Thinking(网站: 大语言模型(Large Language Model, LLM),是当前人工智能领域的重要技术分支,专注于自然语言处理和生成任务。)【开源】「AL」〖✿✿✿✿✿〗
    🔔说明: 本文内容由Kimi K2生成。AI创作虽经校对,仍难免疏漏或偏颇之处。若您发现错漏、或有任何建议,恳请不吝赐教。您的每一次指正,都是我改进与成长的重要指引。
    📓摘要:
    略...(有好建议的可以留言哦~~~(✿◕‿◕✿))


📊 CentOS 7系统资源监控与排查深度指南:性能调优全景图

系统监控是运维的"听诊器",CentOS 7提供了从基础到专业的完整监控工具链。掌握这些命令,能在问题爆发前发现征兆,在故障发生后快速定位!


一、🔥 系统整体状态监控

1. uptime- 快速查看系统负载

语法:

bash 复制代码
uptime [选项]

案例:

bash 复制代码
uptime
# 输出:
#  15:30:45 up 5 days,  8:20,  3 users,  load average: 2.15, 1.80, 1.45

# 更简洁的显示
uptime -p
# 输出:up 5 days, 8 hours, 20 minutes

输出解析:

  • 15:30:45:当前时间
  • up 5 days, 8:20:运行时长
  • 3 users:登录用户数
  • load average核心指标!
    • 2.15:最近1分钟平均负载
    • 1.80:最近5分钟平均负载
    • 1.45:最近15分钟平均负载

负载解读(假设4核CPU)

  • < 4.0 :系统正常运行
  • 4.0 ~ 8.0 :系统繁忙,但可接受
  • > 8.0 :严重过载,需要立即排查!

⚠️ 注意事项:

  • 🔥负载≠CPU使用率 :负载包含运行中+等待I/O的进程数
  • 多核考虑 :负载应除以CPU核心数。nproclscpu查看核心数
  • 上升趋势:如果1分钟负载远高于15分钟,说明负载正在上升
  • I/O等待 :高负载但CPU空闲,说明是磁盘或网络瓶颈

2. dmesg- 内核环缓冲区(硬件/驱动故障)

语法:

bash 复制代码
dmesg [选项]

核心选项:

  • -H:人类可读,带时间戳
  • -T:显示绝对时间
  • -c:清除缓冲区
  • -l 级别:过滤级别(emerg,alert,crit,err,warn,info)
  • --follow:实时追踪

案例1:查看硬件检测信息

bash 复制代码
dmesg | grep -i eth
# 查看网卡识别

dmesg | grep -i memory
# 查看内存识别

dmesg | grep -i usb
# 查看USB设备

案例2:查看错误信息

bash 复制代码
# 只显示错误和警告
dmesg -l err,warn

# 显示时间戳(重要!)
dmesg -T | grep -i error

# 输出示例:
[Thu Nov 14 15:30:45 2024] EXT4-fs error (device sda1): ext4_lookup: deleted inode referenced: 12345
# 说明文件系统出现错误!需fsck检查

案例3:实时监控硬件故障

bash 复制代码
# 监控磁盘I/O错误
dmesg --follow | grep -i "i/o error"
# 出现该错误说明磁盘即将损坏!

⚠️ 注意事项:

  • 🔥时区问题dmesg -T显示的时间可能有时区偏差,需校准
  • 缓冲区大小:dmesg缓冲区有限,重启后清空,重要错误需及时保存
  • 权限:普通用户可查看,但某些敏感信息需root
  • 与journalctl关系 :CentOS 7中journalctl -k功能类似,但更全面

3. dmidecode - 硬件信息查询

语法:

bash 复制代码
dmidecode [选项]

核心选项:

  • -t 类型:指定类型(bios, system, processor, memory)
  • -s 关键字:直接输出关键字值

案例1:查看内存信息

bash 复制代码
# 查看内存条数量和容量
dmidecode -t memory | grep -i size
# 输出:
# 	Size: 8192 MB
# 	Size: 8192 MB
# 说明有两条8GB内存

# 查看内存槽位
dmidecode -t memory | grep -i "locator"
# 输出:
# 	Locator: DIMM_A1
# 	Locator: DIMM_A2

案例2:查看CPU信息

bash 复制代码
# 查看CPU型号
dmidecode -t processor | grep -i "version"
# 输出:Version: Intel(R) Xeon(R) CPU E5-2650 v4 @ 2.20GHz

# 查看CPU核心数
dmidecode -t processor | grep -i "core"
# 输出:Core Count: 12

案例3:查看服务器序列号

bash 复制代码
# 查看制造商和序列号(资产管理)
dmidecode -t system | grep -E "Manufacturer|Serial Number"
# 输出:
# 	Manufacturer: Dell Inc.
# 	Serial Number: 8XYZ123

⚠️ 注意事项:

  • 🔥需root权限:普通用户无法读取DMI信息
  • 虚拟机限制:虚拟机信息可能不完整或显示宿主机信息
  • 准确性:信息来自BIOS,如果BIOS有bug可能不准确
  • 与lshw区别lshw信息更详细,但需要安装

二、⚡ CPU资源监控

1. top- 动态CPU监控(前面已讲,补充CPU视角)

案例:CPU视角分析

bash 复制代码
top - 16:45:30 up 5 days, 9:35,  3 users,  load average: 3.50, 2.80, 2.10
Tasks: 215 total,   3 running, 212 sleeping,   0 stopped,   0 zombie
%Cpu(s): 25.0 us, 15.0 sy,  0.0 ni, 58.0 id,  2.0 wa,  0.0 hi,  0.0 si,  0.0 st

# CPU解读:
# us(25%) + sy(15%) = 应用+内核占用40%(正常)
# id(58%) = 空闲58%
# wa(2%) = I/O等待2%(轻微)

交互命令:

  • 1显示每颗CPU核心(排查单核瓶颈)
  • P:按CPU排序
  • H:显示线程
  • c:显示完整命令路径

⚠️ 高CPU排查流程:

bash 复制代码
# 1. top找到高CPU进程
# 假设PID 5678占用150% CPU(多核)

# 2. 查看进程线程
ps -Lp 5678 -o pid,tid,pcpu,comm
# 找到具体哪个线程(TID)占用高

# 3. 查看进程打开的文件和调用
lsof -p 5678
strace -p 5678 -c          # 统计系统调用

# 4. 找到代码位置(Java示例)
jstack 5678 | grep <TID的十六进制>

# 5. 生成火焰图(高级)
perf record -F 99 -p 5678 -g -- sleep 60
perf script | flamegraph.pl > cpu.svg

2. mpstat- 多核CPU统计

安装:

bash 复制代码
yum install -y sysstat

语法:

bash 复制代码
mpstat [选项] [间隔] [次数]

案例:

bash 复制代码
# 查看每颗CPU统计
mpstat -P ALL 1 3
# 每秒刷新,共3次

# 输出:
Linux 3.10.0-1160.el7.x86_64 (centos7) 	11/15/2024 	_x86_64_	(4 CPU)

04:50:12 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
04:50:13 PM  all   25.12    0.00   15.06    2.01    0.00    0.00    0.00    0.00    0.00   57.81
04:50:13 PM    0   30.00    0.00   20.00    5.00    0.00    0.00    0.00    0.00    0.00   45.00
04:50:13 PM    1   20.00    0.00   10.00    1.00    0.00    0.00    0.00    0.00    0.00   69.00
04:50:13 PM    2   35.00    0.00   18.00    1.00    0.00    0.00    0.00    0.00    0.00   46.00
04:50:13 PM    3   15.00    0.00   12.00    1.00    0.00    0.00    0.00    0.00    0.00   72.00

⚠️ 单核瓶颈识别:

  • 🔥某CPU idle持续<10%:该核过载,进程绑定不均
  • 软中断不均衡:网卡等多队列未开启,导致单核处理所有中断
  • 解决方案:启用RPS/RFS或绑定进程到特定CPU

3. pidstat - 进程级CPU统计

安装:

bash 复制代码
yum install -y sysstat

语法:

bash 复制代码
pidstat [选项] [间隔] [次数]

核心选项:

  • -u:CPU统计
  • -r:内存统计
  • -d:I/O统计
  • -t:线程级统计
  • -p PID:指定进程

案例:

bash 复制代码
# 监控所有进程CPU(每秒刷新)
pidstat -u 1

# 输出:
Linux 3.10.0-1160.el7.x86_64 (centos7) 	11/15/2024 	_x86_64_	(4 CPU)

05:00:12 PM   UID       PID    %usr %system  %guest    %CPU   CPU  Command
05:00:13 PM     0       1234    5.00    2.00    0.00    7.00     2  nginx
05:00:13 PM     0       5678   85.00   15.00    0.00  100.00     1  java

# 高亮:java进程占满1核CPU(100%)

⚠️ 注意事项:

  • 🔥线程级分析pidstat -t -p 5678 1可定位具体哪个线程
  • 综合监控pidstat -urd 1同时看CPU、内存、I/O
  • 采样间隔:生产环境建议≥5秒,避免监控本身影响性能

4. perf - 性能分析神器(Linux Profiling)

安装:

bash 复制代码
yum install -y perf

案例1:CPU周期采样

bash 复制代码
# 采样10秒
perf record -F 99 -a -g -- sleep 10

# 生成报告
perf report

案例2:针对进程分析

bash 复制代码
# 分析Java进程5678的CPU热点
perf record -F 99 -p 5678 -g -- sleep 30

# 查看热点函数
perf report --no-children
# 可看到是哪些函数占用CPU

⚠️ 注意事项:

  • 🔥需要内核调试符号:否则只看到16进制地址
  • 性能开销 :采样频率过高会影响生产环境,建议-F 99(99Hz)
  • 生成火焰图 :需要安装flamegraph工具
  • 权限:普通用户只能分析自己的进程,root可分析所有

三、💾 内存资源监控

1. free- 内存使用情况

语法:

bash 复制代码
free [选项]

核心选项:

  • -h:人类可读
  • -m:MB单位
  • -g:GB单位
  • -t:显示总计

案例:

bash 复制代码
free -h
# 输出:
#               total        used        free      shared  buff/cache   available
# Mem:           7.6G        2.1G        1.2G        136M        4.3G        5.2G
# Swap:          2.0G          0B        2.0G

# 重要指标解读:
# - used:已使用(包含缓存,不反映真实占用)
# - free:完全空闲
# - buff/cache:缓存(可回收,不属于真实占用)
# - available:真正可用内存(近似free+buff/cache)
# - Swap used:swap使用量(>0说明内存不足)

⚠️ 内存不足判断标准:

  • 🔥available < 500MB:内存紧张
  • Swap used持续增长:内存泄漏或不足
  • 内存回收慢echo 3 > /proc/sys/vm/drop_caches手动清理缓存(临时)

2. vmstat- 虚拟内存统计(含进程/CPU/IO)

案例(间隔1秒,共5次):

bash 复制代码
vmstat 1 5
# 输出:
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 2  0      0 123456  23456 4567890    0    0    10    20   50  100  5  2 90  3  0
 3  1      0 122000  23500 4568000    0    0   500  2000  100  200 10  5 70 15  0

关键字段:

  • si/so:swap换入/换出(⚠️>0说明内存不足)
  • bi/bo:块设备读/写(磁盘I/O)
  • wa:CPU等待I/O时间(>10%说明I/O瓶颈)

⚠️ 内存泄漏排查:

bash 复制代码
# 持续监控,观察free和cache变化
for i in {1..60}; do
  echo "=== $(date) ==="
  vmstat -s | grep -E "used memory|swap"
  sleep 60
done

# 找到占用内存增长的进程
pidstat -r -p 5678 1
# 观察RSS(常驻内存)是否持续增加

3. smem - 内存使用分析(Proportional Set Size)

安装:

bash 复制代码
yum install -y smem

案例:

bash 复制代码
# 查看进程真实内存占用(共享内存按比例分配)
smem -s pss
# 输出:
  PID User     Command                         Swap      USS      PSS      RSS
 1234 root     nginx: worker process              0    2.1M    2.5M    4.2M
 5678 root     java -jar app.jar                  0   1.2G    1.3G    1.5G

# PSS更准确地反映进程真实占用(考虑共享库)

4. pmap - 进程内存映射

语法:

bash 复制代码
pmap [选项] PID

案例:

bash 复制代码
pmap 5678
# 输出:
5678:   java -jar app.jar
0000000000400000    884K r-x-- java
00000000007dc000      8K r---- java
...
00007f8e44000000  65536K rw---   [ anon ]  # 匿名内存(堆栈)
00007f8e48000000  131072K rw---   [ anon ]
...
total              1572864K                # 总映射1.5GB

⚠️ 内存映射分析:

  • [ anon ]:匿名内存,通常是堆和栈,重点关注
  • [ stack ]:线程栈,线程越多越大
  • libc-2.17.so:共享库,不计入进程独占内存

5. sar - 系统活动报告(历史数据)

安装:

bash 复制代码
yum install -y sysstat
systemctl enable --now sysstat

语法:

bash 复制代码
sar [选项] [间隔] [次数]

核心选项:

  • -u:CPU
  • -r:内存
  • -b:I/O
  • -n DEV:网络接口
  • -f /var/log/sa/saXX:查看历史数据

案例1:查看历史CPU数据

bash 复制代码
# 查看今天的CPU数据(每10分钟采样)
sar -u -f /var/log/sa/sa15
# sa15表示15号的数据

# 输出:
Linux 3.10.0-1160.el7.x86_64 (centos7) 	11/15/2024 	_x86_64_	(4 CPU)

12:00:01 AM     CPU     %user     %nice   %system   %iowait    %steal     %idle
12:10:01 AM     all      5.00      0.00      2.00      1.00      0.00     92.00
12:20:01 AM     all     80.00      0.00     15.00      5.00      0.00      0.00
# 12:20的idle=0%,说明当时CPU跑满!

案例2:查看历史内存数据

bash 复制代码
sar -r -f /var/log/sa/sa15
# 关注%memused和%swapused

⚠️ sar配置:

bash 复制代码
# 修改采集频率(默认10分钟太粗)
nano /etc/cron.d/sysstat
# 改为每1分钟
*/1 * * * * root /usr/lib64/sa/sa1 1 1

# 保留90天数据
nano /etc/sysconfig/sysstat
# HISTORY=90

⚠️ 注意事项:

  • 🔥历史回溯:sar是唯一能看到历史性能数据的工具,故障后复盘必备
  • 采样精度:生产环境建议1-5分钟,避免数据太粗漏掉峰值
  • 磁盘空间 :高频采集会占用更多磁盘,监控/var/log/sa/大小

四、🌐 网络资源监控

1. ss- 现代网络连接查看(替代netstat)

语法:

bash 复制代码
ss [选项] [过滤]

核心选项:

  • -t:TCP
  • -u:UDP
  • -n:不解析服务名(显示端口号)
  • -l:监听套接字
  • -p:显示进程信息(需root)
  • -a:所有套接字
  • -m:内存使用
  • -i:内部信息

案例1:查看监听端口

bash 复制代码
ss -tuln
# 输出:
State    Recv-Q   Send-Q     Local Address:Port      Peer Address:Port   
LISTEN   0        128              0.0.0.0:22             0.0.0.0:*       
LISTEN   0        128                    *:8080                 *:*       
LISTEN   0        128                 [::]:80                [::]:*       

# 快速查看端口是否被占用
ss -tuln | grep :8080

案例2:查看ESTABLISHED连接

bash 复制代码
ss -tn state established
# 或
ss -tn | grep ESTAB

# 统计连接数
ss -tn state established | wc -l

# 查看每个IP的连接数
ss -tn state established | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn | head -10

⚠️ 大量连接排查:

bash 复制代码
# 1. 查看总连接数
ss -tn | wc -l

# 2. 查看TIME_WAIT(过多会占用端口)
ss -tn state time-wait | wc -l

# 3. 查看CLOSE_WAIT(程序bug导致连接不释放)
ss -tn state close-wait | wc -l

# 4. 查看进程持有的连接
ss -tnp | grep 5678
# -p显示PID和进程名

2. iptraf-ng / iftop - 实时网络流量

安装:

bash 复制代码
yum install -y iptraf-ng iftop

案例1:iftop查看实时流量

bash 复制代码
iftop -i eth0
# 界面显示:
# 源IP -> 目的IP   实时速率   峰值   总量
# 192.168.1.100 => 8.8.8.8   1.2Mb  2.3Mb  15.6MB

⚠️ 参数:

  • -n:不解析主机名(更快)
  • -P:显示端口
  • -B:字节为单位

案例2:iptraf-ng交互式监控

bash 复制代码
iptraf-ng
# 菜单选择:
# 1. IP traffic monitor(按IP统计)
# 2. General interface statistics(接口统计)
# 3. Detailed interface statistics(详细统计)

⚠️ 注意事项:

  • 🔥需要rootiftop/iptraf-ng需root权限抓包
  • 性能影响 :高流量时iftop本身消耗CPU,生产环境慎用
  • 端口镜像:如需抓其他服务器流量,需交换机端口镜像

3. sar -n- 网络历史数据

bash 复制代码
# 查看今天网络流量历史
sar -n DEV -f /var/log/sa/sa15

# 输出:
12:00:01 AM     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s
12:10:01 AM        lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00
12:10:01 AM      eth0    100.50     80.30     12.30     15.20      0.00      0.00      0.00

# 关键指标:
# rxpck/s: 每秒接收包数
# txpck/s: 每秒发送包数
# rxkB/s: 每秒接收KB数
# txkB/s: 每秒发送KB数

4. netstat - 传统网络统计(已废弃)

bash 复制代码
# 虽然废弃但仍广泛使用
netstat -tuln
netstat -tn | grep ESTABLISHED

五、🐛 日志分析神器

1. journalctl- systemd日志管理 ⭐⭐

语法:

bash 复制代码
journalctl [选项] [匹配]

核心选项:

  • -f:实时追踪(tail -f)
  • -u 单元:查看服务日志
  • -p 级别:按优先级过滤(0=emerg, 4=warning, 6=info)
  • --since "时间":从何时开始
  • --until "时间":到何时结束
  • -n 行数:最近N行
  • -o verbose:详细输出(含所有字段)
  • -k:内核日志(代替dmesg)

案例1:查看服务日志

bash 复制代码
# 查看nginx日志(推荐!)
journalctl -u nginx.service

# 查看最近100行
journalctl -u nginx.service -n 100

# 实时追踪
journalctl -u nginx.service -f

# 查看今天的日志
journalctl -u nginx.service --since today

案例2:按时间过滤

bash 复制代码
# 查看过去1小时
journalctl --since "1 hour ago"

# 查看特定时间段
journalctl --since "2024-11-15 14:00:00" --until "2024-11-15 15:00:00"

# 查看系统启动后的日志
journalctl --since "2024-11-15 09:30:00"

案例3:筛选错误日志

bash 复制代码
# 只显示错误及以上级别
journalctl -p err

# 查看内核错误
journalctl -k -p err

# 组合:nginx的错误日志
journalctl -u nginx.service -p err --since today

案例4:跟踪进程日志

bash 复制代码
# 查看PID为5678的进程日志
journalctl _PID=5678

# 查看用户操作
journalctl _UID=1000

⚠️ 日志管理配置:

bash 复制代码
# 配置日志保留(避免占满磁盘)
nano /etc/systemd/journald.conf

# 关键参数:
SystemMaxUse=5G           # 日志最大占用5GB
MaxFileSec=30day          # 单个文件最多30天
ForwardToSyslog=no        # 不转发到syslog(避免重复)

# 重启服务
systemctl restart systemd-journald

# 清理旧日志
journalctl --vacuum-size=2G     # 保留最近2GB
journalctl --vacuum-time=7d     # 保留最近7天

⚠️ 注意事项:

  • 🔥日志持久化 :默认日志在内存(/run/log),重启丢失。需配置Storage=persistent/var/log/journal
  • 二进制存储:journalctl日志是二进制,不能直接用cat查看
  • 性能:高频日志写入可能占满磁盘,务必配置上限
  • 与rsyslog关系:CentOS 7中rsyslog和journald并存,可配置互转

2. rsyslog 传统日志(/var/log/

核心日志文件:

文件 用途
/var/log/messages 系统通用日志
/var/log/secure 安全日志(SSH登录等)
/var/log/cron 定时任务日志
/var/log/boot.log 启动日志
/var/log/dmesg 内核日志
/var/log/maillog 邮件日志

案例:ssh爆破排查

bash 复制代码
# 查看失败登录
grep "Failed password" /var/log/secure

# 统计IP
grep "Failed password" /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -rn | head -20

# 查看成功登录(潜在入侵)
grep "Accepted password" /var/log/secure

3. logrotate - 日志轮转管理

配置:

bash 复制代码
# 查看配置
nano /etc/logrotate.conf

# 示例:自定义nginx日志轮转
nano /etc/logrotate.d/nginx
# /var/log/nginx/*.log {
#     daily
#     missingok
#     rotate 52
#     compress
#     delaycompress
#     notifempty
#     create 640 nginx adm
#     postrotate
#         /bin/kill -USR1 $(cat /run/nginx.pid)
#     endscript
# }

手动触发轮转:

bash 复制代码
logrotate -f /etc/logrotate.d/nginx
# -f: force

六、🛠️ 综合故障排查案例

案例1:系统响应慢,SSH卡顿

排查步骤:

bash 复制代码
# 1. 查看负载
uptime
# load average: 15.0, 10.0, 5.0  (4核CPU,严重过载)

# 2. top看CPU
top -b -n 1 | head -20
# 发现wa=60% (I/O等待!)

# 3. vmstat确认
vmstat 1 5
# wa列持续50-70%,bi/bo很大

# 4. iostat找磁盘
iostat -x 1
# sda的%util=99.9%,await=200ms(磁盘瓶颈!)

# 5. 找进程
iotop -o
# 发现mysql进程占I/O 80%

# 6. 查mysql
journalctl -u mysqld -p err
# 大量 "InnoDB: Deadlock found..." 死锁

# 结论:MySQL死锁导致磁盘I/O暴增
# 解决:kill长事务,优化SQL

案例2:内存耗尽,OOM Killer触发

排查步骤:

bash 复制代码
# 1. dmesg查看OOM日志
dmesg -T | grep -i "out of memory"
# 输出:
[Thu Nov 14 16:00:00 2024] Out of memory: Kill process 5678 (java) score 882 or sacrifice child

# 2. 查看OOM前的内存
sar -r -f /var/log/sa/sa14
# %memused 从80%直线上升到99%

# 3. 查看进程占用
ps aux --sort=-%mem | head -10
# java进程RSS=6GB,系统内存8GB

# 4. 查看内存泄漏
pmap -x 5678 | tail -1
# total kB    6291456(持续增长)

# 5. 检查jvm参数
ps -ef | grep java
# -Xmx8g,但系统只有8GB,留不足!

# 结论:JVM堆配置过大+内存泄漏
# 解决:调小-Xmx,修复代码泄漏

案例3:网络连接数暴增,服务无法响应

排查步骤:

bash 复制代码
# 1. 查看连接数
ss -tn | wc -l
# 10000+(正常应<1000)

# 2. 查看TIME_WAIT
ss -tn state time-wait | wc -l
# 8000+(连接未快速回收)

# 3. 查看端口监听
ss -tuln | grep :8080
# Recv-Q=128(队列满)

# 4. 查看进程FD限制
cat /proc/5678/limits | grep "Max open files"
# Max open files            1024                 1024                 files
# 限制太小!

# 5. 查看系统级限制
sysctl fs.file-max
# fs.file-max = 100000(够用)

# 6. 查看TCP参数
sysctl net.ipv4.tcp_tw_reuse
# net.ipv4.tcp_tw_reuse = 0(未开启复用)

# 结论:FD限制+TIME_WAIT未复用
# 解决:
# 1. ulimit -n 65535
# 2. sysctl -w net.ipv4.tcp_tw_reuse=1
# 3. 修改应用连接池配置

七、⚠️ 监控铁律与最佳实践

1. 🔥 监控的"3-3-3"原则

  • 3秒 :突发问题3秒内发现(dmesg -w实时)
  • 3分钟 :定位到进程和原因(top+ss+journalctl
  • 30分钟 :解决问题或止损(kill/systemctl restart

2. 🔥 监控工具选择矩阵

场景 推荐工具 备选工具 避免使用
CPU瞬时高 top + pidstat htop ps aux(静态)
CPU历史 sar -u perf vmstat(粗略)
内存泄漏 pmap + pidstat -r smem free(整体)
内存历史 sar -r vmstat top(不准确)
磁盘I/O iostat -x iotop du(无关)
网络连接 ss -tnp iftop netstat(废弃)
网络历史 sar -n DEV iptables ifconfig(过时)
日志实时 journalctl -f tail -f cat(低效)
日志历史 journalctl --since grep vim(大文件卡死)

3. 🔥 生产环境监控禁忌

  1. 禁止生产环境运行perf record -F 9999:高频采样导致系统卡顿
  2. 禁止tail -f /var/log/xxx | grep xxx监控:占用大量内存(管道缓冲)
  3. 禁止高频lsof:遍历所有进程文件句柄,性能差
  4. 禁止du -h /定时任务:每次扫描全盘,I/O风暴

4. 🔥 监控脚本最佳实践

bash 复制代码
#!/bin/bash
# 健康检查脚本示例

# 1. 设置超时(避免卡死)
timeout 5 ss -tn > /tmp/conn.txt

# 2. 使用ss代替netstat
CONN=$(wc -l < /tmp/conn.txt)

# 3. 阈值判断
if [ $CONN -gt 5000 ]; then
  # 4. 记录关键信息
  echo "$(date): Connection spike: $CONN" >> /var/log/health.log
  ss -tn state time-wait | wc -l >> /var/log/health.log
  
  # 5. 触发告警
  echo "High connections on $(hostname)" | mail -s "Alert" admin@example.com
fi

# 6. 清理临时文件
rm -f /tmp/conn.txt

八、📚 终极排查流程图

复制代码
用户反馈:系统慢/无响应
        ↓
    uptime (load average)
        ↓
    top (CPU/内存/进程)
        ↓
    vmstat (wa/memory/swap)
        ↓
    iostat (磁盘I/O瓶颈)
        ↓
    ss/netstat (网络连接)
        ↓
    journalctl/dmesg (错误日志)
        ↓
    定位到具体进程 (PID)
        ↓
    strace/lsof/pmap (进程详情)
        ↓
    确定根本原因 (代码/配置/资源)
        ↓
    制定解决方案

🎓 总结:监控排查的"三字经"

  1. 看整体uptime+vmstat判断问题类型(CPU/内存/IO/网络)
  2. 抓进程top+pidstat定位元凶PID
  3. 查细节strace+lsof+pmap分析进程行为
  4. 翻旧账sar+journalctl追溯历史
  5. 定方案:根据证据修复,而非猜测

记住:监控是预防医学,排查是急诊手术。建立完善的监控体系,远胜于救火式的排查!



📖原文: 聚散离合,乃是缘分,苦情巨树续的是缘,而有缘,未必有分。 --《狐妖小狐娘》

⌛怡然 : ...



🪁 LuminKu looks forward to seeing you again 🌌


相关推荐
IT瑞先生1 小时前
Docker容器使用手册——进阶篇(下)
运维·docker·容器
HIT_Weston1 小时前
32、【Ubuntu】【远程开发】内网穿透:远程主机连接
linux·运维·ubuntu
yolo_guo2 小时前
WSL2 安装 centos6.9 子系统
linux
p66666666682 小时前
【☀Linux驱动开发笔记☀】新字符设备驱动开发_02
linux·嵌入式硬件·学习
大聪明-PLUS2 小时前
在 Linux 上使用实时调度策略运行应用程序
linux·嵌入式·arm·smarc
Awkwardx2 小时前
Linux网络编程—应用层自定义协议与序列化
linux·网络
java_logo2 小时前
Kubernetes Dashboard Docker 容器化部署指南
运维·mysql·docker·云原生·容器·kubernetes·php
编织幻境的妖2 小时前
Docker底层工作原理
运维·docker·容器
TDengine (老段)3 小时前
TDengine IDMP 赋能新能源:光伏电站智能运维实践
大数据·运维·数据库·物联网·时序数据库·tdengine·涛思数据