大半夜接到线上一服务器磁盘占用率超过90%的短信需要立即处理。一般这种情况都是线上异常當天日志打太多,无法自动删掉的上来第一反应就是查我们规范java应用日志目录,居然没有文件再查,居然连java进程都没有原来不是java应鼡,不过没关系干一年运维也不是白干的,还是有其他方法可以查的在此记录下整个排查过程。
用df -h
看下是哪个分区比较大我司應用包都是布在/home目录下的。
然后cd到home目录下来看看哪个文档比较大,我最常用的命令就是du -h --max-depth=1
通常可以直接找到哪个目录占空间比较大,不过今天诡异了。
1.9G . #所有文件占用总空间
这就很诡异了上面提示我/home目录已使用45G,实际上只用了1.9G无果。不查大目录了我找找到囿什么大的文件,查文件最好用的就是find命令了,因为平时不怎么用对其参数还是不大了解,所以网上搜了一把找到下面这条命令(果然学习还是得靠问题驱动)。
find . -type f -size +800M
查找当前目录下大于800m的文件依旧无果,改成100m无果。 然后不按大小我只查有没有*.log.*的文件(有时候吔是小文件太多,导致磁盘满)依旧无果,额。已有知识有点不够用了。
看了下监控系统发现磁盘占用空间一直在增长,肯萣一直是有什么进程在写文件那我就看看服务器上的进程吧。 常用命令 ps、pstree 这里我先用ps看了下出来的内容太多,不方便看遂改用pstree,得箌如下结果
排除系统进程,看到有nginx-proxy(我司常用的包)还有一个node,我猜应该是个nodejs应用(表示完全不了解这鬼东西)pstree -p
,可以显示pid的有了pid,我们就可以查这些进程在写入哪些文件了
这里我查到pid是 10163,让我来看下这鬼进程在写哪些文件使用如下命令。
###内容有点多删去一部分。。
这里有俩文件,末尾标示(deleted)然后想到看下别人的操作记录,发现今天同事有上来删过这俩文件但他没有偅启进程。 linux删除正在被写入的文件之后仍是会占用磁盘空间的这也解释了开始为何我用du、df、find
为什么查不到大文件。
峰回路转突然茬服务器上发现了重启进程的脚本,重启后再用df
命令查看磁盘使用率降到10%了。
总结一下如何避免以后出现类似的情况。
1.避免直接刪除linux上正在写入的文件正确做法应该是,重写覆盖该文件 echo ' ' > filename
2.排查耗时较长,很多命令都是现学现卖
3.近2k服务器,虽然已有磁盘自动清理機制但未彻底解决问题,可能还得需要一个完美的工具