今天有个实习生问了我一个诡异的问题,“线下一台磁盘大小32G的开发机(虚拟机)打不出日志”,把追查过程和你们分享一下。
画外音:贵司开发机磁盘容量多大?web
先du一下,查看磁盘空间:tomcat
[shenjian@dev02 ~]# du -sch /
16G /架构
画外音:彷佛还有空间。负载均衡
再试了一下df,发现结果不同:ide
[shenjian@dev02 ~]$ df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/sda2 33G 33G 33G 100% /
/dev/sda1 965M 30M 886M 4% /boot代理
画外音:显示32G都用完了。日志
经过搜索文件来计算每一个文件的大小而后累加获得的值。server
经过文件系统来获取空间大小的信息。blog
若是用户删除了一个正在运行的应用程序所打开的某个目录下的文件:进程
常见的场景是,删除了一个很大的正在写入的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好真实。
一分钟不长,但愿你们有收获:
架构师之路-分享可落地的技术文章
相关推荐:
《负载均衡,必需要知道的5件事》
《“反向代理层”毫不能替代“DNS轮询”》
课后做业:while(pid=fork())在何时会用到?