我注意到最近运行版本6.2的CentOS / RHEL服务器出现了一个奇怪的现象.
从EL6.0和EL6.1迁移到较新的操作系统版本后,稳定的文件系统使用变得高度可变.最初安装EL6.2的系统表现出相同的行为;显示XFS分区上磁盘利用率的大幅波动(请参见下图中的蓝线).
之前和之后.从6.1升级到6.2发生在星期六.
上一季度同一系统的磁盘使用情况图表,显示了上周的波动情况.
我开始检查文件系统中的大文件和失控进程(日志文件,也许?).我发现我最大的文件报告了du和ls的不同值.使用和不使用–apparent-size开关运行du说明了差异.
# du -skh SOD0005.TXT29G SOD0005.TXT# du -skh --apparent-size SOD0005.TXT21G SOD0005.TXT
在整个文件系统中使用ncdu utility快速检查产生:
Total disk usage: 436.8GiB Apparent size: 365.2GiB Items: 863258
文件系统充满了sparse files,与之前版本的OS /内核相比,丢失了近70GB的空间!
我仔细阅读了Red Hat Bugzilla并更改日志以查看是否有任何关于XFS的相同行为或新公告的报告.
纳达.
我在升级过程中从内核版本2.6.32-131.17.1.el6到2.6.32-220.23.1.el6;次要版本号没有变化.
我用filefrag工具检查了文件碎片. XFS分区上的一些最大的文件有数千个扩展区.在缓慢的活动期间使用xfs_fsr -v在联机碎片整理上运行有助于暂时减少磁盘使用量(请参阅上面第一张图中的星期三).但是,一旦重系统活动恢复,使用量就会激增.
这里发生了什么?
我将此问题追溯到2010年12月对 XFS source tree的提交的讨论.该补丁是在Kernel 2.6.38中引入的(很明显,后来被移植到一些流行的Linux发行版内核中).观察到的磁盘使用量的波动是新功能的结果; XFS Dynamic Speculative EOF Preallocation.
这是一种通过在文件大小增加时推测性地分配空间来减少流式写入期间的文件碎片的举措.每个文件预分配的空间量是动态的,主要是文件系统上可用空间的一个函数(以防止完全耗尽空间).
遵循这个时间表:
freespace max prealloc size >5% full extent (8GB) 4-5% 2GB (8GB >> 2) 3-4% 1GB (8GB >> 3) 2-3% 512MB (8GB >> 4) 1-2% 256MB (8GB >> 5) <1% 128MB (8GB >> 6)
这是文件系统的一个有趣的补充,因为它可能有助于我处理的一些大量碎片文件.
通过释放pagecache,dentries和inode,可以临时回收额外的空间:
sync; echo 3 > /proc/sys/vm/drop_caches
通过在文件系统安装期间定义allocsize值,可以完全禁用该功能. XFS的默认值为allocsize = 64k.
监视/阈值系统可能会感受到这种变化的影响(这就是我捕获它的方式),但也影响了database systems,并且可能会导致精简配置的虚拟机和存储阵列产生不可预测或不希望的结果(他们会使用更多空间超出预期).
总而言之,它让我措手不及,因为没有明确公布分发级别的文件系统变化,甚至没有监控XFS mailing list.
编辑:具有此功能的XFS卷上的性能得到了显着改进.我看到一致<以前显示最多50%碎片的卷上1%碎片.全球写作表现上升! 来自同一数据集的统计信息,将旧版XFS与EL6.3中的版本进行比较. 旧:
# xfs_db -r -c frag /dev/cciss/c0d0p9actual 1874760, ideal 1256876, fragmentation factor 32.96%
新:
# xfs_db -r -c frag /dev/sdb1actual 1201423, ideal 1190967, fragmentation factor 0.87%