运维神坑记——空间满了,日志删除了,空间竟未释放?

Linux IT敢客 7个月前 (04-28) 8567次浏览 已收录 1个评论 扫描二维码

        作为一名运维人员,经常会收到各种报警,像磁盘使用率超过多少,或者磁盘满了这种告警,真是熟悉不过了,往往我们也就是上服务器,刷刷命令,看看哪些大的日志啊是不是撑爆了服务器,然后一顿删除操作,但是针对这些告警的操作往往是有风险的,下面我就来分析一波案例!
        某次在服务器上处理磁盘空间的问题,发现了一个巨大的日志文件,70+G,而整个磁盘才 100G,报警已经提示磁盘使用率超过 80%了,然后一顿操作,rm -rf ***.log,删除了这个 70+G 的日志文件,然后兴奋的 df -h 一看,愕然,怎么磁盘使用还是 80%,

[fulihui@open-weixin-core-business1 ~]$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        99G   75G   19G  80% /
devtmpfs        7.8G     0  7.8G   0% /dev
tmpfs           7.8G     0  7.8G   0% /dev/shm
tmpfs           7.8G  480K  7.8G   1% /run
tmpfs           7.8G     0  7.8G   0% /sys/fs/cgroup
tmpfs           1.6G     0  1.6G   0% /run/user/1001

然后在该目录 du -sh 一查看,发现只有 50M 了啊,这就奇怪了。删除的文件哪去了?空间为啥不释放?Linux 好像没有回收站的啊!!!!运维神坑记——空间满了,日志删除了,空间竟未释放?,这里无论我们再怎么新建这个被删除的****.log 都还是不行,再置空这个****.log 都不行。

这时候就开始各种排查了,最后查到的原因是这个日志文件一直在被进程使用,而直接删除日志文件,进程未停止,事实上进程的日志还是会继续不断在往这个日志里面写,日志输出的句柄未结束,使用下面的命令 lsof |grep -i delete 能看服务器上被删除的文件而进程未停止,

[fulihui@open-weixin-core-business1 ~]$ lsof |grep -i delete
java      12749       fulihui    1w      REG              253,1 122232569293    660371 /home/fulihui/open-weixin/open-weixin-core/logs/stdout.log (deleted)
java      12749       fulihui    2w      REG              253,1 122232569293    660371 /home/fulihui/open-weixin/open-weixin-core/logs/stdout.log (deleted)
java      12749       fulihui  104w      REG              253,1            0    660373 /home/fulihui/open-weixin/open-weixin-core/logs/mybatis.log (deleted)
java      12749 12751 fulihui    1w      REG              253,1 122232489830    660371 /home/fulihui/open-weixin/open-weixin-core/logs/stdout.log (deleted)
java      12749 12751 fulihui    2w      REG              253,1 122232489830    660371 /home/fulihui/open-weixin/open-weixin-core/logs/stdout.log (deleted)
java      12749 12751 fulihui  104w      REG              253,1            0    660373 /home/fulihui/open-weixin/open-weixin-core/logs/mybatis.log (deleted)
java      12749 12752 fulihui    1w      REG              253,1 122232489830    660371 /home/fulihui/open-weixin/open-weixin-core/logs/stdout.log (deleted)
java      12749 12752 fulihui    2w      REG              253,1 122232489830    660371 /home/fulihui/open-weixin/open-weixin-core/logs/stdout.log (deleted)
java      12749 12752 fulihui  104w      REG              253,1            0    660373 /home/fulihui/open-weixin/open-weixin-core/logs/mybatis.log (deleted)

会刷出很多这个(deleted)的日志,这个日志就是进程还在,而日志却被删除了,第一个字段 java 表示进程,第二个字段 12749 表示进程的 pid,第三个表示进程的子 pid,第四个表示进程的用户,倒数第二个字段就是被删除的日志,倒数第三个字段是日志的大小。接下来我们进程这个进程的 proc 目录查看

cd /proc/12749/fd/
 ls -l|grep deleted
l-wx------ 1 fulihui fulihui 64 Apr 27 19:23 1 -> /home/fulihui/open-weixin/open-weixin-core/logs/stdout.log (deleted)
l-wx------ 1 fulihui fulihui 64 Apr 27 19:23 104 -> /home/fulihui/open-weixin/open-weixin-core/logs/mybatis.log (deleted)
l-wx------ 1 fulihui fulihui 64 Apr 27 19:23 2 -> /home/fulihui/open-weixin/open-weixin-core/logs/stdout.log (deleted)

会发现,这是一个指向性的链接文件,而磁盘未释放的空间就是在这 1,104,2 里面,现在知道问题原因了,要解决问题,要么重启进程,要么重启服务器,但是,对于生产环境而言,停进程是有风险的,那就更不必说停服务器了,对业务有影响,其实不然,我们还可以用下面的方法来释放空间,这里如果我们删除这些 1,104,2,会发现是删除不掉的,提示权限不足,这可能是进程机制问题,接下来我们只要将这些 1,104,2 置空即可,使用下面的命令,然后再看磁盘空间信息,发现使用只有 6%了。

echo > 1
echo > 104
echo > 2
[root@open-weixin-core-business1 fd]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        99G  5.6G   88G   6% /
devtmpfs        7.8G     0  7.8G   0% /dev
tmpfs           7.8G     0  7.8G   0% /dev/shm
tmpfs           7.8G  480K  7.8G   1% /run
tmpfs           7.8G     0  7.8G   0% /sys/fs/cgroup
tmpfs           1.6G     0  1.6G   0% /run/user/1001

        至此,问题得以解决,但是这个只是临时解决了,只能等待下一次更新或者某情况下重启了进程才得以完全解决,不然要以后手动来置空文件释放空间了。
        


        小结:
        1、从上面我们发现,删除日志是有风险的,我们应该尽量置空日志文件,
        2、我们从根本上说,应该优化日志的输出,以日期按天分割,这样删除之前的日志才不会有影响。
     举一反三:
        linux 上虽然没有回收站,但是也是可以恢复被删除的文件的,使用 debugfs 命令,不知道恢复文件后再置空,会不会解决这个问题,有待尝试。


IT 敢客 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:运维神坑记——空间满了,日志删除了,空间竟未释放?
喜欢 (158)
[313176056@qq.com]
分享 (0)
IT敢客
关于作者:
“我所做的一切都是为了方便我的生活~~~“
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
(1)个小伙伴在吐槽
  1. IT敢客
    解释一波/proc/nnnn/fd,百度得来的当linux打开一个文件的时候,Linux内核会为每个进程在/proc/ 『/proc/nnnn/fd/文件夹(nnnn为pid)』建立一个以其pid为名的文件夹用来保存进程的相关信息,而其子文件夹fd保存的是该进程打开的全部文件的fd(fd:file descriptor)。签到成功!签到时间:2018-04-28 10:25:52,每日打卡,生活更精彩哦~
    IT敢客2018-04-28 10:27 回复 未知操作系统 | Maxthon 浏览器5.0