这是我参与11月更文挑战的第29天,活动详情查看:2021最后一次更文挑战
本文涉及一些在Linux系统中进行资源监控的方法,其目的是为了在实际工作中监控系统的资源使用情况。
问题提出
自上个月开始,断断续续排查了几个疑难 bug,都是在生产环境发现的,兹事体大,必须解决,但限于能力和环境,有的bug并没有即时解决,但总算在一定期限内完成任务,由于时间紧,当时并没有详细记录过程,但过后回想,还是要做些经验总结。本文从进程占用内存脚本开始,对 Linux 资源使用情况的监控展开研究,以方便日后使用。
监控CPU和内存占用最多的十个进程
Linux 系统一般使用 ps 命令查看进程资源使用情况,其输出结果如下:
1 | sql复制代码$ ps aux | head -n 4 |
从输出结果可以看出有CPU、内存、进程ID、进程名称等信息,其中CPU和内存的数值为百分比。
由此可知核心命令描述如下:
通过 ps 命令查看进程CPU、内存占用情况,再分别按CPU、内存数值倒序排序,再取前面10个即可。
查看内存占用最多的十个进程命令如下:
1 | bash复制代码ps aux | grep -v PID | sort -rn -k +4 | head -n10 |
解释:
grep -v PID
为去掉带 PID 字样的一行,此处表示标题。sort -rn -k +4
,-k +4 表示按第4列(即内存)内容排序,-rn 表示按数值倒序排序。head -n10
表示取前面的10个,亦即占用内存最多的10个进程。
类似地,对于CPU占用情况,只需要将上面+4
改为+3
即可,因CPU占用百分比位于第三列。
监控指定进程的内存
该脚本是为了应付之前某进程内存泄漏的问题的,完整脚本如下:
1 | bash复制代码#!/bin/bash |
注释如下:
- 由于要监控某一进程,因此需先指定进程名称。
- 再从 ps 列表中查询其 PID 和 内存
- 再由 PID 查询其常驻内存大小,该值在
/proc/<PID>/status
文件中。
脚本每隔5秒输出一次信息,有时内存泄漏量较小,一般观察数小时、半天可以得到结果。确定存在内存泄漏情况时,再深入代码排查。该脚本对占用内存大小并不做严格计算,因为只是观察内存使用是否稳定,或是否持续增长,是否有跳变。就当时监控情况下,该进程下载文件时内存占用突增,过后恢复稳定状态,但保持几分钟十多KB增长的态势,因此判定内存泄漏。
判断磁盘占用情况
本脚本用于磁盘空间使用情况的监控。机制如下:
指定监控目录,指定空间使用百分比的阈值,当超过时,再删除。根据经验,一般超过 85%~90%时即可删除。该脚本可使用定时任务执行,根据磁盘使用空间,可半天或一天执行一次。
1 | bash复制代码#!/bin/sh |
进阶
可在脚本中添加邮件通知功能(可用其它程序实现),当出现异常或有重大事件发生时——如CPU占用达100%或删除文件时,不过目前暂未有时间着手。
本文转载自: 掘金