• 0
  • 1
分享
  • 情景linux--如何解决单日志文件过大导致的磁盘空间不足?
  • SEC 2019-03-21 20:13:53 字数 1911 阅读 3048 收藏 1

情景

有天看到有开发同事A在讨论群里说,一测试环境中某服务打印了大量的日志,把磁盘打满了。这位同事把日志清理了,并请群里的相关人员看下是否需要重启各自的服务。过一会儿,同事B说其中一服务虽然重新启动了,但并未正常启动,因为启动日志中依然显示着... No space left on device ...

前有同事A说磁盘满并把日志清了,后有同事说磁盘还是没有剩余空间。这前后矛盾的现象,激起了我的兴趣,于是我登录到该测试环境服务器上一探究竟。

分析

BTW:

上述所说服务的路径均在/opt目录下,产生的文件也都在/opt目录的相关子目录下。所以,下面示例中关注/opt路径的磁盘空间即可。

使用df命令查看:

df -lh
Filesystem                     Size  Used Avail Use% Mounted on
/dev/mapper/cl-root             92G   12G   80G  13% /
devtmpfs                       7.8G     0  7.8G   0% /dev
tmpfs                          7.8G     0  7.8G   0% /dev/shm
tmpfs                          7.8G   75M  7.7G   1% /run
tmpfs                          7.8G     0  7.8G   0% /sys/fs/cgroup
/dev/sda1                     1014M  138M  877M  14% /boot
/dev/mapper/vg_data2-lv_data2  200G  200G   20K 100% /opt

在/opt目录下使用du命令查看:

sudo du -h --max-depth=1
6.4M	./blueset
9.7G	./laxi
16K	./mysqlback
86M	./logs
9.8G	.

由上可知: 

du命令得到/opt目录只占用了9.8G的空间,而df命令则显示200G全部被占满。为什么会这样呢?du和df得到的磁盘占用的数值不应该一致的么?

原理

经过一番搜索,发现了df和du的差别:

1 正常情况下,两者的输出其实也并不完全相同,但只是稍有差异;

du命令得到的是将指定文件系统中所有的目录、符号链接和文件使用的块数累加,即该文件系统使用的总块数;

df命令得到的是文件系统磁盘块分配情况,包括总块数、剩余块数等。

文件系统分配其中的一些磁盘块用来记录它自身的一些数据,如inode,磁盘分布图,间接块,超级块等。这些数据对大多数用户级的程序来说是不可见的,通常称为Meta Data(元数据)。 du命令是用户级的程序,它不考虑Meta Data,而df命令则查看文件系统的磁盘分配图并考虑Meta Data。

因此正常情况下,df计算的USED空间会比du计算的结果要稍大些。

2 特殊情况下,两者输出的结果差异很大;

上述碰到的问题就是这种特殊情况。

du是以文件名、目录名等为依据计算空间使用的,而df是以硬盘块使用情况来计算空间使用的。

当一个应用程序正在写一个大文件的时候,虽然我们可以对这个文件进行删除或挪走,但应用程序依然占有着句柄,并根据句柄所指磁盘位置直接写磁盘,而不检查该文件是否存在。

对应到上面的场景中,服务在向日志文件中写入时,因为磁盘空间不足,所以把日志文件删除了。但由于服务并没有停止,所以它还占用着句柄,因而两者得到的数据也不一样。

解决方案

对于当前存在的df和du结果不一致问题,可选的解决方案有:

1 重新挂载这个分区;

2 将未关闭的服务停掉,释放句柄;

如果在一开始A同事发现磁盘空间不足时,应该怎么做?

应清空日志文件的内容(echo ' ' > server.log),而不是直接删除文件。通过这种方法,磁盘空间可以立即释放,进程可以继续向文件写入日志,而不必重启服务。如果日志文件内容需要保留,可以先复制一份保存起来,再清空原文件。

总结

避免磁盘空间不足有很多种机制。本文讨论的是上述这种特殊情景下所涉及到的知识点和相应的解决方法。

相关链接

http://itindex.net/detail/39369-linux-df-du

http://www.chinaunix.net/old_jh/6/465673.html

该帖中摘要了一篇来自2001年发布的网文片段,对du和df区别的介绍很详细,推荐仔细阅读。

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          •   说到Jmeter,大家都知道是做接口测试和性能测试的一个工具。很多人脑中会浮现参数化、集合点、检查点等名词,前两篇已经介绍了Jmeter的入门操作,那今天我们就来看如何修改我们的脚本来实现参数化。  举例是我一贯的风格,之前举例截图中,Jmeter都是中文版的操作界面,但是小白根据我的文章进行搭建环境后,发现是英文版的。其实Jmeter自带语言转换功能。操作如下:  点击”Options”->”Choose Language”->”Chinese(Simplified)”  还有一种方法,在Jmeter的bin目录下,找到jmeter.properties文件,右键编辑如下图:...
            4 3 2727
            分享
          •   分布式搜索分析,即ES。在之前的文章《掌握2个小工具,轻松解决大数据/数据库测试!》中,笔者介绍了elasticsearch-head和elasticsearch-sql两个工具,前者具有可视化、操作简单、能够完成es基本管理等特点,后者能够直接将一些基本mysql查询语句翻译为es语句进行查询,两者各具特色。  但随着对es的了解不断深入,发现了一款新的比较好用的es工具——cerebro。本文将从对比的角度出发,介绍cerebro的基本功能和用法,以及与elasticsearch-head和elasticsearch-sql对比,各自的优缺点。  cerebro介绍  安装方式  ce...
            0 0 1013
            分享
          •   2022年度软件测试行业的趋势预测:如果你也想了解更多发展趋势,那就点击下方链接填写调查问卷吧!助力测试行业发展,还能获得精美礼包哦~链接:http://vote.51testing.com/  背景  在运用Python进行开发代码过程中,会遇到变量复制备份的场景,但并没有得到预期的结果,例如下面的例子:lista = ['a', 'b', [1, 2, 3]] listb = lista.copy() lista[2].append(4)   print(lista...
            0 0 1072
            分享
          •   博主数码闲聊站暗示,小米14将采用极致的超窄边框直屏。这块屏幕由华星提供,四边边框低至1mm,屏占比进一步提升,将是业界边框最窄的手机,将在今年年底登场。  众所周知,小米13就采用了极致的窄边框设计,左右边框只有1.61mm,下边框只有1.81mm宽。作为迭代机型,小米14这次将边框做到了1mm,将是屏占比最高的小米数字系列手机。  据悉,华星这块屏幕优化了电路结构,将Fanout走线转移至显示区内部,从结构上节省了下边框需要的fanout布线空间,使窄边框产品的下边框较现有产品缩窄至少20%,让手机拥有更大的显示面积,同时仍可保持细腻流畅的显示效果。  更重要的是,华星还为此开发了FI...
            0 0 794
            分享
      • 51testing软件测试圈微信