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

2018 年 12 月 5 日 架构师之路

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

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


du一下,查看磁盘空间:

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

画外音:似乎还有空间。


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

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

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


du:disk usage

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


df:disk free

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


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

  • du命令返回的值,显示出减去了该文件后的总大小

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


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


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

echo "" > access.log

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


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

lsof:list open files

使用lsof查看打开的文件。


lsof | grep deleted

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

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


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

while(pid=fork())

手误写成了:

while(pid==fork())

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

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


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

  • du:disk usage

  • df:disk free

  • lsof:list open files

  • echo "" > access.log


架构师之路-分享可落地的技术文章


相关推荐:

负载均衡,必须要知道的5件事

“反向代理层”绝不能替代“DNS轮询”


课后作业

while(pid=fork())在什么时候会用到?

登录查看更多
0

相关内容

【干货书】现代数据平台架构,636页pdf
专知会员服务
258+阅读 · 2020年6月15日
【实用书】Python爬虫Web抓取数据,第二版,306页pdf
专知会员服务
122+阅读 · 2020年5月10日
Python计算导论,560页pdf,Introduction to Computing Using Python
专知会员服务
74+阅读 · 2020年5月5日
【实用书】流数据处理,Streaming Data,219页pdf
专知会员服务
77+阅读 · 2020年4月24日
【2020新书】Kafka实战:Kafka in Action,209页pdf
专知会员服务
69+阅读 · 2020年3月9日
【新书】Java企业微服务,Enterprise Java Microservices,272页pdf
在K8S上运行Kafka合适吗?会遇到哪些陷阱?
DBAplus社群
9+阅读 · 2019年9月4日
msf实现linux shell反弹
黑白之道
49+阅读 · 2019年8月16日
这么多年,终于知道为啥右指针不能往回走了
九章算法
5+阅读 · 2019年4月15日
Linux挖矿病毒的清除与分析
FreeBuf
14+阅读 · 2019年4月15日
支持多标签页的Windows终端:Fluent 终端
Python程序员
7+阅读 · 2019年4月15日
百度开源项目OpenRASP快速上手指南
黑客技术与网络安全
5+阅读 · 2019年2月12日
读扩散?写扩散?推拉架构一文搞定!
架构师之路
16+阅读 · 2019年2月1日
如何编写完美的 Python 命令行程序?
CSDN
5+阅读 · 2019年1月19日
为什么分布式一定要有消息队列?
互联网架构师
4+阅读 · 2018年7月5日
Deep Learning for Deepfakes Creation and Detection
Arxiv
6+阅读 · 2019年9月25日
Large-Scale Study of Curiosity-Driven Learning
Arxiv
8+阅读 · 2018年8月13日
Arxiv
3+阅读 · 2018年4月5日
Arxiv
5+阅读 · 2018年3月28日
VIP会员
相关资讯
在K8S上运行Kafka合适吗?会遇到哪些陷阱?
DBAplus社群
9+阅读 · 2019年9月4日
msf实现linux shell反弹
黑白之道
49+阅读 · 2019年8月16日
这么多年,终于知道为啥右指针不能往回走了
九章算法
5+阅读 · 2019年4月15日
Linux挖矿病毒的清除与分析
FreeBuf
14+阅读 · 2019年4月15日
支持多标签页的Windows终端:Fluent 终端
Python程序员
7+阅读 · 2019年4月15日
百度开源项目OpenRASP快速上手指南
黑客技术与网络安全
5+阅读 · 2019年2月12日
读扩散?写扩散?推拉架构一文搞定!
架构师之路
16+阅读 · 2019年2月1日
如何编写完美的 Python 命令行程序?
CSDN
5+阅读 · 2019年1月19日
为什么分布式一定要有消息队列?
互联网架构师
4+阅读 · 2018年7月5日
Top
微信扫码咨询专知VIP会员