我一直在试图解决我的磁盘上的I / O问题。 设置如下:
/dev/sda , /dev/sdb ) /dev/sda1 , /dev/sdb1 ) /dev/md0 ) /dev/VolGrp00/RootLV ) 最初,我注意到,当执行繁重的I / O(即mkfs )时,系统会慢慢爬行,以至于我无法在X会话中移动鼠标指针。 我开始logging一些指标,并看到平均负载将缓慢攀升,在双核服务器上达到5.0以上。 与此同时,我的记忆画面从近2GB免费到约10MB免费和近2GB的缓冲区。 基于此,我怀疑某种caching是怪罪,但是我对LVM,MD和Linux I / O子系统的细节知之甚less,不知道从哪里开始寻找。
我发现了一个奇怪的问题:如果剥离LVM层并直接写入arrays,似乎并不重要,甚至删除arrays也没有多大帮助(尽pipe直接写入分区似乎会导致更短的延迟突发比写入数组)。
我的大部分testing都是用命令mkfs.ext4 -i 4096 -m 0 <device> ,尽pipe我用dd if=/dev/urandom bs=4K of=<device>testing了这个行为dd if=/dev/urandom bs=4K of=<device>并且得到了类似的结果我很确定这不是mkfs的错误。 另外,我在另一个系统(来自另一个硬件供应商,但仍然是CentOS 5.6)尝试了这一点,并再次看到类似的结果。
我很满意任何解决scheme,导致我的I / O操作需要一些时间来完成,虽然像“使用直接I / O标志”的答案是不可接受的,因为它们导致mkfs从10分钟到16小时(在那里,试过了)。 我正在寻找调整参数,同时也在考虑改变I / O调度程序,但是我认为向正确的方向请求社区提供一些指导可能是有帮助的。
编辑:
事实certificate,问题更多地与内存压力和虚拟内存pipe理器相关,从而导致I / O请求阻塞。 这是我目前对这个问题的理解:当mkfs或dd运行时,它们产生比磁盘更多的I / O,所以缓冲区开始填满。 当达到vm.dirty_ratio时,所有进程的I / O请求开始阻塞,直到caching清除一些空间( 源 )。 同时,低内存条件触发内核开始将进程从物理内存交换到磁盘上……这将产生更多的I / O,并且这些I / O请求可能在等待caching清除时阻塞。
我已经尝试调整vm.dirty_ratio和其他相关参数,但只有当系统开始减速时才会更改(较低的比率=更快的locking)。 我也尝试换掉I / O调度程序,并调整其参数,以尽快清除caching,但没有成功。 作为最后的手段,我尝试用ionice -c3运行mkfs ,但由于在运行mkfs时磁盘大部分空闲,同样的问题也出现了。 我认为如果有办法限制特定进程的I / O请求速度,可以避免减速,但是我不知道有什么办法可以做到这一点。
无论是谁能推动我走向正确的方向,我都肯定会接受build议。
另一编辑:
我偶然发现了一些控制组 ,但不幸的是只能从RHEL6开始。 Cgroups可以用来启动一个带有受限块I / O的组中的mkfs,但是由于这些系统必须保持5.6,所以我将不得不继续寻找另一个解决scheme或者处理缓慢问题,直到升级时间。
从你给我们的不足之处可以看出,你需要调整你的I / O调度器。 这可能会对您遇到的locking效果产生重大影响。 我相信CentOS 5.6使用CFQ。 截止date可能会减less。