前言
之前在ceph里面就出现过,inode使用完了,但是容量没使用完的问题,当时是因为设置的isize为2048,造成后期的inode的剩余空间比较分散,后面无法分配的情况,本篇讲的是另外一个问题
在使用另外一套文件系统的时候,存储元数据的时候使用的是扩展属性,所以文件并不怎么占用空间,而文件数目很大,后期出现了inode使用完的情况
现象模拟
我们平时在使用一个目录的时候,因为文件都有一定的大小,所以很少出现空间未使用完,而inode使用完的情况,但是这种情况是肯定存在的
- 准备一个10G大小的分区
- 格式化成xfs
- df -i 检查inode的数目,然后使用
seq 4882432 |xargs -i touch {}
持续写入空文件 - 等待一段时间以后,观察容量的使用情况和inode使用情况
实测情况如下:
[root@lab101 ~]# df -i /mnt
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sdc1 4882496 4882496 0 100% /mnt
[root@lab101 ~]# df -h /mnt
Filesystem Size Used Avail Use% Mounted on
/dev/sdc1 9.4G 2.6G 6.8G 28% /mnt
可以看到,inode使用了100%,容量使用了28%,这个时候的写入会提示
[root@lab101 m]# touch testfile
touch: cannot touch ‘testfile’: No space left on device
这个地方出现这个情况的原因是,默认xfs文件系统设置的inode的占用空间的百分比最大为25%,我们看下这个值
[root@lab101 m]# xfs_info /dev/sdc1|grep imaxpct
data = bsize=4096 blocks=2441216, imaxpct=25
可以看到imaxpct=25,实际上这个是可以调整的
[root@lab101 m]# xfs_growfs -m 30 /dev/sdc1
meta-data=/dev/sdc1 isize=512 agcount=4, agsize=610304 blks
= sectsz=4096 attr=2, projid32bit=1
= crc=1 finobt=0 spinodes=0
data = bsize=4096 blocks=2441216, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal bsize=4096 blocks=2560, version=2
= sectsz=4096 sunit=1 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
inode max percent changed from 25 to 30
通过xfs_growfs命令可以设置,这个后面接的数字就是百分比
[root@lab101 m]# xfs_info /dev/sdc1|grep imaxpct
data = bsize=4096 blocks=2441216, imaxpct=30
再次查询inode的使用情况
[root@lab101 m]# df -i /mnt
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sdc1 5858912 4883008 975904 84% /mnt
可以看到又多出了很多空闲的inode了
总结
碰到写入很多小文件的情况,inode不够用的时候,如果空间足够,可以通过调整imaxpct进行inode的分配
备注
默认isize=512字节
默认的空间占用为25%
通过这个可以计算出,固定空间支持的inode数目,然后可以通过比例去调整inode总数大小