Chr*_*ris 5 linux cache iowait
我很清楚这个站点上已经多次讨论过 I/O 等待,但所有其他主题似乎都涵盖了恒定的I/O 延迟,而我们需要在我们的服务器上解决的 I/O 问题发生在不规则的(短) 间隔,但始终存在高达 20k ms 的等待时间和 2 秒的服务时间的大量尖峰。受影响的磁盘是 /dev/sdb(希捷 Barracuda,详情见下文)。
典型的 iostat -x 输出有时看起来像这样,这是一个极端示例,但绝非罕见:
iostat (Oct 6, 2013)
tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
16.00 0.00 156.00 9.75 21.89 288.12 36.00 57.60
5.50 0.00 44.00 8.00 48.79 2194.18 181.82 100.00
2.00 0.00 16.00 8.00 46.49 3397.00 500.00 100.00
4.50 0.00 40.00 8.89 43.73 5581.78 222.22 100.00
14.50 0.00 148.00 10.21 13.76 5909.24 68.97 100.00
1.50 0.00 12.00 8.00 8.57 7150.67 666.67 100.00
0.50 0.00 4.00 8.00 6.31 10168.00 2000.00 100.00
2.00 0.00 16.00 8.00 5.27 11001.00 500.00 100.00
0.50 0.00 4.00 8.00 2.96 17080.00 2000.00 100.00
34.00 0.00 1324.00 9.88 1.32 137.84 4.45 59.60
0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
22.00 44.00 204.00 11.27 0.01 0.27 0.27 0.60
Run Code Online (Sandbox Code Playgroud)
让我为您提供有关硬件的更多信息。这是一个 Dell 1950 III 机器,使用 Debian 作为操作系统,其中 uname -a 报告以下内容:
Linux xx 2.6.32-5-amd64 #1 SMP Fri Feb 15 15:39:52 UTC 2013 x86_64 GNU/Linux
Run Code Online (Sandbox Code Playgroud)
该机器是托管在线游戏的专用服务器,无需运行任何数据库或 I/O 繁重的应用程序。核心应用程序消耗大约 8 GBytes RAM 的 0.8,并且平均 CPU 负载相对较低。然而,游戏本身对 I/O 延迟的反应相当敏感,因此我们的玩家会遇到严重的游戏延迟,我们希望尽快解决这个问题。
iostat:
avg-cpu: %user %nice %system %iowait %steal %idle
1.77 0.01 1.05 1.59 0.00 95.58
Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
sdb 13.16 25.42 135.12 504701011 2682640656
sda 1.52 0.74 20.63 14644533 409684488
Run Code Online (Sandbox Code Playgroud)
正常运行时间是:
19:26:26 up 229 days, 17:26, 4 users, load average: 0.36, 0.37, 0.32
Run Code Online (Sandbox Code Playgroud)
硬盘控制器:
01:00.0 RAID bus controller: LSI Logic / Symbios Logic MegaRAID SAS 1078 (rev 04)
Run Code Online (Sandbox Code Playgroud)
硬盘:
Array 1, RAID-1, 2x Seagate Cheetah 15K.5 73 GB SAS
Array 2, RAID-1, 2x Seagate ST3500620SS Barracuda ES.2 500GB 16MB 7200RPM SAS
Run Code Online (Sandbox Code Playgroud)
来自df的分区信息:
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sdb1 480191156 30715200 425083668 7% /home
/dev/sda2 7692908 437436 6864692 6% /
/dev/sda5 15377820 1398916 13197748 10% /usr
/dev/sda6 39159724 19158340 18012140 52% /var
Run Code Online (Sandbox Code Playgroud)
使用 iostat -dx sdb 1 生成的更多数据样本(2013 年 10 月 11 日)
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util
sdb 0.00 15.00 0.00 70.00 0.00 656.00 9.37 4.50 1.83 4.80 33.60
sdb 0.00 0.00 0.00 2.00 0.00 16.00 8.00 12.00 836.00 500.00 100.00
sdb 0.00 0.00 0.00 3.00 0.00 32.00 10.67 9.96 1990.67 333.33 100.00
sdb 0.00 0.00 0.00 4.00 0.00 40.00 10.00 6.96 3075.00 250.00 100.00
sdb 0.00 0.00 0.00 0.00 0.00 0.00 0.00 4.00 0.00 0.00 100.00
sdb 0.00 0.00 0.00 2.00 0.00 16.00 8.00 2.62 4648.00 500.00 100.00
sdb 0.00 0.00 0.00 0.00 0.00 0.00 0.00 2.00 0.00 0.00 100.00
sdb 0.00 0.00 0.00 1.00 0.00 16.00 16.00 1.69 7024.00 1000.00 100.00
sdb 0.00 74.00 0.00 124.00 0.00 1584.00 12.77 1.09 67.94 6.94 86.00
Run Code Online (Sandbox Code Playgroud)
可以在此处找到使用 rrdtool 生成的特征图表:
iostat 图 1,24 分钟间隔:http : //imageshack.us/photo/my-images/600/yqm3.png/
iostat 图 2,120 分钟间隔:http : //imageshack.us/photo/my-images/407/griw.png/
由于我们有一个 5.5 GB 的相当大的缓存,我们认为测试 I/O 等待峰值是否可能是由缓存未命中事件引起的可能是一个好主意。因此,我们进行了同步,然后刷新缓存和缓冲区:
echo 3 > /proc/sys/vm/drop_caches
Run Code Online (Sandbox Code Playgroud)
紧接着,I/O 等待和服务时间几乎直线上升,机器上的一切都感觉像是慢动作。在接下来的几个小时里,延迟恢复了,一切都和以前一样——在短的、不可预测的间隔中出现小到中等的延迟。
现在我的问题是:有人知道是什么导致了这种烦人的行为吗?它是磁盘阵列或raid控制器死亡的第一个迹象,还是可以通过重新启动轻松修复的东西?(但是,目前我们非常不愿意这样做,因为我们担心磁盘可能不会再次恢复。)
任何帮助是极大的赞赏。
提前致谢,克里斯。
编辑添加:我们确实看到一两个进程在顶部进入“D”状态,其中一个似乎是 kjournald 相当频繁。但是,如果我没有记错的话,这并不表示导致延迟的进程,而是表示受延迟影响的进程- 如果我错了,请纠正我。有关不间断睡眠过程的信息是否以任何方式帮助我们解决问题?
@Andy Shinn 请求了 smartctl 数据,这里是:
smartctl -a -d megaraid,2 /dev/sdb 产量:
smartctl 5.40 2010-07-12 r3124 [x86_64-unknown-linux-gnu] (local build)
Copyright (C) 2002-10 by Bruce Allen, http://smartmontools.sourceforge.net
Device: SEAGATE ST3500620SS Version: MS05
Serial number:
Device type: disk
Transport protocol: SAS
Local Time is: Mon Oct 14 20:37:13 2013 CEST
Device supports SMART and is Enabled
Temperature Warning Disabled or Not Supported
SMART Health Status: OK
Current Drive Temperature: 20 C
Drive Trip Temperature: 68 C
Elements in grown defect list: 0
Vendor (Seagate) cache information
Blocks sent to initiator = 1236631092
Blocks received from initiator = 1097862364
Blocks read from cache and sent to initiator = 1383620256
Number of read and write commands whose size <= segment size = 531295338
Number of read and write commands whose size > segment size = 51986460
Vendor (Seagate/Hitachi) factory information
number of hours powered up = 36556.93
number of minutes until next internal SMART test = 32
Error counter log:
Errors Corrected by Total Correction Gigabytes Total
ECC rereads/ errors algorithm processed uncorrected
fast | delayed rewrites corrected invocations [10^9 bytes] errors
read: 509271032 47 0 509271079 509271079 20981.423 0
write: 0 0 0 0 0 5022.039 0
verify: 1870931090 196 0 1870931286 1870931286 100558.708 0
Non-medium error count: 0
SMART Self-test log
Num Test Status segment LifeTime LBA_first_err [SK ASC ASQ]
Description number (hours)
# 1 Background short Completed 16 36538 - [- - -]
# 2 Background short Completed 16 36514 - [- - -]
# 3 Background short Completed 16 36490 - [- - -]
# 4 Background short Completed 16 36466 - [- - -]
# 5 Background short Completed 16 36442 - [- - -]
# 6 Background long Completed 16 36420 - [- - -]
# 7 Background short Completed 16 36394 - [- - -]
# 8 Background short Completed 16 36370 - [- - -]
# 9 Background long Completed 16 36364 - [- - -]
#10 Background short Completed 16 36361 - [- - -]
#11 Background long Completed 16 2 - [- - -]
#12 Background short Completed 16 0 - [- - -]
Long (extended) Self Test duration: 6798 seconds [113.3 minutes]
Run Code Online (Sandbox Code Playgroud)
smartctl -a -d megaraid,3 /dev/sdb 产量:
smartctl 5.40 2010-07-12 r3124 [x86_64-unknown-linux-gnu] (local build)
Copyright (C) 2002-10 by Bruce Allen, http://smartmontools.sourceforge.net
Device: SEAGATE ST3500620SS Version: MS05
Serial number:
Device type: disk
Transport protocol: SAS
Local Time is: Mon Oct 14 20:37:26 2013 CEST
Device supports SMART and is Enabled
Temperature Warning Disabled or Not Supported
SMART Health Status: OK
Current Drive Temperature: 19 C
Drive Trip Temperature: 68 C
Elements in grown defect list: 0
Vendor (Seagate) cache information
Blocks sent to initiator = 288745640
Blocks received from initiator = 1097848399
Blocks read from cache and sent to initiator = 1304149705
Number of read and write commands whose size <= segment size = 527414694
Number of read and write commands whose size > segment size = 51986460
Vendor (Seagate/Hitachi) factory information
number of hours powered up = 36596.83
number of minutes until next internal SMART test = 28
Error counter log:
Errors Corrected by Total Correction Gigabytes Total
ECC rereads/ errors algorithm processed uncorrected
fast | delayed rewrites corrected invocations [10^9 bytes] errors
read: 610862490 44 0 610862534 610862534 20470.133 0
write: 0 0 0 0 0 5022.480 0
verify: 2861227413 203 0 2861227616 2861227616 100872.443 0
Non-medium error count: 1
SMART Self-test log
Num Test Status segment LifeTime LBA_first_err [SK ASC ASQ]
Description number (hours)
# 1 Background short Completed 16 36580 - [- - -]
# 2 Background short Completed 16 36556 - [- - -]
# 3 Background short Completed 16 36532 - [- - -]
# 4 Background short Completed 16 36508 - [- - -]
# 5 Background short Completed 16 36484 - [- - -]
# 6 Background long Completed 16 36462 - [- - -]
# 7 Background short Completed 16 36436 - [- - -]
# 8 Background short Completed 16 36412 - [- - -]
# 9 Background long Completed 16 36404 - [- - -]
#10 Background short Completed 16 36401 - [- - -]
#11 Background long Completed 16 2 - [- - -]
#12 Background short Completed 16 0 - [- - -]
Long (extended) Self Test duration: 6798 seconds [113.3 minutes]
Run Code Online (Sandbox Code Playgroud)
(例如,我假设您的磁盘直接连接到服务器,而不是通过 NFS。)
重要的是您的svctm(iostat输出)非常高,这表明 RAID 或磁盘存在硬件问题。普通磁盘的Svctm应在 4 (ms) 左右。可以少一点,但也不能高太多。
不幸的是,smartctl在您的情况下,输出并不能提供信息。它已纠正错误,但这可能是正常的。漫长的测试似乎完成了,但又没有结论。ST3500620SS 似乎是很好的旧服务器/raid 类型磁盘,它应该对读取错误快速响应(与桌面/非raid 磁盘不同),因此这可能是比坏扇区更复杂的硬件问题。尝试在 RAID 统计数据中查找异常情况(例如高错误率):http://hwraid.le-vert.net/wiki/LSIMegaRAIDSAS
我的建议是下一步应该更换磁盘。
更新:
svctm是更重要的因素,因为高util%只是svctm异常高的结果。
当桌面磁盘安装到Promise RAID 中时,我看到了类似的问题。台式机磁盘旨在通过多次长时间重试来尝试修复读取错误,这会导致延迟(这些读取错误可能是由于其他一些因素造成的,例如振动,服务器机房中的振动比台式机中的振动要强得多)。与此不同的是,设计用于 RAID 的磁盘只是快速向 RAID 控制器报告任何错误,后者可以通过 RAID 冗余来纠正错误。此外,服务器磁盘可以设计得具有更强的机械抵抗能力,可以抵抗持续的强烈振动。人们普遍认为服务器磁盘与台式机磁盘相同只是更贵,这是错误的,它们实际上是不同的。
问:啊,我想问的是:如果是硬件问题,您不认为问题应该持续可见并且在一段时间内不会消失吗?你对这种效应有什么解释吗?
A: