磁盘满了,为啥du却显示还有很大空间?

今天有个实习生问了我一个诡异的问题,“线下一台磁盘大小32G的开发机(虚拟机)打不出日志”,把追查过程和大家分享一下。

创新互联服务项目包括五台网站建设、五台网站制作、五台网页制作以及五台网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,五台网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到五台省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!

画外音:贵司开发机磁盘容量多大?

先du一下,查看磁盘空间:

 
 
 
 
  1. [shenjian@dev02 ~]# du -sch /
  2. 16G     /

画外音:似乎还有空间。

再试了一下df,发现结果不一样:

 
 
 
 
  1. [shenjian@dev02 ~]$ df -h
  2. 文件系统        容量  已用 可用 已用%  挂载点
  3. /dev/sda2      33G   33G   33G  100% /
  4. /dev/sda1      965M   30M  886M   4% /boot

画外音:显示32G都用完了。

du:disk usage

通过搜索文件来计算每个文件的大小然后累加得到的值。

df:disk free

通过文件系统来获取空间大小的信息。

如果用户删除了一个正在运行的应用程序所打开的某个目录下的文件:

  • du命令返回的值,显示出减去了该文件后的总大小
  • df命令返回的值,则不显示减去该文件后的大小(文件句柄还在被使用),直到该运行的应用程序关闭了这个打开的文件(才会真正释放空间)

常见的场景是,删除了一个很大的正在写入的tomcat的access日志,du显示的结果会把日志大小减去,而df则仍会包含该日志的大小(实际上tomcat仍引用了该文件的句柄)。

对我们的启示是,如果要删除某个access日志,不要粗暴的rm,而要温柔的:

 
 
 
 
  1. echo "" > access.log

画外音:朋友们,有没有rm过仍被引用的日志?

如何发现被应用程序引用着“已删除”文件呢?

lsof:list open files

使用lsof查看打开的文件。

lsof | grep deleted

结果显示,一个我的logsvr程序(跑了几个月了),和实习生写的web-server程序(实习大作业)呈现deleted状态,值得怀疑。

画外音:请在手机上把图放大。

最终定位出,是web-server程序中的一个:

 
 
 
 
  1. while(pid=fork())

手误写成了:

 
 
 
 
  1. while(pid==fork())

导致while内一直fork进程,直到将系统资源吃干。并且该进程已经成了zombie进程,无法kill掉,重启开发虚拟机后,问题得到解决。

画外音:我去,多了一个等号,这个bug好真实。

一分钟不长,希望大家有收获:

  • du:disk usage
  • df:disk free
  • lsof:list open files
  • echo "" > access.log

【本文为专栏作者“58沈剑”原创稿件,转载请联系原作者】

网站标题:磁盘满了,为啥du却显示还有很大空间?
浏览地址:http://www.shufengxianlan.com/qtweb/news46/148346.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联