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 {} \;