1. Linux系统资源监控入门指南
刚接触Linux系统监控时,我经常被各种命令和参数搞得晕头转向。直到有次服务器突然卡死,手忙脚乱查不出原因,才意识到系统监控的重要性。Linux系统监控就像汽车的仪表盘,能实时反映CPU、内存等关键指标的状态。
最基础的监控命令非ps和free莫属。ps命令就像进程显微镜,能查看每个程序的运行状态。记得有次发现Python服务异常,用ps aux | grep python快速锁定了内存泄漏的进程。而free命令则是内存体检报告,free -h能以人类可读格式显示内存使用情况,特别适合快速排查内存不足问题。
初学者常困惑于free命令输出的buffers和cached区别。简单来说,buffers是磁盘读写缓冲区,cached是文件缓存。当应用需要内存时,这些缓存会被自动释放,所以查看可用内存时要重点关注available字段。有次客户投诉服务变慢,我通过watch -n 1 free -h发现available内存持续下降,最终定位到是日志服务配置错误导致的内存溢出。
2. 命令行监控工具深度解析
2.1 ps命令的进阶用法
很多人以为ps只能查看进程列表,其实它暗藏玄机。通过组合排序和awk,可以变身性能分析利器。我常用这三个黄金命令:
# CPU占用Top10 ps aux --sort=-%cpu | head -n 11 # 内存占用Top10 ps aux --sort=-%mem | head -n 11 # 统计Java进程总内存 ps -C java -o rss= | awk '{sum+=$1} END {print sum/1024"MB"}'最近排查线上问题时,发现用ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem能同时显示父子进程关系,意外发现某个子进程内存泄漏拖垮了整个服务。ps的-L参数还能查看线程信息,对排查多线程应用特别有用。
2.2 free命令的隐藏技能
free命令的-s参数可以定时刷新,配合watch命令更强大:
# 每2秒刷新,高亮变化值 watch -n 2 -d free -h有次性能调优时,我通过free -w发现buffers异常高,原来是某服务频繁写临时文件导致的。-t参数可以显示总计行,-s 5表示5秒刷新一次。建议将alias mem='free -hwt -s 3'加入bashrc,建立自己的监控快捷命令。
3. 可视化监控工具实战
3.1 htop:终端里的控制中心
第一次用htop时,那彩色界面和鼠标支持让我惊艳。在CentOS上安装很简单:
yum install epel-release yum install htop它的 killer feature 是交互式操作:
- F2进入设置界面,可以自定义显示列
- F3搜索进程,F4过滤进程
- F5树形展示,看清父子进程关系
- Space标记多个进程批量操作
有次服务器CPU飙高,我用htop的Shift+H显示线程,发现是某个Java线程死循环。还喜欢它的F9杀进程功能,不用再记PID号。建议把-d 10参数设为默认,降低刷新频率节省资源。
3.2 nmon:全能型监控神器
nmon的独特之处在于能同时监控CPU、内存、磁盘、网络:
nmon -f -s 30 -c 120 -t这个命令会每30秒采集一次,共采集120次,-t包含详细进程信息,-f输出到文件。生成的.nmon文件可以用nmon_analyzer生成Excel图表。
在分析性能基线时,我常用nmon -s 300 -c 288 -f做24小时监控(300秒×288次)。它的磁盘统计特别详细,能看出是读密集还是写密集型负载。
4. 高级监控技巧与实战案例
4.1 /proc文件系统探秘
/proc是宝库,我经常用这些命令:
# 核心指标速查 cat /proc/meminfo | grep -E 'MemTotal|MemFree|Buffers|Cached' # 进程级内存详情 cat /proc/[pid]/status | grep -i vm # slab分配器情况 cat /proc/slabinfo曾经遇到服务器内存耗尽但free显示可用内存充足的怪事,最后在/proc/meminfo发现Slab占用20GB,原来是内核模块内存泄漏。/proc/[pid]/smaps更能显示进程内存的详细分布。
4.2 监控脚本编写实战
把常用命令封装成脚本能提升效率。这是我的内存监控脚本模板:
#!/bin/bash LOG=/var/log/memwatch.log while true; do date >> $LOG free -m >> $LOG ps aux --sort=-%mem | head -n 6 >> $LOG echo "-----" >> $LOG sleep 60 done更专业的做法是用collectd+Grafana搭建监控系统。有次用这个组合发现了内存使用的周期性波动,最终定位到是定时任务加载大文件导致的。