
1. Linux运维基础资源监控的重要性作为在Linux服务器运维领域摸爬滚打多年的老手我深知系统资源监控是日常运维工作的基本功。每当服务器出现性能问题快速准确地获取CPU、内存和磁盘状态信息就像医生查看病人的体温和血压一样关键。但很多新手面对五花八门的监控命令时常常感到无从下手。今天我要分享的这些命令都是经过多年实战检验的看家本领。它们不仅能帮你快速诊断系统健康状况还能在性能问题爆发前发出预警。不同于教科书上的罗列我会重点解释每个命令输出的关键指标含义以及在实际运维中如何解读这些数据。2. CPU状态监控实战技巧2.1 top命令系统性能的全景图top命令是我每天使用频率最高的工具之一。它提供的实时系统概览就像飞机的仪表盘一样重要。但很多人只是粗略地看一眼CPU百分比其实这里面大有学问top - 14:30:45 up 32 days, 3:15, 2 users, load average: 0.08, 0.03, 0.01 Tasks: 125 total, 1 running, 124 sleeping, 0 stopped, 0 zombie %Cpu(s): 2.3 us, 1.2 sy, 0.0 ni, 96.3 id, 0.2 wa, 0.0 hi, 0.0 si, 0.0 stload average这三个数字分别代表1分钟、5分钟和15分钟的系统平均负载。当这个值超过CPU核心数时说明系统已经过载。比如4核CPU的负载长期超过4就需要立即排查。**%Cpu(s)**行中的关键指标us用户空间进程占用CPU百分比sy内核空间进程占用CPU百分比id空闲CPU百分比waI/O等待所占用的CPU时间百分比经验之谈当wa值持续偏高时通常意味着磁盘I/O成为瓶颈而不是CPU本身的问题。这时候应该去检查磁盘性能而不是盲目升级CPU。2.2 mpstat多核CPU的精细监控在多核服务器上mpstat -P ALL 1命令可以显示每个CPU核心的详细使用情况Linux 5.4.0-135-generic (ubuntu) 03/15/2023 _x86_64_ (4 CPU) 14:32:45 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle 14:32:46 all 2.25 0.00 1.25 0.25 0.00 0.00 0.00 0.00 0.00 96.25 14:32:46 0 3.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.00 96.00 14:32:46 1 1.00 0.00 1.00 1.00 0.00 0.00 0.00 0.00 0.00 97.00这个输出特别适合检查CPU负载是否均衡。我曾经遇到过一台服务器其中一个核心的%usr长期100%而其他核心却很空闲最后发现是一个单线程应用导致的性能瓶颈。2.3 pidstat进程级CPU监控当发现CPU使用率异常时pidstat -u 1可以帮助定位具体的罪魁祸首Linux 5.4.0-135-generic (ubuntu) 03/15/2023 _x86_64_ (4 CPU) 14:35:15 UID PID %usr %system %guest %wait %CPU CPU Command 14:35:16 0 1234 5.00 2.00 0.00 0.00 7.00 1 java 14:35:16 1001 5678 12.00 3.00 0.00 0.00 15.00 3 python这个命令每1秒刷新一次显示各个进程的CPU占用情况。在实际运维中我经常用它来确认是哪个进程在吃CPU资源。3. 内存状态深度解析3.1 free命令内存使用全景free -h命令以人类可读的方式显示内存使用情况total used free shared buff/cache available Mem: 7.7G 2.1G 1.2G 123M 4.4G 5.2G Swap: 2.0G 0.0G 2.0G这里有几个关键点需要注意available这个值比free更重要它表示系统可用的内存总量包括可以被回收的缓存和缓冲区内存。buff/cache这部分内存被用作磁盘缓存当应用程序需要更多内存时系统会自动释放这部分内存。Swap使用如果Swap被大量使用说明物理内存已经不足需要优化应用或增加内存。常见误区很多新手看到free值很小就紧张其实在Linux系统中未被使用的内存会被自动用作缓存这是正常现象不是内存泄漏。3.2 /proc/meminfo内存详情宝库对于需要更详细内存信息的情况cat /proc/meminfo提供了丰富的数据MemTotal: 8101232 kB MemFree: 1256324 kB MemAvailable: 5321234 kB Buffers: 234512 kB Cached: 4123456 kB SwapCached: 12 kB Active: 3123456 kB Inactive: 2123456 kB Active(anon): 123456 kB Inactive(anon): 234567 kB Active(file): 3000000 kB Inactive(file): 1888889 kB这些数据对于深入分析内存使用模式非常有用。比如Active(file)和Inactive(file)可以反映文件缓存的使用情况而Active(anon)和Inactive(anon)则显示了应用程序实际使用的内存量。3.3 slabtop内核内存使用监控当系统出现内存不足但free显示还有剩余时slabtop命令可以帮你查看内核内存分配情况Active / Total Objects (% used) : 234567 / 345678 (67.8%) Active / Total Slabs (% used) : 12345 / 13456 (91.7%) Active / Total Caches (% used) : 89 / 123 (72.3%) Active / Total Size (% used) : 1234567.89K / 2345678.90K (52.6%) Minimum / Average / Maximum Object : 0.01K / 0.12K / 128.00K OBJS ACTIVE USE OBJ SIZE SLABS OBJ/SLAB CACHE SIZE NAME 12345 9876 80% 0.25K 345 36 1380K dentry 5678 4321 76% 1.00K 123 46 492K ext4_inode_cache这个命令特别适合排查内核内存泄漏问题。我曾经遇到过一个案例dentry缓存不断增长却不释放最终导致系统OOM就是通过这个命令发现的。4. 磁盘状态监控全攻略4.1 df磁盘空间监控基础df -h是最基础的磁盘空间检查命令Filesystem Size Used Avail Use% Mounted on /dev/sda1 50G 15G 33G 31% / /dev/sdb1 500G 345G 155G 69% /data tmpfs 3.9G 0 3.9G 0% /dev/shm关键点Use%当这个值超过80%时就应该考虑清理或扩容了。特别是/根分区空间不足会导致系统问题。tmpfs这类内存文件系统不会占用实际磁盘空间但要注意它们会占用内存。4.2 iostat磁盘I/O性能监控iostat -x 1提供了详细的磁盘I/O性能数据Linux 5.4.0-135-generic (ubuntu) 03/15/2023 _x86_64_ (4 CPU) avg-cpu: %user %nice %system %iowait %steal %idle 2.25 0.00 1.25 0.25 0.00 96.25 Device rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util sda 0.00 2.00 1.00 3.00 32.00 48.00 40.00 0.02 5.00 4.00 5.50 1.00 0.40 sdb 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00重点关注以下指标%util设备利用率接近100%表示设备已经饱和await平均I/O等待时间(毫秒)数值越大性能越差avgqu-sz平均队列长度大于1表示可能有I/O瓶颈4.3 iotop进程级磁盘I/O监控当发现磁盘I/O高但不知道是哪个进程导致时iotop命令就派上用场了Total DISK READ: 0.00 B/s | Total DISK WRITE: 12.34 K/s Current DISK READ: 0.00 B/s | Current DISK WRITE: 34.56 K/s TID PRIO USER DISK READ DISK WRITE SWAPIN IO COMMAND 12345 be/4 mysql 0.00 B/s 8.00 K/s 0.00 % 1.23 % mysqld --daemon 67890 be/4 www-data 0.00 B/s 4.34 K/s 0.00 % 0.56 % apache2 -k start这个实时监控工具可以清楚地显示每个进程的磁盘读写情况对于定位I/O密集型进程非常有用。5. 综合监控与自动化技巧5.1 vmstat综合性能监控vmstat 1提供了一个简洁的系统性能概览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 234567 4123456 0 0 1 3 45 89 2 1 96 0 0关键列解释r运行队列中的进程数长期大于CPU核心数说明CPU不足b阻塞的进程数非零值可能表示I/O瓶颈si/soswap in/out非零值表示内存不足us/sy/id/waCPU使用情况与top类似5.2 监控脚本示例对于需要长期监控的场景可以编写简单的shell脚本#!/bin/bash LOG_FILE/var/log/system_monitor.log echo $(date) $LOG_FILE echo --- CPU --- $LOG_FILE mpstat -P ALL 1 1 $LOG_FILE echo --- Memory --- $LOG_FILE free -h $LOG_FILE echo --- Disk --- $LOG_FILE df -h $LOG_FILE iostat -x 1 2 $LOG_FILE这个脚本将关键监控信息记录到日志文件中适合定时任务执行。5.3 常见问题排查流程根据多年经验我总结了一个快速排查性能问题的流程CPU问题top查看整体负载mpstat检查各核心使用是否均衡pidstat定位高CPU进程内存问题free查看内存总量和使用情况cat /proc/meminfo获取详细信息slabtop检查内核内存使用磁盘问题df检查磁盘空间iostat监控I/O性能iotop定位高I/O进程记住这个流程大多数性能问题都能快速定位。在实际运维中我建议将这些命令设为alias或者创建快捷脚本可以大大提高工作效率。