今天就说点能直接落地、不会踩新手坑的服务器内存监控方法,帮大家真正实时掌握内存使用情况。先说最常用的命令工具,都是Linux自带的,不用额外装,中小团队应急完全够。
第一个别只会用free -h,要养成敲free -h -s 2的习惯,加个-s参数就是每2秒刷新一次,动态看数值变化。这里敲黑板新手最容易搞混的两个点:cache/buffers不是“被占用的浪费内存”,多数情况下是Linux内核用来加速磁盘读写的“缓存池”,业务真正需要的时候内核会自动释放;真正要看的是最后一列的available,它是系统估算出来的,能立刻分给新进程的内存量,比单纯的free列要准很多很多。如果是CentOS 6这种老版本没有available列,那就大概算一下:free + buffers + cached,不过估算值不如CentOS 7/8/Ubuntu 16.04+自带的准。
第二个是结合top看进程级的内存,应急排查谁吃内存最快。敲top进去之后,按一下大写的M,系统会按进程的RSS降序排列,最上面的那个就是当前常驻内存最多的进程。别只看%MEM哦,有时候小内存机器%MEM波动0.5都很致命,大内存机器1%可能就是8G,得结合实际服务器配置看。如果需要看更细的进程内存信息,比如共享内存、虚拟内存,可以敲ps -eo pid,ppid,cmd,%mem,rss,vsize sort=-rss | head -20,这条命令直接输出PID、父进程、执行命令、内存占比、常驻内存(KB)、虚拟内存(KB),最后加head -20只看前20个吃内存的进程,比top更直观截图留存。
第三个是预警,不能光靠自己盯着屏幕,中小团队没预算上高大上的Prometheus+Grafana的话,用shell脚本加crontab就能实现简单的邮件/钉钉告警。我这里有个自己常用的钉钉机器人脚本片段,你们可以改改直接用:
#!/bin/bash
获取真实可用内存(MB)
AVAIL_MEM=$(free -m | awk 'NR==2{print $7}')
设置阈值,比如低于2048MB告警
THRESHOLD=2048
if [ $AVAIL_MEM -lt $THRESHOLD ]; then
curl 'https://oapi.dingtalk.com/robot/send?access_token=你的钉钉机器人access_token'
-H 'Content-Type: application/json'
-d "

{
"msgtype": "text",
"text": {
"content": "【内存告警】服务器$(hostname)当前真实可用内存为${AVAIL_MEM}MB,低于阈值${THRESHOLD}MB,请及时排查!"
}
}"
fi
然后用crontab -e加一条定时任务,比如每5分钟检查一次:/5 * /root/scripts/check_mem.sh,记得给脚本加执行权限chmod +x /root/scripts/check_mem.sh。这里第二个避坑提醒设置阈值的时候一定要留够buffer,别刚好设成进程正常跑满的数值,比如我这台8G的子节点,正常跑学员服务大概留1.5G的buffer,阈值设成2G,万一突然有日志临时占点cache也不会误报。
其实除了这些自带工具,后期团队业务稳定了,预算够了,还是 上Prometheus+Grafana,能看7天、30天的内存趋势图,找内存泄漏更方便,不过对刚入行的新手和小团队来说,先把这三个方法用熟,应付90%的内存问题都没问题。
你们在运维工作中有没有遇到过类似实习生那种只看静态used的坑?欢迎在评论区分享你的排查经验。

评论列表 (0条):
加载更多评论 Loading...