Jus*_*ᚄᚒᚔ 4 linux centos software-raid
我一直在尝试解决磁盘上的 I/O 问题。设置如下:
/dev/sda
, /dev/sdb
)/dev/sda1
, /dev/sdb1
)/dev/md0
)/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请求开始块,直到缓存清除了一些空间(源)。同时,低内存条件会触发内核开始将进程从物理内存交换到磁盘上……这会产生更多的 I/O,并且这些 I/O 请求可能会在等待缓存清除时阻塞。
我尝试过调整vm.dirty_ratio
和其他相关参数,但它们仅在系统开始变慢时才会改变(较低的比率 = 更快的锁定)。我还尝试更换 I/O 调度程序并调整它们的参数以尝试更快地清除缓存,但没有成功。作为最后的手段,我尝试运行mkfs
with ionice -c3
,但由于在我运行 时磁盘大部分处于空闲状态,因此出现mkfs
了同样的问题。我认为如果有办法限制特定进程的 I/O 请求率,可以避免速度变慢,但我不知道有什么可以做到这一点。
至于尝试什么,我绝对仍然愿意接受建议——谁能把我推向正确的方向,谁就会得到绿色的复选标记。
另一个编辑:
我偶然发现了control groups,但不幸的是,它们仅在 RHEL6 中可用。可以使用 Cgroups 来启动带有节流块 I/O 的组中的 mkfs,但是由于这些系统暂时必须保持 5.6,我将不得不继续寻找其他解决方案或处理缓慢问题直到升级时间。
从你提供给我们的细节来看,我觉得你需要调整你的 I/O 调度程序。这会对您正在经历的锁定效应产生重大影响。我相信 CentOS 5.6 使用 CFQ。您可能会在最后期限内获得更少的锁定。
归档时间: |
|
查看次数: |
1410 次 |
最近记录: |