高IO等待-如何确定根本原因?


10

我在两个专用服务器上有一个MySQL实例。一个用于生产,另一个用于测试平台。

这两个服务器几乎相同,唯一的区别是RAID控制器和虚拟卷(HD相同)。在生产环境中,有专用的硬件RAID控制器和RAID 10卷。另一方面,RAID控制器似乎是软件(Lenovo ThinkServer RAID 110i),并且卷是RAID 5。

我们注意到在MySQL提交期间,我们的iowait很高:

while true; do date; ps auxf | awk '{if($8=="D") print $0;}'; sleep 1; done
root     26661  0.0  0.0      0     0 ?        D    Jun09   5:41  \_ [jbd2/dm-14-8]
root     26691  0.0  0.0      0     0 ?        D    Jun09   0:57  \_ [jbd2/dm-10-8]
Thu Jun 18 13:49:37 CEST 2015
root     26691  0.0  0.0      0     0 ?        D    Jun09   0:57  \_ [jbd2/dm-10-8]
Thu Jun 18 13:49:38 CEST 2015
root      1474  0.0  0.0      0     0 ?        D    Jun04   0:23  \_ [jbd2/dm-5-8]
root     26691  0.0  0.0      0     0 ?        D    Jun09   0:57  \_ [jbd2/dm-10-8]
Thu Jun 18 13:49:39 CEST 2015
Thu Jun 18 13:49:40 CEST 2015
root      1474  0.0  0.0      0     0 ?        D    Jun04   0:23  \_ [jbd2/dm-5-8]
root      1478  0.0  0.0      0     0 ?        D    Jun04   0:03  \_ [jbd2/dm-7-8]
root     26661  0.0  0.0      0     0 ?        D    Jun09   5:41  \_ [jbd2/dm-14-8]

dm-10-8和dm-14-8与数据库分区有关。

procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  3 240904 809656 572624 7114416    0    0    59  1681 2002 5141  3  1 67 30  0
 0  4 240880 809656 572632 7114604    0    0   139  2069 2090 4985  3  1 67 29  0
 1  2 240880 809284 572636 7114676    0    0    27  2159 2253 4247  2  1 72 25  0
 5  2 240880 809408 572656 7114820    0    0    27  2404 2254 5350  3  1 69 27  0

我怀疑袭击控制者,如何确定?


也许不合时宜:但是为什么要在数据库上使用RAID5?由于写入间隙,这是个坏主意。带有BBU的硬件在某种程度上缓解了这种情况,但是RAID 5基本上适合读取,而不适合写入小事务。
Hennes

因为我别无选择...此RAID控制器(与我的RHEL版本)不支持RAID 10 ...
Bob Sauvage 2015年

@BobSauvage有什么进展吗?
惠更斯2015年

只是要清楚一点:io-wait是否也包括大容量存储未提供的文件描述符?像套接字...
Massimo

Answers:


7

我的回答分为两部分:调查块设备驱动程序;和优化值得您看一下用例。但是我删除了最后一部分,因为有报道称这会导致数据丢失。看评论。

硬件调查

我了解到,对于同一应用程序,但在2套不同的硬件上,性能却大不相同,您想了解为什么。因此,我首先提出一种方法来帮助您找到“为什么”的答案。

对于性能,我经常参考Brendan Gregg在他的博客中提供的Linux Performance Map。可以看到,对于最低级别(最接近硬件)的工具,blktrace将是完美的。

我不太了解这个工具,我四处搜寻并发现了这篇有关 Marc Brooker的blktrace有趣文章。基本上,它提出以下建议:使用blktrace; 执行I / O跟踪。使用btt工具从此跟踪中提取信息。大概是这样(跟踪30秒):

# blktrace -w 30 -d /dev/dm-10-8 -o dm-10-8
# blkparse -d blkmerged.out dm-10-8*
# btt -i blkmerged.out | less

输出可能会很长,但要查找D2C条目。它将使您了解传送到设备驱动程序的I / O被报告为已由该驱动程序完成所花费的时间。

输出示例(dnf upgrade在繁忙的笔记本电脑上的VirtualBox VM上运行):

            ALL           MIN           AVG           MAX           N
--------------- ------------- ------------- ------------- -----------

...
D2C               0.000046515   0.045781696   3.940577359       11713
...

它显示每个I / O令人失望的平均时间为45毫秒,最坏情况下最长为3,94 s !!

有关使用blktrace进行此调查的更多方法,请阅读Marc Brooker的文章,这很有启发性。


答案调整中为提高innodb性能而引用的Percona博客文章已更新为:更新:请勿执行此操作,事实证明这会损坏数据!
vkats

@vkats非常感谢。我已经更新了答案,以删除建议和文章。
惠更斯(Huygens)'18

1

jbd2进程用于ext4日志记录。在mysql提交期间文件系统需要写入日志是合乎逻辑的,这不应该引起任何担心。由jbd引起的负载量受dm-10-8和dm-14-8分区的安装参数影响。最好在数据库分区上保留非常保守的日志记录,以确保在发生某些情况并且服务器意外重启时不会损坏数据库。您可以在测试环境中选择另一个日志记录装入选项,以进行比较。


我的jbd2 / dm-2-8在iotop上似乎一直都在8.5%左右,但是..我不认为这是有问题的,因为没有磁盘读取,并且1小时后总磁盘写入为35mb。顺便说一句,在/ dev处最多有dm-2(即-8,我不知道它是从哪里来的..)
Aquarius Power
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.