背景
自己一直通过 mdadm 在软件层面对多块磁盘进行 RAID1 配置,一个主要的原因是 mdadm 是 KickStart 默认软件。因为只是 RAID1,所以使用起来也是比较方便,虽然有些小坑,但总体来说还好。
最近遇到一个问题, mdadm 在配置 RAID1 时,磁盘同步很慢。
现象
先说下磁盘构成,一般情况下是这样:
1 | [root@yiran 20:23:48 ~]$lsblk |
两块 SSD 各自分区,并将第一个分区通过 mdadm 做 RAID1,保证系统分区高可用,分区大小是 45G,但是因为是 SSD 磁盘,所以速度也不会慢到哪去。
最近遇到的问题就是我觉得最不应该有问题的地方:同步速度很慢,非常慢,慢到离谱:
1 | [root@yiran 20:28:00 ~]$mdadm -D /dev/md127 |
调查
确认硬件没问题之后,尝试通过 /proc/mdstat
可以看到同步速度只有 1M 左右,通过 iostat
命令看磁盘读写状态发现磁盘没有任何压力,使用率也是正常水平。
到这里没啥想法了,想到一点,系统是如何设置软 raid 同步速度的呢?
软 raid 在进行同步时,肯定会对磁盘进行大量的读写来保证磁盘数据正确性,如果是 RAID1 ,那就是完全的镜像了。如果 RAID 分区上正在进行非常重要的业务读写,但是 mdadm 又占用了比较大的读写带宽,肯定会影响到我们的业务,所以系统应该是存在一个上限值的。
经过搜索,查到了两个系统参数:
1 | /proc/sys/dev/raid/speed_limit_max |
看一下系统默认值,发现 speed_limit_max 是200M,也就是说我现在的速度远远达不到上限,还有其他原因。
可惜的是,我查看了系统 /var/log/messages 和 dmesg ,都没有发现什么线索。
解决
因为这个问题虽然不重要,但是比较紧急,所以就在不知道原因的情况下先修复了它,我们可以在 /etc/sysctl.conf
中添加这两项配置来更改相应的数值。
1 | [root@yiran 20:59:34 ~]$cat /etc/sysctl.conf |
在这篇博客 中还提到了其他方式能够提升软 raid 的同步速度,比如设置 read-ahead、条带大小、Bitmap 等,但是都不如 sysctl 调整系统参数来的方便,而且副作用也没有那么大。
总结
提交了一个不知道问题原因的修复 Patch,内心还是有些慌的,如果有读者看到并知道原因,麻烦留言告诉我,谢谢。