1. Linux系统监控基础从top到vmstat刚入行那会儿我最怕服务器突然变卡。有次半夜收到报警一台线上机器CPU飙到100%手忙脚乱连上去却不知道从哪查起。后来师父教我用了top命令就像拿到了服务器的X光片——所有问题一目了然。top命令是Linux系统监控的瑞士军刀。直接输入top你会看到这样的实时数据top - 14:30:45 up 30 days, 3:22, 2 users, load average: 1.25, 0.98, 0.75 Tasks: 215 total, 1 running, 214 sleeping, 0 stopped, 0 zombie %Cpu(s): 35.2 us, 4.3 sy, 0.0 ni, 60.2 id, 0.3 wa, 0.0 hi, 0.0 si, 0.0 st MiB Mem : 15876.8 total, 1024.3 free, 8192.1 used, 6660.4 buff/cache MiB Swap: 2048.0 total, 2047.8 free, 0.2 used. 6984.5 avail Mem重点看这几行Load average三个数字分别代表1分钟、5分钟、15分钟的平均负载。如果值超过CPU核心数比如4核机器负载4说明系统过载%Cpu(s)us是用户态CPU使用率sy是内核态使用率id是空闲率。如果us长期高于70%可能是应用代码需要优化内存行关注buff/cacheLinux会利用空闲内存做缓存这部分内存应用需要时会被自动释放更高级的用法是按快捷键1展开多核CPU详情M按内存使用排序P按CPU使用排序q退出但top有个缺点——看不到历史数据。这时候就该vmstat出场了。我常用这个命令排查间歇性卡顿vmstat 1 5 # 每隔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 12345 102400 200000 500000 0 0 10 20 500 1000 30 10 60 0 0关键指标解读procs.r运行队列长度持续大于CPU核心数说明CPU饱和memory.swpd使用的交换分区大小突然增长可能触发OOMio.bi/bo块设备读写量KB/s数据库服务器要特别关注system.in每秒中断数突然激增可能有硬件问题去年我们有个MySQL实例偶尔响应慢就是用vmstat发现waIO等待经常冲到50%以上最终定位到是RAID卡缓存策略配置不当。2. 进程管理核心命令ps与kill的实战技巧记得第一次处理僵尸进程时我对着ps aux的输出发了半天呆——密密麻麻的进程列表根本分不清谁是谁。后来才明白ps命令的关键在于参数组合和grep过滤。最实用的组合是ps auxfUSER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.1 169316 13104 ? Ss Jun01 2:32 /sbin/init root 456 0.3 2.1 1023044 165432 ? Sl Jun01 45:22 \_ /usr/bin/dockerd mysql 7890 1.2 15.3 3201456 1.2g ? Ssl Jun01 200:45 \_ /usr/sbin/mysqld几个实用技巧查Java进程ps -ef | grep java注意-ef会显示完整命令行查内存泄漏ps aux --sort-%mem | head -10按内存倒序查线程数ps -eLf | grep nginx-L显示线程当发现异常进程时kill命令就该上场了。但千万别一上来就用kill -9我有次粗暴杀进程导致数据库表损坏被DBA追着骂了一周。正确的操作流程# 先尝试优雅退出 kill -15 1234 # 等30秒看进程是否退出 ps -p 1234 # 如果还在发TERM信号 kill -TERM 1234 # 最后手段才用KILL kill -9 1234推荐几个信号-15(SIGTERM)让进程有机会清理资源-2(SIGINT)相当于CtrlC-1(SIGHUP)重新加载配置-9(SIGKILL)强制终止可能造成数据损坏对于进程组可以用pkillpkill -f python3 worker.py # 按完整命令匹配 pkill -U www-data # 按用户杀进程3. 高级监控工具组合拳当基础命令不够用时这些工具能帮你更深入分析问题htop是top的增强版支持鼠标点击操作树状视图按F5进程搜索按F3自定义显示列安装也很简单# Ubuntu/Debian sudo apt install htop # CentOS/RHEL sudo yum install htopiotop专治磁盘IO问题sudo iotop -o # 只显示有IO的进程 Total DISK READ: 15.34 M/s | Total DISK WRITE: 2.56 M/s PID PRIO USER DISK READ DISK WRITE SWAPIN IO COMMAND 456 be/4 mysql 15.34 M/s 0.00 B/s 0.00 % 98.76 % mysqld --daemonize去年我们有个服务器突然IO飙升就是靠iotop发现是某个开发在测试环境跑全表扫描。nmon适合做长期监控它能记录CPU使用率按核心内存和交换分区磁盘IO读写量、延迟网络流量使用方法nmon -f -s 60 -c 1440 # 每60秒采样记录1440次24小时生成的.csv文件可以用Excel分析趋势。我曾经用这个数据说服老板给数据库服务器加SSD——磁盘延迟图表比任何口头描述都有说服力。4. 典型运维场景解决方案场景一CPU爆满排查top -c查看最高CPU进程pidstat -p PID 1监控该进程详细指标perf top -p PID分析热点函数需安装perf如果是Java应用jstack PID thread.txt导出线程栈场景二内存泄漏诊断free -h确认内存使用情况pmap -x PID查看进程内存分布valgrind --leak-checkfull ./program检测内存泄漏开发环境场景三僵尸进程清理ps -A -ostat,ppid | grep -e [zZ]查找僵尸进程确认父进程是否正常kill -HUP PPID让父进程回收子进程如果无效只能kill -9 PPID场景四服务启动失败journalctl -u nginx查看服务日志strace -f service nginx start跟踪系统调用lsof -i :80检查端口冲突记得有次Nginx启动失败strace显示是bind()报错用lsof发现是有个老进程没彻底退出占着80端口。5. 自动化监控脚本示例手工敲命令毕竟效率低这里分享几个实用脚本监控CPU温度报警#!/bin/bash TEMP$(cat /sys/class/thermal/thermal_zone0/temp) if [ $TEMP -gt 80000 ]; then echo CPU温度过高: $(($TEMP/1000))°C | mail -s 温度报警 adminexample.com fi进程存活监控#!/bin/bash if ! pgrep -f mysqld /dev/null; then systemctl restart mysql echo MySQL重启于 $(date) /var/log/mysql_watchdog.log fi资源报表生成#!/bin/bash echo $(date) report.txt echo CPU负载: report.txt uptime report.txt echo 内存使用: report.txt free -h report.txt echo 磁盘空间: report.txt df -h report.txt把这些脚本加入crontab运维工作能轻松不少。建议先用at命令测试避免直接上cron导致意外循环执行。
Linux系统监控与进程管理实战:从基础命令到运维场景
发布时间:2026/7/6 12:18:04
1. Linux系统监控基础从top到vmstat刚入行那会儿我最怕服务器突然变卡。有次半夜收到报警一台线上机器CPU飙到100%手忙脚乱连上去却不知道从哪查起。后来师父教我用了top命令就像拿到了服务器的X光片——所有问题一目了然。top命令是Linux系统监控的瑞士军刀。直接输入top你会看到这样的实时数据top - 14:30:45 up 30 days, 3:22, 2 users, load average: 1.25, 0.98, 0.75 Tasks: 215 total, 1 running, 214 sleeping, 0 stopped, 0 zombie %Cpu(s): 35.2 us, 4.3 sy, 0.0 ni, 60.2 id, 0.3 wa, 0.0 hi, 0.0 si, 0.0 st MiB Mem : 15876.8 total, 1024.3 free, 8192.1 used, 6660.4 buff/cache MiB Swap: 2048.0 total, 2047.8 free, 0.2 used. 6984.5 avail Mem重点看这几行Load average三个数字分别代表1分钟、5分钟、15分钟的平均负载。如果值超过CPU核心数比如4核机器负载4说明系统过载%Cpu(s)us是用户态CPU使用率sy是内核态使用率id是空闲率。如果us长期高于70%可能是应用代码需要优化内存行关注buff/cacheLinux会利用空闲内存做缓存这部分内存应用需要时会被自动释放更高级的用法是按快捷键1展开多核CPU详情M按内存使用排序P按CPU使用排序q退出但top有个缺点——看不到历史数据。这时候就该vmstat出场了。我常用这个命令排查间歇性卡顿vmstat 1 5 # 每隔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 12345 102400 200000 500000 0 0 10 20 500 1000 30 10 60 0 0关键指标解读procs.r运行队列长度持续大于CPU核心数说明CPU饱和memory.swpd使用的交换分区大小突然增长可能触发OOMio.bi/bo块设备读写量KB/s数据库服务器要特别关注system.in每秒中断数突然激增可能有硬件问题去年我们有个MySQL实例偶尔响应慢就是用vmstat发现waIO等待经常冲到50%以上最终定位到是RAID卡缓存策略配置不当。2. 进程管理核心命令ps与kill的实战技巧记得第一次处理僵尸进程时我对着ps aux的输出发了半天呆——密密麻麻的进程列表根本分不清谁是谁。后来才明白ps命令的关键在于参数组合和grep过滤。最实用的组合是ps auxfUSER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.1 169316 13104 ? Ss Jun01 2:32 /sbin/init root 456 0.3 2.1 1023044 165432 ? Sl Jun01 45:22 \_ /usr/bin/dockerd mysql 7890 1.2 15.3 3201456 1.2g ? Ssl Jun01 200:45 \_ /usr/sbin/mysqld几个实用技巧查Java进程ps -ef | grep java注意-ef会显示完整命令行查内存泄漏ps aux --sort-%mem | head -10按内存倒序查线程数ps -eLf | grep nginx-L显示线程当发现异常进程时kill命令就该上场了。但千万别一上来就用kill -9我有次粗暴杀进程导致数据库表损坏被DBA追着骂了一周。正确的操作流程# 先尝试优雅退出 kill -15 1234 # 等30秒看进程是否退出 ps -p 1234 # 如果还在发TERM信号 kill -TERM 1234 # 最后手段才用KILL kill -9 1234推荐几个信号-15(SIGTERM)让进程有机会清理资源-2(SIGINT)相当于CtrlC-1(SIGHUP)重新加载配置-9(SIGKILL)强制终止可能造成数据损坏对于进程组可以用pkillpkill -f python3 worker.py # 按完整命令匹配 pkill -U www-data # 按用户杀进程3. 高级监控工具组合拳当基础命令不够用时这些工具能帮你更深入分析问题htop是top的增强版支持鼠标点击操作树状视图按F5进程搜索按F3自定义显示列安装也很简单# Ubuntu/Debian sudo apt install htop # CentOS/RHEL sudo yum install htopiotop专治磁盘IO问题sudo iotop -o # 只显示有IO的进程 Total DISK READ: 15.34 M/s | Total DISK WRITE: 2.56 M/s PID PRIO USER DISK READ DISK WRITE SWAPIN IO COMMAND 456 be/4 mysql 15.34 M/s 0.00 B/s 0.00 % 98.76 % mysqld --daemonize去年我们有个服务器突然IO飙升就是靠iotop发现是某个开发在测试环境跑全表扫描。nmon适合做长期监控它能记录CPU使用率按核心内存和交换分区磁盘IO读写量、延迟网络流量使用方法nmon -f -s 60 -c 1440 # 每60秒采样记录1440次24小时生成的.csv文件可以用Excel分析趋势。我曾经用这个数据说服老板给数据库服务器加SSD——磁盘延迟图表比任何口头描述都有说服力。4. 典型运维场景解决方案场景一CPU爆满排查top -c查看最高CPU进程pidstat -p PID 1监控该进程详细指标perf top -p PID分析热点函数需安装perf如果是Java应用jstack PID thread.txt导出线程栈场景二内存泄漏诊断free -h确认内存使用情况pmap -x PID查看进程内存分布valgrind --leak-checkfull ./program检测内存泄漏开发环境场景三僵尸进程清理ps -A -ostat,ppid | grep -e [zZ]查找僵尸进程确认父进程是否正常kill -HUP PPID让父进程回收子进程如果无效只能kill -9 PPID场景四服务启动失败journalctl -u nginx查看服务日志strace -f service nginx start跟踪系统调用lsof -i :80检查端口冲突记得有次Nginx启动失败strace显示是bind()报错用lsof发现是有个老进程没彻底退出占着80端口。5. 自动化监控脚本示例手工敲命令毕竟效率低这里分享几个实用脚本监控CPU温度报警#!/bin/bash TEMP$(cat /sys/class/thermal/thermal_zone0/temp) if [ $TEMP -gt 80000 ]; then echo CPU温度过高: $(($TEMP/1000))°C | mail -s 温度报警 adminexample.com fi进程存活监控#!/bin/bash if ! pgrep -f mysqld /dev/null; then systemctl restart mysql echo MySQL重启于 $(date) /var/log/mysql_watchdog.log fi资源报表生成#!/bin/bash echo $(date) report.txt echo CPU负载: report.txt uptime report.txt echo 内存使用: report.txt free -h report.txt echo 磁盘空间: report.txt df -h report.txt把这些脚本加入crontab运维工作能轻松不少。建议先用at命令测试避免直接上cron导致意外循环执行。