单个文件过大(block不足)
模拟环境
#模拟一个块文件并挂载
dd if=/dev/zero of=/test_sda count=1 bs=1G
mkfs.xfs /test_sda
mkdir /test_dir
mount /test_sda /test_dir/
df -hT /test_dir/
Filesystem Type Size Used Avail Use% Mounted on
/dev/loop0 xfs 1014M 33M 982M 4% /test_dir
模拟故障
#创建一个大文件
dd if=/dev/zero of=/test_dir/1.txt bs=1100M
dd: error writing ‘/test_dir/1.txt’: No space left on device
1+0 records in
0+0 records out
1028587520 bytes (1.0 GB) copied, 1.13068 s, 910 MB/s
排查思路;当遇到文件空间不足时
#首先查看磁盘分区的使用率
df -h
#对磁盘使用率较高的分区挂载点进行查看
du -sh /test_dir/* | sort -hr
du -sh /test_dir/xxx/* | sort -hr
由此方法一层一层的查找较大的文件
#对查找到的一个或多个较大的文件 判断是否可以删除
小文件较多(inode不足)
模拟环境
#模拟一个块文件并挂载
dd if=/dev/zero of=/test_sdb count=1 bs=10M
mkfs.ext4 /test_sdb
mkdir /inode_dir
mount /test_sdb /inode_dir/
df -i /inode_dir/
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/loop1 2560 11 2549 1% /inode_dir
模拟故障
#创建比分区inode数更多的文件
cd /inode_dir/
echo {1..2555} |xargs touch
touch: cannot touch ‘2550’: No space left on device
touch: cannot touch ‘2551’: No space left on device
touch: cannot touch ‘2552’: No space left on device
touch: cannot touch ‘2553’: No space left on device
touch: cannot touch ‘2554’: No space left on device
touch: cannot touch ‘2555’: No space left on device
排查思路
#首先查看磁盘分区的使用率; (这里磁盘使用率仅百分之三,所以排除是因为 block不足导致的故障)
df -h /inode_dir/
Filesystem Size Used Avail Use% Mounted on
/dev/loop1 8.7M 216K 7.8M 3% /inode_dir
#查看分区的inode使用率; (inode使用率为百分之百,所以导致文件不可创建)
df -i /inode_dir/
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/loop1 2560 2560 0 100% /inode_dir
#查找分区中,哪一个目录下的文件过多,-size可调整
find /xxx -type d -size +1M
#注: 目录的大小表示的是,目录下的文件个数的大小。
# 目录大小为2.3M;该目录下大概会有10万个文件。
# echo {1..100000} |xargs touch
因为文件没有被彻底删除
因为文件没有被彻底删除导致的磁盘空间不足案例
什么是彻底删除文件?(文件删除原理)
- 文件删除条件:
- 硬链接数为0
- 进程调用数为0
模拟环境
#模拟一个块文件并挂载
dd if=/dev/zero of=/test_delete count=1 bs=1G
mkfs.xfs /test_delete
mkdir /delete_dir
mount /test_delete /delete_dir/
df -h /delete_dir
Filesystem Size Used Avail Use% Mounted on
/dev/loop2 1014M 33M 982M 4% /delete_dir
模拟文件没有被彻底删除–硬链接数不为0
模拟故障
#创建一个文件撑满分区
dd if=/dev/zero of=/delete_dir/1.txt count=1 bs=980M
#可用容量剩余1.8M
df -h /delete_dir/
Filesystem Size Used Avail Use% Mounted on
/dev/loop2 1014M 1013M 1.8M 100% /delete_dir
#为文件创建一个硬链接
ln /delete_dir/1.txt /delete_dir/1.txt_ln
#磁盘空间不足
dd if=/dev/zero of=/delete_dir/2.txt count=1 bs=10M
dd: error writing ‘/delete_dir/2.txt’: No space left on device
#删除原文件
rm -rf /delete_dir/1.txt
#再次查看,磁盘可用容量剩余,依旧为1.8M
df -h /delete_dir/
Filesystem Size Used Avail Use% Mounted on
/dev/loop2 1014M 1013M 1.8M 100% /delete_dir
排查思路
#查看磁盘的容量
df -h
#排查分区中,文件大小
du -sh /xxx/* |sort -hr
du -sh /xxx/xxx/* |sort -hr
#将找到的文件确认,是否可以删除
#若删除后 磁盘可用量不变,再次使用 du -sh /xxx/* |sort hr 方法寻找
总结:文件删除的条件之一:硬链接数为0.
模拟文件没有被彻底删除–文件被进程调用
模拟故障
#写入数据
seq 100000000 >> /delete_dir/1.txt
ll -h /delete_dir/1.txt
-rw-r--r--. 1 root root 848M May 10 14:52 /delete_dir/1.txt
#查看磁盘使用率
df -h /delete_dir
Filesystem Size Used Avail Use% Mounted on
/dev/loop2 1014M 880M 135M 87% /delete_dir
#打开一个新的终端连接,并访问此文件(使用tail -f 进程调用该文件)
tail -f /delete_dir/1.txt
99999991
......
#删除该文件
rm -rf /delete_dir/1.txt
ll -d /delete_dir/1.txt
ls: cannot access /delete_dir/1.txt: No such file or directory
#再次查看磁盘使用率(可以看到磁盘空间并没有被释放)
df -h /delete_dir
Filesystem Size Used Avail Use% Mounted on
/dev/loop2 1014M 880M 135M 87% /delete_dir
排查思路
#查看磁盘的使用率
df -h
#查看分区下的文件大小(大致计算下,文件大小的总和 并与磁盘使用量进行比较)
du -sh /xxx/* |sort -hr
注:如果发现文件大小的总和 与磁盘使用量差距很大;大概就是文件被没有被彻底删除导致的
#显示系统中所有被打开的文件;“deleted”表示文件没有入口,但是被调用(进程调用数不为0)
[root@localhost ~]# lsof |grep deleted
COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME
tail 16781 root 3r REG 7,2 888888898 67 /delete_dir/1.txt (deleted)
#解决
重启或关闭对应的服务/进程
总结:文件被彻底删除条件之一:该文件被进程调用数为0