• Linux 磁盘空间异常爆满的排查和处理


    一.问题现象

    在服务器运维过程中,我们时常会遇到这样的情况,服务器磁盘空间使用率达到100%,业务出现异常。

    二.问题定位

    1.登录服务器,通过df -Hl查看

    1. [root@k8s-master1 ~]# df -Hl
    2. 文件系统 容量 已用 可用 已用% 挂载点
    3. devtmpfs 8.4G 0 8.4G 0% /dev
    4. tmpfs 8.5G 0 8.5G 0% /dev/shm
    5. tmpfs 8.5G 774M 7.7G 10% /run
    6. tmpfs 8.5G 0 8.5G 0% /sys/fs/cgroup
    7. /dev/mapper/centos-root 136G 68G 68G 51% /
    8. /dev/sda1 1.1G 238M 827M 23% /boot

    2.查找占用空间大的目录或文件

    笨方法:在根目录下,通过du -hs命令,列出各目录所占空间大小

    1. [root@k8s-master1 /]# du -hs *
    2. 0 bin
    3. 194M boot
    4. 1012K core.580
    5. 0 dev
    6. 37M etc
    7. 21M home
    8. 7.7G kuboard-data
    9. 0 lib
    10. 0 lib64
    11. 0 media
    12. 0 mnt
    13. 135M opt
    14. du: 无法访问"proc/21212/task/21212/fd/3": 没有那个文件或目录
    15. du: 无法访问"proc/21212/task/21212/fdinfo/3": 没有那个文件或目录
    16. du: 无法访问"proc/21212/fd/3": 没有那个文件或目录
    17. du: 无法访问"proc/21212/fdinfo/3": 没有那个文件或目录
    18. 0 proc
    19. 1.6G root
    20. 738M run
    21. 0 sbin
    22. 0 src
    23. 0 srv
    24. 0 sys
    25. 6.2M tmp
    26. 3.2G usr
    27. 51G var

    相对高效一点的方法是通过du的-d参数,或--max-depth,设置查询的目录深度

    1. du -h -d 2|grep [GT] |sort -nr
    2. du -h --max-depth=2|grep [GT] |sort -nr
    3. #通过这样的方式,可以搜出以G或者T为单位的占用磁盘空间的大目录,并排序
    4. [root@k8s-master1 /]# du -h -d 1 /
    5. 194M /boot
    6. 0 /dev
    7. du: 无法访问"/proc/24731/task/24731/fd/3": 没有那个文件或目录
    8. du: 无法访问"/proc/24731/task/24731/fdinfo/3": 没有那个文件或目录
    9. du: 无法访问"/proc/24731/fd/4": 没有那个文件或目录
    10. du: 无法访问"/proc/24731/fdinfo/4": 没有那个文件或目录
    11. 0 /proc
    12. 738M /run
    13. 0 /sys
    14. 37M /etc
    15. 1.6G /root
    16. 51G /var
    17. 6.2M /tmp
    18. 3.2G /usr
    19. 21M /home
    20. 0 /media
    21. 0 /mnt
    22. 135M /opt
    23. 0 /srv
    24. 0 /src
    25. 7.7G /kuboard-data
    26. 64G /

    效率高的方法,使用find进行查找,比使用du效率要高

    find / -type f -size +1G -exec du -h {} \;  #查找文件大于10G的文件

    遇到问题

    操作删除了一些备份文件和日志信息后,查看空间仍然不足,发现删除的日志,空间并没有释放。

    未释放磁盘空间的原因:

    在Linux或者Unix系统中,通过rm或者文件管理器删除文件将会从文件系统的文件夹结构上解除链接(unlink),然而假设文件是被打开的(有一个进程正在使用),那么进程将仍然能够读取该文件,磁盘空间也一直被占用。而我删除的是nginx的访问日志文件,在删除的时候该文件正在被使用。

    处理办法

    1. [root@local ~]# lsof |grep deleted
    2. nginx 4399 root 38w REG 253,0 19304448 10835682 /var/nginx/logs/t-access.log (deleted)
    3. nginx 4399 root 39w REG 253,0 3502080 10835684 /var/nginx/logs/t-error.log (deleted)
    4. nginx 4401 nobody 38w REG 253,0 19304448 10835682 /var/nginx/logs/t-access.log (deleted)
    5. nginx 4401 nobody 39w REG 253,0 3502080 10835684 /var/nginx/logs/t-error.log (deleted)

    从输出的结果可以看到 /var/nginx/logs/t-access.log 和 t-error.log 还在被使用中,所以导致未释放空间。

    那么如何让进程释放呢?

    方法1:直接 kill 掉相应的进程,或者停掉使用这个文件的应用,让操作系统自己主动回收磁盘空间。

    方法2:以后清理正在被读写的大日志文件时,直接使用 echo "" > xxx.log 命令,即直接将文件置空,并不影响服务的使用,文件大小也被控制下来,磁盘空间也释放了

  • 相关阅读:
    Excel·VBA日期时间转换提取正则表达式函数
    postgresql 内核源码分析 btree索引插入分析,索引页面分裂流程,多举措进行并发优化,对异常进行保护处理
    常见锁策略与CAS介绍
    Ribbon框架原理及解析
    蒂姆·库克解释Apple Intelligence和与ChatGPT合作的区别|TodayAI
    Ubuntu配置FTP服务
    软件项目管理 9.2.软件项目配置管理过程
    【云原生】Kubernetes介绍
    谷粒学苑_第十一天
    ThinkPHP3.2.3反序列化链子分析
  • 原文地址:https://blog.csdn.net/rendongxingzhe/article/details/128036017