Linux磁盘类问题梳理

磁盘空间报错

问题描述

在Linux服务器创建文件时,出现类似如下空间不足的提示。

No space left on device …

问题原因

磁盘空间告警时候需要快速的分析哪些大文件占用了空间,并根据业务的实际情况针对性的清理

  • 按照目录大小展示最前面的15个目录或者文件
du -xB M --max-depth=2 /var | sort -rn | head -n 15
  • 列出当前目录下最大的10个文件或者目录
du -s * | sort -n | tail
  • 目录大小从大到小排序
du -b --max-depth 1 | sort -nr | perl -pe 's{([0-9]+)}{sprintf "%.1f%s", $1>=2**30? ($1/2**30, "G"): $1>=2**20? ($1/2**20, "M"): $1>=2**10? ($1/2**10, "K"): ($1, "")}e'
  • 递归查找当前目录下所有子目录中的.svn目录
find . -type d -name '.svn' -print0 | xargs -0 rm -rdf
  • 查找最大的5个文件
find . -type f -exec ls -s {} \; | sort -n -r | head -5
  • 查找365天前的文件并删除
find ./ -type f -mtime +365 -exec rm -f {} \;

解决方案

通过上述命令查找可清理的文件并执行清理。

已经删除文件但磁盘空间不释放

问题描述

我们在使用Linux的时候,某些大文件已经删除,但是,磁盘空间告警并未恢复。

问题原因

虽然文件已被删除,但是一些进程仍然打开这些文件,因此其占用的磁盘空间并没有被释放。

解决方案

  • 可以执行lsof 命令显示打开已删除的文件
  • 将有问题的进程重启(清空),磁盘空间就会得到释放
-bash-4.2# lsof | grep delete
mysqld     2470         mysql    4u      REG              253,1           0     523577 /var/tmp/ibfTeQFn (deleted)
mysqld     2470         mysql    5u      REG              253,1           0     523579 /var/tmp/ibaHcIdW (deleted)
mysqld     2470         mysql    6u      REG              253,1           0     523581 /var/tmp/ibLjiALu (deleted)
mysqld     2470         mysql    7u      REG              253,1           0     523585 /var/tmp/ibCFnzTB (deleted)
mysqld     2470         mysql   11u      REG              253,1           0     523587 /var/tmp/ibCjuqva (deleted)
-bash-4.2# kill 2470

磁盘有空间,提示No space left on device

问题描述

经排查磁盘有空间,但是,查看文件提示“ No space left on device...”

# tail -f ../logs/catalina.out
tail: cannot watch `../logs/catalina.out': No space left on device
# df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        7.8G     0  7.8G   0% /dev
tmpfs           7.8G   24K  7.8G   1% /dev/shm
tmpfs           7.8G  880K  7.8G   1% /run
tmpfs           7.8G     0  7.8G   0% /sys/fs/cgroup
/dev/vda1        50G   16G   32G  34% /
tmpfs           1.6G     0  1.6G   0% /run/user/0
/dev/vdb1       197G   73G  115G  39% /data
# df -i
Filesystem         Inodes   IUsed      IFree IUse% Mounted on
devtmpfs          2030447     374    2030073    1% /dev
tmpfs             2033195       7    2033188    1% /dev/shm
tmpfs             2033195     579    2032616    1% /run
tmpfs             2033195      16    2033179    1% /sys/fs/cgroup
/dev/vda1         3276800   77076    3199724    3% /
tmpfs             2033195       1    2033194    1% /run/user/0
/dev/vdb1        13107200  591453   12515747    5% /data

问题原因

由于fs.inotify.max_user_watches参数设置过小,无法查看文件。

解决方案

调整fs.inotify.max_user_watches参数。

vim /etc/sysctl.conf
##添加 fs.inotify.max_user_watches = 32768
sysctl -p /etc/sysctl.conf

磁盘Inode报错

问题描述

经排查日志,报错“must be reclaim inodes”

问题原因

由于服务器Inodes不足导致磁盘只读

解决方案

清理inode占用高的目录

分析根目录下的每个二级目录下有多少个文件,逐层进入inode占用最高的目录,逐步定位占用过高空间的目录,最后进行相应清理

for i in /*; do echo $i; find $i | wc -l; done
for i in /var/*; do echo $i; find $i |wc -l; done 
for i in /var/spool/*; do echo $i; find $i |wc -l; done

查找0字节的文件并执行清理

分析目录下0字节的文件,根据业务场景确认后备份删除

find /home -type f -size 0 -exec rm {} \;
posted @ 2022-08-17 15:42  daibin1004  阅读(40)  评论(0)    收藏  举报