我们有一个具有 66TB 可用空间的备份服务器,设置如下:
12 个 6TB RAID10 阵列 -> 12 个 PV -> 1 个 VG -> 1 个 LV -> xfs
此文件系统专门用于备份(通过 BackupPC)。它接收相当多的 I/O,但绝对不会多到硬件无法处理。但是,我们经历了许多失败的备份,我最近注意到,即使在挂载上写入一个 10 行的文件也需要 20 多秒。运行 iostat 可以显示原因:
[root@lolno BackupPC]# iostat
Linux 2.6.18-194.17.1.el5 (lolno) 06/27/2012
avg-cpu: %user %nice %system %iowait %steal %idle
19.93 0.00 9.53 31.95 0.00 38.59
Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
sda 5.34 115.29 43.07 874600222 326773590
sda1 0.00 0.00 0.00 3586 126
sda2 5.34 115.29 43.07 874594516 326773464
sdb 207.33 3544.02 1594.70 26886233184 12097955904
sdc 11.39 844.42 1033.16 6406058328 7837945704
sdd 11.20 622.92 481.77 4725691832 3654875728
sde 15.84 1812.99 1661.13 13754015304 12601927592
sdf 14.86 1483.24 888.80 11252361120 6742733600
sdg 11.67 1020.94 746.05 7745220408 5659828008
sdh 22.60 1127.12 1424.24 8550776952 10804834600
sdi 12.66 1176.71 1043.97 8926929272 7919898000
sdj 13.50 1140.80 912.27 8654489384 6920787296
sdk 13.14 1314.36 1041.48 9971220872 7901060992
sdl 11.16 674.53 366.49 5117257008 2780306920
sdm 10.82 829.36 604.99 6291851320 4589685592
dm-0 2.82 24.81 9.80 188208594 74373432
dm-1 0.00 0.00 0.00 680 0
dm-2 2.52 50.08 5.81 379928338 44067760
dm-3 8.48 40.40 27.46 306454472 208332272
dm-4 364.33 15591.41 11799.05 118282051176 89511839936
如您所见,I/O 并未均匀分布在磁盘/PV 之间,而是绝大部分都集中在单个磁盘上。这是什么原因造成的?
有关该系统的更多信息:
它运行的是 CentOS 5.5,内核为 2.6.18-194.17.1.el5
[root@lolno BackupPC]# xfs_info /data
meta-data=/dev/mapper/backup_vg1-BackupLV isize=256 agcount=66, agsize=268435455 blks
= sectsz=4096 attr=0
data = bsize=4096 blocks=17581608960, imaxpct=25
= sunit=0 swidth=0 blks, unwritten=1
naming =version 2 bsize=4096
log =internal bsize=4096 blocks=32768, version=2
= sectsz=4096 sunit=1 blks, lazy-count=0
realtime =none extsz=4096 blocks=0, rtextents=0
[root@lolno BackupPC]# lvdisplay -v /dev/backup_vg1/BackupLV
Using logical volume(s) on command line
--- Logical volume ---
LV Name /dev/backup_vg1/BackupLV
VG Name backup_vg1
LV UUID L8i09U-lVxh-1ETM-mNRQ-j3es-uCSI-M1xz45
LV Write Access read/write
LV Status available
# open 1
LV Size 65.50 TB
Current LE 17169540
Segments 12
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:4
我的第一个想法是,这与 xfs 中缺少条带化有关,但根据http://docs.redhat.com/docs/en-US/Red_Hat_Enterprise_Linux/6/html/Storage_Administration_Guide/xfsmain.html#xfscreating
“在 lvm 或 md 卷上创建文件系统时,mkfs.xfs 会选择最佳几何形状。”
那么是不是这件事情没有发生呢,还是有其他事情发生呢?
答案1
从agcount=66
您可以看到,您有 66 个分配组(因此有 66 个潜在 IO 线程),但只有 12 个物理块设备。
XFS 将尝试将每个新目录放入不同的 AG,因此如果您对同一个目录执行大量 IO,则可能会对存储在一个块设备上的一个 AG 执行单线程 IO。
即使您对不同的 AG 执行 IO,这 66 个 AG 中的几个也位于同一个块设备上,这也是可行的。66/12=5.5,因此您最多可以有 5 个 IO 线程将 5 个 AG 的数据写入一个底层块设备。
从中sunit=0 swidth=0
您可以看到文件系统根本不知道底层的 RAID 阵列。
我认为你的文件系统制作不正确。mkfs.xfs
其实并不是那么聪明。
阅读 XFS 文档,了解文件系统的结构以及现有数据最终如何分布在这些结构中。这是一个出奇容易理解的文件系统。
在这里您处于一个很有利的位置,因为您实际上有数据可供查看,而不是使用应用程序开发人员提供的一些会随着时间而改变的虚构规范。
重新制作文件系统,以更好地适应您的数据、块设备和 RAID 布局。特别是“如何计算正确的 sunit,swidth 值以获得最佳性能”常见问题解答中的问题将对您有用,但这绝对不是您唯一需要关注的事情: