我的服务器显示平均负载很高,经过调查发现有很多由raid引起的IO。
服务器使用 i7 3770 处理器、32GB 内存和 2x3TB 磁盘,带有 CentOS7 和软件 raid 设置。
[root@server ~]# cat /proc/mdstat
Personalities : [raid1]
md2 : active raid1 sda3[1] sdb3[0]
1073610752 blocks super 1.2 [2/2] [UU]
[===============>.....] check = 77.3% (830580032/1073610752) finish=333.7min speed=12133K/sec
bitmap: 4/8 pages [16KB], 65536KB chunk
md3 : active raid1 sda4[1] sdb4[0]
1839090112 blocks super 1.2 [2/2] [UU]
bitmap: 3/14 pages [12KB], 65536KB chunk
md0 : active raid1 sda1[1] sdb1[0]
16760832 blocks super 1.2 [2/2] [UU]
resync=DELAYED
md1 : active raid1 sda2[1] sdb2[0]
523712 blocks super 1.2 [2/2] [UU]
resync=DELAYED
unused devices: <none>
这项检查已自动启动,当我注意到它还不到 12 小时时,它已进行了 54%。我检查了磁盘健康状况,我的服务器提供商也在 2 天前对其进行了测试,因为我确信磁盘导致我的服务器平均负载过高。
当我检查哪些进程延迟时,我得到了这个,每次我运行它时,其中一个 raid 进程就在那里
[root@server ~]# top -b -n 1 | awk '{if (NR <=7) print; else if ($8 == "D") {print; count++} } END {print "Total status D (I/O wait probably): "count}'
top - 08:38:38 up 1 day, 16:23, 3 users, load average: 6.33, 6.32, 6.22
Tasks: 288 total, 2 running, 280 sleeping, 4 stopped, 2 zombie
%Cpu(s): 3.9 us, 0.7 sy, 0.3 ni, 76.6 id, 18.6 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 32460092 total, 265352 free, 7304544 used, 24890196 buff/cache
KiB Swap: 16760828 total, 16727480 free, 33348 used. 24434784 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
387 root 20 0 0 0 0 D 0.0 0.0 0:24.48 kworker/u16:4
545 root 20 0 0 0 0 D 0.0 0.0 1:14.82 jbd2/md2-8
449624 root 25 5 0 0 0 D 0.0 0.0 5:48.69 md2_resync
Total status D (I/O wait probably): 3
这是正常现象吗?是软件还是硬件问题?
我怀疑它减慢了我的服务器速度,因为当我检查顶级进程时,没有哪个进程的 CPU 消耗过多,而且平均负载几乎总是高于 6。
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
899323 mysql 20 0 30.285g 4.844g 9304 S 1.7 15.6 86:07.46 mysqld
477 root 20 0 0 0 0 S 0.7 0.0 0:09.68 md0_raid1
3359 root 30 10 277464 33136 2712 S 0.7 0.1 12:37.91 python2.7
310858 mailnull 20 0 77356 7824 3856 D 0.7 0.0 0:00.03 exim
18 root 20 0 0 0 0 S 0.3 0.0 1:42.94 rcuos/0
407 root 0 -20 0 0 0 S 0.3 0.0 0:08.27 kworker/+
625 root 20 0 94284 53560 53372 S 0.3 0.2 1:32.82 systemd-+
3504 root 20 0 216748 27800 5324 S 0.3 0.1 1:10.35 httpd
309919 nobody 20 0 217164 25440 2680 S 0.3 0.1 0:00.04 httpd
现在,执行此 top 命令后,这是正常运行时间的结果
[root@server ~]# uptime
17:47:19 up 2 days, 1:32, 1 user, load average: 5.87, 6.23, 6.06
更新
以下是突袭检查的结果
[root@server ~]# cat /proc/mdstat
Personalities : [raid1]
md2 : active raid1 sda3[1] sdb3[0]
1073610752 blocks super 1.2 [2/2] [UU]
bitmap: 4/8 pages [16KB], 65536KB chunk
md3 : active raid1 sda4[1] sdb4[0]
1839090112 blocks super 1.2 [2/2] [UU]
bitmap: 11/14 pages [44KB], 65536KB chunk
md0 : active raid1 sda1[1] sdb1[0]
16760832 blocks super 1.2 [2/2] [UU]
md1 : active raid1 sda2[1] sdb2[0]
523712 blocks super 1.2 [2/2] [UU]
unused devices: <none>
我能做些什么来修复它吗?
答案1
这已关闭(至少在 CentOS 6 上,我手边没有 C7 盒,因为systemd
仍然会给我带来荨麻疹)到文件/etc/cron.d/raid-check
。这会安排每周一次的 RAID 清理。它不应该与 HDD 的实际使用相冲突,但即使是完全服从的算法,当系统 IO 在新的负载下大幅增加时,仍会有一些退避时间。
您可以通过编辑文件(或在 中禁用)来减少该作业的运行频率,甚至根本不运行该作业/etc/sysconfig/raid-check
。如果您认为您确实遇到了磁盘问题,那么在测试假设时最好将其禁用(但请确保您的备份是最新的,并且您已经测试了您的恢复!)。一旦您确定了发生了什么,最好重新启用它。我会每月至少运行一次。
答案2
经过进一步检查,我发现 sdb 磁盘有一些关于固件的警告
=== START OF INFORMATION SECTION ===
Model Family: Seagate Barracuda 7200.14 (AF)
Device Model: ST3000DM001-9YN166
Serial Number: W1F0M6VY
LU WWN Device Id: 5 000c50 0525256dd
Firmware Version: CC4B
User Capacity: 3,000,592,982,016 bytes [3.00 TB]
Sector Sizes: 512 bytes logical, 4096 bytes physical
Rotation Rate: 7200 rpm
Device is: In smartctl database [for details use: -P show]
ATA Version is: ATA8-ACS T13/1699-D revision 4
SATA Version is: SATA 3.0, 6.0 Gb/s (current: 6.0 Gb/s)
Local Time is: Sun Mar 26 19:49:32 2017 CEST
==> WARNING: A firmware update for this drive may be available,
see the following Seagate web pages:
http://knowledge.seagate.com/articles/en_US/FAQ/207931en
http://knowledge.seagate.com/articles/en_US/FAQ/223651en
之后,我使用 Munin 插件检查了两个磁盘的延迟,结果显示 sdb 的延迟比 sda 磁盘高得多。之后,我向托管服务提供商发送了邮件,他们免费更换了这个 baracuda 磁盘。因此,更换磁盘解决了我的问题,尽管两个磁盘在测试时看起来都很好,并且都通过了测试。