磁盘空间不足?_java

    


    整理一下怎么来追踪磁盘空间大小的问题,磁盘空间已满,那么怎么来追查呢?


1、磁盘空间不足现象

    

    磁盘空间不足的时候,监控系统就会发出告警信息:某某分区空间不足,管理员进行磁盘空间整理后,告警就会消失了。


    在此整理了一些日常的磁盘问题的处理方法及查找的步骤。



2、 程序日志导致的磁盘空间不足

  

     在一般的情况下,都是程序打印的日志没有及时归档,从而导致磁盘空间不足,那么在这种情况下,分辨出日志的重要程度,是将历史日志归档到存储上,还是将历史日志直接删除就可以解决了。


    在处理这种日志问题的时候,一般都是写个定时任务,将重要的日志及时的进行打包,然后传送到相关的日志存储服务器上即可。


    在这里,如果是查找大文件的时候可以使用find指令,然后用参数-size,从而查找出日志大的文件,进行及时处理。


    在写定时任务的时候,可以按照小时进行归档,也可以按照大小进行归档,在日志切割的时候就要进行相关的设计规定。


3 、 /var空间满了

    

    var空间,第一反应是啥,肯定是邮件目录,WHY?因为这个目录总是这个出问题。


    邮件目录,只要有定时任务,无论执行成功或者失败都会产生邮件,如果定时任务过多,那么就会导致空间的消耗其实也蛮大的,因为var空间本来分配的磁盘空间就不会很多


    另外一个,当你使用指令df -h查看空间的时候,明明空间是OK的,那么为啥还会有告警信息,这个时候,可能是inode的问题,即磁盘空间索引不足,在邮件发送的时候,由于是小文件,从而会占用大量的inode索引,然而inode也属于磁盘的空间的一部分,inode无法分配,那么必然会造成磁盘空间不足,查看inode的数量可以使用df -i指令查看。


    零时解决方案:删除spoll目录下过多的历史文件即可,这种邮件信息一般是通知定时任务执行是否成功的信息,从而对正常系统无影响(可以解决磁盘空间和inode的问题均可解决)。


    本质解决方案定时任务会产生邮件信息,从而在写定时任务的时候,将执行的正确结果和错误结果都重定向到/dev/null


4、 挂载导致磁盘空间



    挂载为啥能导致磁盘空间告警呢?


    当程序的日志本来是打印到挂载的磁盘空间的时候,如果一瞬间挂载的磁盘不可用或者是被强制卸载,那么日志会打印到本来的目录当中,从而再次进行挂载之后,随着微量的日志信息加入,可能造成磁盘告警


    此种情况怎么来进行处理?其实不可以处理,因为挂载的时候是覆盖了原来的目录,但是空间照样是被占用的,这种目录当你使用df -h来查看每个目录的占用的空间大小的时候,你并不能找到。。。


    这种智能靠经验了,反正经验不是束缚你就是舒服你。。。。


    这种情况比较蛋疼,因为必须将挂载进行卸载,然后将磁盘进行清理操作,然后才可以解决掉告警。。。


    这种诡异的情况可以形容为。。。。磁盘空间去哪了。。。被挂载这条狗吃了。。。。


5、 直接删除日志导致磁盘空间未释放



    在很多情况下,有人看见有大文件,然后就直接将整个大文件进行删除,然后又用df -h来查看的时候,发现磁盘空间并未释放、、、


    当进程打开了一个文件之后,那么这个文件即使被删除,那么其空间也是不会被释放的,在出现这种情况后,最好的情况就是使用指令lsof来进行查看


    可以查看当前系统的可能产生日志的进程,然后lsof -p pid|grep delete,来找到删除的文件,看看是否有日志文件被删除,但是进程仍然占用;当无法找到pid的时候,那么可以直接使用指令lsof |grep delete来进行查找被删除的文件。


    有的人在进行清理日志的时候,使用的方法是先删除文件,然后创建一样名称的文件,这样是不可行的,因为在linux在使用文件的时候,不是靠文件名来进行识别文件的,而是通过inode索引号来识别文件的,也就是说,当你创建了同样名称的文件,但是索引号不同,程序仍然无法找到你新创建的文件,在查看文件的inode的时候,可以使用指令ls -li来进行查看。


    当出现这种情况的时候,必须进行重启应用程序,否则空间是不会释放的


    那么问题来了,我既然删除了文件,为啥在df -h统计的时候,还是统计到了被删除的空间的大小、、、


    

    最好的解决方法:如果此日志文件正在使用,那么可以采用直接置空的方式,例如如下指令>somfile.log,即可,这是最简单的方式,什么echo,那种还是比较繁琐的,但是也用达到同样的目的。。。。


    df -h统计的方式:猜测如下:没经过理论证实,各位看看即可。。。。。


    在统计信息的时候,是根据目录进行统计,那么会统计inode的数量然后乘以block的大小,从而得出磁盘的使用率,由于在直接删除文件的时候,进程打开了这个inode,那么相当于影藏了这个inode,但是实际的磁盘空间还是此文件的数据,并且依旧会查找空余的block写入数据,那么在统计的时候,会依旧写上这些block是在使用的状态,从而此段空间并没有完全的释放。


总结


    1、 在linux中,每个目录的磁盘空间是固定的,那么在程序打印日志后,要及时的进行归档,归档的时候必须进行严格固定日志的格式,例如带上日期后缀名,以便于区分当前的日志和历史日志,在进行日志切割的时候,必须按照时间和大小两个维度来进行切割,这样才能及时备份,不会丢失日志数据。


    2、如果磁盘空间满了,系统在一般情况下是不会崩溃的,因为写入的都是日志信息,只会丢失相关的日志信息,但是在有监控系统的情况下,一般及时处理,不会导致此种问题的发生。


    3、 在部署应用程序的时候,日志必须规定写入固定的目录,从而以便于进行运维自动化,也便于定时脚本的编写。


    4、 对于常用的软件,固定其日志目录,按照软件的类型划分日志目录,例如apache的日志目录/opt/apache/logs,nginx的日志目录/opt/nginx/logs等,按照此等规则进行划分,标准化。