在 Solaris 上使用 ZFS 和 MySQL 实现高负载、低 CPU 使用率和低 IO 使用率

在 Solaris 上使用 ZFS 和 MySQL 实现高负载、低 CPU 使用率和低 IO 使用率

我有一个运行 MySQL 5.5 的 Solaris 10 x86_64 系统。在使用高峰期,我们从数据库获得的响应非常慢:慢查询运行了几分钟,而通常只需不到一秒的时间即可返回。CPU 利用率在 60-70% 的范围内。平均负载经常达到 20 多秒,偶尔达到 40 多秒,我见过它达到 50 多秒。(两个启用了超线程的四核 CPU。)它的行为就像 I/O 问题,好像它在等待磁盘写入,但我没有看到任何迹象表明存在任何实际的 I/O 问题。平均磁盘等待时间始终为 0,平均等待队列在 0.2-0.3 范围内,磁盘繁忙百分比偶尔会爬升到 15% 的区域。(所有这些都是根据 sar 得出的。)

存储是两个 SAS 驱动器的 5 个 zdev 镜像的 zfs zpool。我没有意图日志设备,但我认为这不是此工作负载的问题。

我错过了什么?

答案1

想给你一个更像 Solaris 的答案:

在多处理器/多核机器上,您实际上无法使用太多 CPU 负载。如果您想查看某个核心是否偶尔会达到满负荷状态,请首先使用mpstat而不是prstat/。top

如果mpstat有 8 行输出,则表示您有 8 个 CPU 核心,那么您看到的任何消耗prstat超过 12.5% CPU 资源(100/8)的进程都可能是 CPU 密集型的。要测试这是否属实,您可以使用它prstat -L -p <pid>来查看该进程的任何单个线程是否达到 12.5%,因为这样您就能确定该进程是 CPU 密集型的。您的机器上有相当多的可用 CPU 核心,但您应该始终记住,任何单个处理线程只能在一个 CPU 核心上工作。为了让 MySQL 利用您的机器,问题在于将工作划分到多个线程上有多好。如果 MySQL 中只有一个热线程,那么您强大的机器也帮不上什么忙。

此外,你会发现很多人建议在 Linux/Solaris 服务器工作负载上关闭英特尔超线程,因为没有它,它实际上性能会更好。YMMM。据我所知,英特尔超线程非常适合桌面类型的工作负载,但对于只应该做一件事并且做得很快的服务器来说,它可能会对性能产生不利影响。

从这里出发您可以选择至少十几条路线,因此在您了解更多事实之前,很难给您建议。

答案2

您提到平均负载通常为 20 多秒,有时为 40 多秒或 50 多秒。然后您提到您有 16 个可用处理器 ((2cpus x 4 cores) x 2),因此平均负载为 20 多秒意味着您的进程正在争夺 CPU 时间,而平均负载为 40 多秒或 50 多秒时您需要等待很长时间。

CPU 利用率和 CPU 负载不能很好地映射在一起,但除非线程不正确,否则我希望看到更高的利用率。

还有一篇文章使用桥上的流量场景很好地解释了平均负载:

了解 Linux CPU 负载

简而言之 - 在完美的世界中,您的平均负载永远不会高于您的处理器数量(在您的情况下为 16 个)。

我认为这很可能是系统负担过重,而不是 ZFS 或 MySQL 问题。

** 编辑,我看到有一条评论说您看到 CPU 利用率达到 100%。这也符合进程只是在等待 CPU 时间的情况。

相关内容