zoukankan      html  css  js  c++  java
  • 已删除的文件的进程占用空间导致根分区爆满

    在登上服务器的时候,使用Vim编辑一个文本文件,突然爆出swap错误,但是退出检查没有出现swap文件,查阅知可能是根分区爆满,报错

    查看分区挂载使用

    [root@www ~]# df -hT

    发现是因为根分区使用率百分百

    然后进入根目录下

    使用明亮查看各个目录的大小

    [root@www /]# du --max-depth=1 ./ -h

    发现是jenkins的一个大量日志占用空间,删除日志,就可以了

    但是第二天登录上服务器,又发现一个奇怪的问题,根分区再次爆满

    [root@www /]# df -hT

     但是检查发现,根下的目录根本就没有使用那么大的空间

    [root@www /]# du --max-depth=1 ./ -h

    4.0K    ./selinux
    14M    ./sbin
    587M    ./var
    16G    ./opt
    28M    ./etc
    59G    ./backup
    139M    ./lib
    6.9M    ./bin
    3.4G    ./usr
    16K    ./lost+found
    777M    ./root
    20M    ./databak
    0    ./proc
    15G    ./data
    4.0K    ./srv
    0    ./sys
    22M    ./boot
    1.7M    ./tmp
    639M    ./home
    4.0K    ./mnt
    200K    ./dev
    4.0K    ./media
    22M    ./lib64
    95G    ./

    然后尝试删除其他分区的文件,发现并没有减少,排除其他分区占用根的情况,后续查阅得知,是由于Jenkins的进程依然占用着已删除的文件

    在Linux或者Unix系统中,通过rm或者文件管理器删除文件,只是将它会从文件系统的目录结构上解除链接(unlink),也就是说只是删除了文件和系统目录结构的链接;如果文件在删除时是被打开的(有一个进程正在使用该文件,文件被进程锁定或者有进程一直在向这个文件写数据等)状态,那么进程将仍然可以读取该文件,也就是说没有删除掉文件在读取的状态,所以磁盘空间也就会一直被占用。
    
    一个文件在文件系统中的存放分为两个部分:数据部分和指针部分,指针位于文件系统的meta-data中,数据被删除后,这个指针就从meta-data中清除了,而数据部分存储在磁盘中,数据对应的指针从meta-data中清除后,文件数据部分占用的空间就可以被覆盖并写入新的内容,之所以出现删除文件后,空间还没释放,就是因为有进程还在一直向这个文件写入内容,导致虽然删除了文件,但文件对应的指针部分由于进程锁定,并未从meta-data中清除,而由于指针并未被删除,那么系统内核就认为文件并未被删除

    [root@www /]# lsof |grep delete

    java      28893 jenkins   19r      REG                8,3     1484022    5376261 /tmp/jna4374897431416021330jar (deleted)
    java      28893 jenkins   21w      REG                8,3 82550824960    6165218 /var/log/jenkins/jenkins.log (deleted)
    java      28893 jenkins   22r      REG                8,3     2351351    5376263 /tmp/winstone6467252256712090451.jar (deleted)

    杀掉这个进程

    [root@www /]# kill -9 28893 

    再次查看分区使用情况

    [root@www /]# df -hT

    已经恢复正常,可以正常操作

    但是这种方法并不可取,因为kill进程是通过截断proc文件系统中的文件可以强制要求系统回收分配给正在使用的的文件。必须要确定不会对运行中的进程造成影响时才能使用,应用程序对这种方式支持的并不好,当一个正在使用的文件被截断可能会引发不可预知的问题。

    也可以重启使用该文件的进程,或者重启服务器

    最优解决,在线清理,对待这种进程不停对文件写日志的操作,要释放文件占用的磁盘空间,最好的方法是在线清空这个文件

    通过这种方法,磁盘空间不但可以马上释放,也可保障进程继续向文件写入日志。
    在线清空文件(比如/var/log/jenkins/jenkins.log)的方式:
    # echo " " > /var/log/jenkins/jenkins.log
    # cat /dev/null > /var/log/jenkins/jenkins.log
    # >/var/log/jenkins/jenkins.log
  • 相关阅读:
    MySQL系列(二)--数据类型
    并发和多线程(十)--锁状态概念
    并发和多线程(九)--并发容器J.U.C和lock简介
    并发和多线程(八)--线程安全、synchronized、CAS简介
    Nuxt 2.3.X 配置babel
    Nuxt 2.3.X 配置sass
    vscode写vue模板--代码片段
    ES6和ES5中的this指向问题
    TypeScript -- JavaScript的救赎
    Pycharm 查看一个类的继承关系图
  • 原文地址:https://www.cnblogs.com/zyxnhr/p/10801895.html
Copyright © 2011-2022 走看看