硬件调查

硬件调查

我在两台专用服务器上有一个 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

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

答案1

我的回答分为两部分:调查块设备驱动程序;以及值得根据您的用例进行优化的内容。但我删除了最后一部分,因为据报道它可能会导致数据丢失。看评论。

硬件调查

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

对于性能,我经常参考Linux 性能图由 Brendan Gregg 在他的博客上提供。人们可以看到,对于低级别(最接近硬件)来说,这样的工具blktrace将是完美的。

不太了解这个工具,我四处搜索发现了这个关于 blktrace 的有趣文章作者:马克·布鲁克。基本上它建议如下:使用blktrace;执行 I/O 跟踪使用BTTT从此跟踪中提取信息的工具。这将是这样的(对于 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 秒!

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

答案2

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

相关内容