在服务器运维过程中,我们经常会遇到这样的情况,收到服务器磁盘空间警告。登录服务器通过df-Hl查看:与告警信息一致,接下来我们需要找到导致磁盘空间满的目录或文件。如何查找占用空间大的目录或文件?比较笨的方法是在根目录下通过du-hs命令列出各个目录占用的空间。然后用同样的方法继续寻找对应的目录。更高效的方法是使用du的-d参数,即--max-depth,来设置查询的目录深度。目录深度增加,查询到的目录会大量显示。这时候可以使用grep进行过滤。du-h-d2|grep[GT]|sort-nrdu-h--max-depth=2|grep[GT]|sort-nr这样就可以找出以G或T为单位的占用磁盘空间大目录,整理好。或者可以使用find查询:find/-typef-size+1G-execdu-h{}\;从效率上来说,find比du更快更灵活。通过这两种方法,我们可以快速找到占用磁盘空间的罪魁祸首。你觉得有那么简单吗?很多时候,你会发现通过find或者du查找了半天,你会发现总占用空间和df占用的磁盘空间相差很大,比如上面两张图。通过df查看,磁盘使用了37G,但是在根目录下通过du-hs查看,加起来差不多10G,没有隐藏目录,谁吃光了空间?很明显,有被删除的文件占用了空间,文件被删除了,但是资源并没有释放。之前介绍过一个非常有用的命令:lsof,我们可以通过以下命令查看:lsof+L1结果可以看到有一个28G左右的大日志文件,删除了,但是空间没有释放,这是很常见的一种情况,对应的解决办法是重启tomcat应用,释放空间。磁盘空间莫名被吃掉?还有一个经常被问到的问题,就是通过df查看的磁盘。会发现Used和Avail的总和不够Size,莫名其妙的被吃掉了一部分。其实这是Linux文件系统的一种安全策略。它会默认为root用户预留5%的磁盘空间以备不时之需。这样可以保证一些关键的应用程序(比如数据库)在硬盘满的时候有一定的余地,不会马上崩溃。我们可以通过tune2fs修改预留空间的比例:tune2fs-m1/dev/vda1通过下图可以看到前后对比:这样吃掉的空间被吐出来了。
