> OS:CentOS 5.6
>磁盘布局:
>磁盘(/ dev / sda,/ dev / sdb)
>分区(/ dev / sda1,/ dev / sdb1)
> MD阵列(RAID-1)(/ dev / md0)
> LVM堆栈(/ dev / VolGrp00 / RootLV)
最初,我注意到在执行繁重的I / O(即mkfs)时,系统会慢慢爬行,直到我无法在X会话中移动鼠标指针.我开始记录一些指标,看到负载平均值会慢慢爬升,在我的双核服务器上达到5.0以上.与此同时,我的内存图片从近2GB免费增加到大约10MB免费和近2GB缓冲区.基于此,我怀疑某种缓存是罪魁祸首,但我对LVM,MD和Linux I / O子系统的细节不太熟悉,知道从哪里开始查找.
我发现一个奇怪的问题:如果我剥离LVM层并直接写入数组似乎并不重要,甚至删除数组也无济于事(尽管直接写入分区似乎会导致更短的延迟突发而不是写入数组).
我的大多数测试都是使用命令mkfs.ext4 -i 4096 -m 0< device>完成的,尽管我已经用dd if = / dev / urandom bs = 4K of =< device>测试了这种行为.并得到了类似的结果,所以我很确定这不是mkfs的错.此外,我在另一个系统(来自另一个硬件供应商,但仍然是CentOS 5.6)上尝试了这一点,并再次看到类似的结果.
我可以使用导致我的I / O操作需要更长时间才能完成的任何解决方案,但是“使用直接I / O标志”之类的答案是不可接受的,因为它们导致mkfs从10分钟变为16小时(在那里,尝试过).我正在寻找调整参数,我也正在研究改变I / O调度程序,但我认为向社群寻求正确方向的指导可能会有所帮助.
编辑:
事实证明,问题与内存压力和虚拟内存管理器有关,导致I / O请求被阻塞.以下是我目前对该问题的理解:当mkfs或dd运行时,它们产生的I / O数量超过磁盘可以跟上的数量,因此缓冲区开始填满.当达到vm.dirty_ratio时,来自所有进程的I / O请求开始阻塞,直到缓存清除一些空间(source).同时,低内存条件会触发内核开始将进程从物理内存交换到磁盘上…这会产生更多的I / O,并且这些I / O请求可能会在等待缓存清除时阻塞.
我尝试调整vm.dirty_ratio和其他相关参数,但它们只在系统开始减速时更改(较低的比率=更快的锁定).我还尝试更换I / O调度程序并调整其参数以尝试更快地清除缓存,但没有成功.作为最后的手段,我尝试使用ionice -c3运行mkfs,但由于磁盘在我运行mkfs时大部分都处于空闲状态,因此同样的问题也会出现.我认为如果有一种方法来限制特定进程的I / O请求率,可以避免减速,但我不知道会有什么能做到这一点.
对于尝试什么,我肯定仍然愿意接受建议 – 任何能够推动我朝着正确方向前进的人都会获得绿色选中标记.
另一个编辑:
我偶然发现了control groups,但不幸的是它们只能从RHEL6开始.可以使用Cgroup来启动具有限制块I / O的组中的mkf,但由于这些系统暂时必须保持5.6,因此我将不得不继续寻找另一种解决方案或处理缓慢问题直到升级时间.