8

一次诡异的磁盘空间占用问题排查

 2 years ago
source link: https://zxs.io/article/970
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

一次诡异的磁盘空间占用问题排查

2016-09-13 分类:操作系统 阅读(4907) 评论(1)

  大半夜接到线上一服务器磁盘占用率超过90%的短信,需要立即处理。一般这种情况都是线上异常,当天日志打太多,无法自动删掉的。上来第一反应就是查我们规范java应用日志目录,居然没有文件,再查,居然连java进程都没有,原来不是java应用,不过没关系,干一年运维也不是白干的,还是有其他方法可以查的,在此记录下整个排查过程。

  用df -h看下是哪个分区比较大,我司应用包都是布在/home目录下的。

$ df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/xvda2             18G  5.0G   12G  30% /
/dev/xvda1            247M   25M  210M  11% /boot
tmpfs                 7.4G  248K  7.4G   1% /dev/shm
/dev/xvdb1             50G   45G  5.3G  90% /home

  然后cd到home目录下,来看看哪个文档比较大,我最常用的命令就是du -h --max-depth=1,通常可以直接找到哪个目录占空间比较大,不过今天诡异了。。

$sudo du -h --max-depth=1   
40K ./***.**                #这是别人的home路径,一堆账号,略去
.
.
.
40K ./***.**
1.9G    .                   #所有文件占用总空间  

  这就很诡异了,上面提示我/home目录已使用45G,实际上只用了1.9G,无果。不查大目录了,我找找到有什么大的文件,查文件,最好用的就是find命令了,因为平时不怎么用,对其参数还是不大了解,所以网上搜了一把,找到下面这条命令(果然学习还是得靠问题驱动)。
  find . -type f -size +800M 查找当前目录下大于800m的文件,依旧无果,改成100m,无果。 然后不按大小,我只查有没有*.log.*的文件(有时候也是小文件太多,导致磁盘满),依旧无果,额。。。已有知识有点不够用了。

  看了下监控系统,发现磁盘占用空间一直在增长,肯定一直是有什么进程在写文件,那我就看看服务器上的进程吧。 常用命令 ps、pstree 这里我先用ps看了下,出来的内容太多,不方便看,遂改用pstree,得到如下结果。

$ sudo pstree
init─┬─DragoonAgent─┬─DragoonAgent
     │              ├─2*[DragoonAgent───10*[{DragoonAgent}]]
     │              ├─DragoonAgent───7*[{DragoonAgent}]
     │              └─DragoonAgent───2*[{DragoonAgent}]
     ├─aegisinc_cli───11*[{aegisinc_cli}]
     ├─agetty
     ├─atd
     ├─crond
     ├─gshelld───3*[{gshelld}]
     ├─irqbalance
     ├─lldpd───lldpd
     ├─6*[mingetty]
     ├─nginx-proxy───4*[nginx-proxy]
     ├─node─┬─4*[node─┬─phantomjs───3*[{phantomjs}]]
     │      │         └─5*[{node}]]
     │      ├─node───5*[{node}]
     │      └─5*[{node}]
     ├─ntpd
     ├─portmap
     ├─sshd───sshd───sshd───bash───pstree
     ├─staragentd─┬─staragent-core───22*[{staragent-core}]
     │            └─staragent-ppf─┬─logagent───12*[{logagent}]
     │                            └─11*[{staragent-ppf}]
     ├─syslog-ng───syslog-ng
     └─udevd

  排除系统进程,看到有nginx-proxy(我司常用的包),还有一个node,我猜应该是个nodejs应用(表示完全不了解这鬼东西),pstree -p,可以显示pid的,有了pid,我们就可以查这些进程在写入哪些文件了。
  优先排除是nginx-proxy的问题后,我查到node进程的pid是 10163,让我来看下这鬼进程在写哪些文件,使用如下命令。

$ ls -al /proc/10163/fd
total 0
dr-x------ 2 admin admin  0 Jul  8 19:56 .
dr-xr-xr-x 7 admin admin  0 Jan 20  2015 ..
lr-x------ 1 admin admin 64 Sep 12 16:16 0 -> /dev/null
l-wx------ 1 admin admin 64 Sep 12 16:16 1 -> /home/admin/snapshot-kgb/logs/nodejs_stdout.log (deleted)
lrwx------ 1 admin admin 64 Sep 10 01:39 10 -> socket:[178406733]
###内容有点多,删去一部分。。。。 
lrwx------ 1 admin admin 64 Sep 10 01:39 15 -> socket:[150611725]
l-wx------ 1 admin admin 64 Sep  9 02:33 2 -> /home/admin/snapshot-kgb/logs/nodejs_stdout.log (deleted)
lrwx------ 1 admin admin 64 Sep 10 01:39 8 -> anon_inode:[eventfd]
lr-x------ 1 admin admin 64 Sep 10 01:39 9 -> /

  这里有俩文件,末尾标示(deleted),然后想到看下别人的操作记录,发现今天同事有上来删过这俩文件,但他没有重启进程。 linux删除正在被写入的文件之后仍是会占用磁盘空间的,这也解释了开始为何我用du、df、find为什么查不到大文件。

  接下来就是如何处理磁盘空间仍被占用的问题了,只需要重启下node进程就好了,咋重启??? 我不会啊!!尴尬。。。尝试清空下该文件 echo '' > /home/admin/snapshot-kgb/logs/nodejs_stdout.log cat /dev/null > /home/admin/snapshot-kgb/logs/nodejs_stdout.log 无果。。。。
  峰回路转,突然在服务器上发现了重启进程的脚本,重启后再用df命令查看磁盘使用率,降到10%了。
  总结一下,如何避免以后出现类似的情况。

1.避免直接删除linux上正在写入的文件,正确做法应该是,重写覆盖该文件 echo ' ' > filename
2.排查耗时较长,很多命令都是现学现卖。
3.近2k服务器,虽然已有磁盘自动清理机制,但未彻底解决问题,可能还得需要一个完美的工具。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK