写点什么

Linux 服务器磁盘空间占用情况分析与清理指南

作者:EquatorCoco
  • 2024-09-27
    福建
  • 本文字数:3057 字

    阅读完需:约 10 分钟

为确保重大节日期间,团队负责的测试环境服务器磁盘不会占用过高,导致频繁报警。我们要求在重大节假日前对服务器磁盘占用情况进行检查。如果发现占用过高,则需人为介入,进行相应清理。


一、检查要求


查看各分区占用情况,如果达到以下任一条件,则需要人为介入判断或处理:


(1)磁盘使用率 > 90%

(2)磁盘使用 > 80% 且 剩余空间 < 30G

(3)磁盘使用 > 70% 且 剩余空间 < 50G


二、解决办法


使用 shell 脚本,统计并判断磁盘占用情况,如有异常,输出异常信息。


脚本代码如下:


#!/bin/bash
RED='\033[0;31m'NC='\033[0m'
if [[ $1 == "detail" ]]then df -BGelse IS_NORMAL=1 while read line do if [[ ${line} == Filesystem* ]]; then continue fi
filesystem=$(echo ${line} | awk '{print $1}') use_rate=$(echo ${line} | awk '{print $5}' | sed 's/%//g') avail_space=$(echo ${line} | awk '{print $4}' | sed 's/G//g') mounted_on=$(echo ${line} | awk '{print $6}')
if [[ ${use_rate} -gt 90 ]] || [[ ${use_rate} -gt 80 && ${avail_space} -lt 30 ]] || [[ ${use_rate} -gt 70 && ${avail_space} -lt 50 ]]; then echo -e "${RED}WARN: Filesystem ${filesystem} mounted on ${mounted_on} has problem: use rate is ${use_rate}%, available space is ${avail_space}G.${NC}" IS_NORMAL=0 fi done < <(df -BG)
if [[ ${IS_NORMAL} -eq 1 ]]; then echo "INFO: Disk space usage is normal." fifi
复制代码


关键代码说明:


df -BG :命令用于报告文件系统的磁盘空间使用情况,-BG 选项表示以 G 字节为单位显示,B 的含义为:use SIZE-byte blocks


建议脚本保存路径:/data/sh/general/disk_usage_check.sh


初始化脚本执行命令:mkdir -p /data/sh/general/;touch /data/sh/general/disk_usage_check.sh;chmod +x /data/sh/general/disk_usage_check.sh;vim /data/sh/general/disk_usage_check.sh


三、脚本使用方法


1)根据检查要求,判断磁盘空间占用是否存在占用过多的情况

执行脚本:/data/sh/general/disk_usage_check.sh


2)如由需要,可以进一步查看各分区磁盘占用信息

执行脚本:/data/sh/general/disk_usage_check.sh detail


使用示例,查看结果,分两种情况:


(1)检查正常


[root@localhost ~]# /data/sh/general/disk_usage_check.sh INFO: Disk space usage is normal.
复制代码


(2)检查异常,查看需要人为介入判断及处理


[root@novalocal general]# /data/sh/general/disk_usage_check.sh WARN: Filesystem /dev/vdb mounted on /data has problem: use rate is 76%, available space is 47G.
[root@novalocal general]# /data/sh/general/disk_usage_check.sh detailFilesystem 1G-blocks Used Available Use% Mounted on/dev/mapper/centos-root 49G 12G 38G 23% /devtmpfs 8G 0G 8G 0% /devtmpfs 8G 1G 8G 1% /dev/shmtmpfs 8G 1G 7G 11% /runtmpfs 8G 0G 8G 0% /sys/fs/cgroup/dev/vdb 197G 142G 47G 76% /data/dev/vda1 1G 1G 1G 20% /boottmpfs 2G 0G 2G 0% /run/user/0
复制代码


处理方法可参考下一章节


四、占用定位与解决办法


1. 查看目录下各文给或文件夹大小,并降序输出


[root@f2 data]# du -sh * | sort -hr27G tomcat5.1G did-generator4.1G register2.5G turbine-web1.4G rbmq-productor1.1G consul600M backup544M test-backup527M deploy
复制代码


命令解析:


du: 是 "disk usage" 的缩写,这个命令用于估算文件或目录在磁盘上所占用的空间。
-s: 这个选项告诉 du 命令仅显示总计大小,而不列出每个子目录或文件的大小。
-h: 这个选项让 du 以易读的格式显示大小(例如,自动选择 KB、MB、GB 等单位)。
-r: 这个选项让 sort 命令以降序排列结果(默认是升序)。
复制代码


2. 为什么删除被占用的文件,不能释放空间?


在 Linux 中,当你删除一个文件时,如果该文件仍被某个进程所使用(即有一个打开的文件描述符指向这个文件),那么这个文件的磁盘空间并不会被立即释放。这是因为在 Linux 中,文件的删除实际上是删除了文件名和 inode 的关联,而不是删除 inode 本身。只有当所有关联到该 inode 的文件描述符都被关闭后,该 inode 才会被删除,对应的磁盘空间才会被释放。


如果你删除了一个仍被进程使用的文件,你可以通过重启进程或者重启系统来确保所有的文件描述符都被关闭,从而释放磁盘空间。


可以使用 lsof 命令查看该类文件


(1)查看被删除但未释放的文件的命令:lsof | grep '(deleted)'


(2)查看占用空间最大的被删除但未释放的文件:lsof | grep '(deleted)' | sort -n -r -k 7,7 | head -n 10,命令解析:


-n:以数值进行排序。默认情况下,sort 命令会以字符串方式进行排序,但是 -n 选项会让 sort 命令以数值方式进行排序。
-r:以逆序方式进行排序。默认情况下,sort 命令会以升序方式进行排序,但是 -r 选项会让 sort 命令以降序方式进行排序。
-k 7,7:指定排序的字段。默认情况下,sort 命令会以整行作为排序的依据,但是 -k 选项可以让 sort 命令只以指定的字段作为排序的依据。在这里,-k 7,7 表示只以第7个字段作为排序的依据。
复制代码


五、遇到问题


1. 管道模式执行时,无法更新变量值


  IS_NORMAL=1  df -BG | while read line  do    IS_NORMAL=0    done
echo ${IS_NORMAL}
复制代码


上述代码,最后输出 IS_NORMAL 值始终为 1,无法修改为 0,原因:


在 bash 脚本中,管道符|会创建一个子 shell 来执行管道符右侧的命令。在这个例子中,while read line 循环就在一个子 shell 中执行。因此,循环内部对变量 IS_NORMAL 的修改在子 shell 中发生,不会影响到主 shell 中的变量。


要解决这个问题,可以使用进程替代,将 while read line 循环作为主进程来执行。修改后代码如下:


  IS_NORMAL=1  while read line  do    IS_NORMAL=0    done < <(df -BG) 
echo ${IS_NORMAL}
复制代码


六、补充说明


1. du 和 df 的区别


du 和 df 都是 Linux 系统中的命令,用于检查磁盘空间使用情况,但他们的使用方式和显示的信息有所不同。


(1) du 命令:du 是 "disk usage" 的缩写,这个命令的主要作用是估算文件或者目录在磁盘中占用的空间大小。它会递归地对目录进行扫描,然后将每个子目录的大小都计算出来。


   举例:du -sh /home
复制代码


这个命令会显示 /home 目录的总大小。-s 参数表示只显示总计,-h 参数表示以易读的格式显示大小(例如 K,M,G)。


(2)df 命令:df 是 "disk filesystem" 的缩写,这个命令的主要作用是显示磁盘的使用情况。它会显示所有已挂载的文件系统的磁盘空间使用情况,包括总空间、已使用的空间、剩余的空间以及使用的百分比。


   举例:df -h
复制代码


这个命令会以易读的格式显示所有已挂载的文件系统的磁盘空间使用情况。-h 参数表示以易读的格式显示大小(例如 K,M,G)。


总的来说,du 和 df 的主要区别在于,du 是用来查看文件或目录的大小,而 df 是用来查看磁盘的使用情况。


文章转载自:曾左

原文链接:https://www.cnblogs.com/zengzuo613/p/18434300

体验地址:http://www.jnpfsoft.com/?from=infoq

用户头像

EquatorCoco

关注

还未添加个人签名 2023-06-19 加入

还未添加个人简介

评论

发布
暂无评论
Linux服务器磁盘空间占用情况分析与清理指南_Linux_EquatorCoco_InfoQ写作社区