带有ZFS和MySQL的Solaris上的CPU负载较低,IO使用率较低时的高负载

我有一个运行MySQL 5.5的Solaris 10 x86_64系统。 在使用时间过长的情况下,数据库的响应速度非常缓慢:查询运行速度缓慢,通常在亚秒级时间内返回。 CPU利用率在60-70%的范围内。 平均负荷平均达到20多岁,很less到40多岁,我已经看到了50多岁。 (启用了HyperThreading的两个四核CPU)它就像I / O问题一样,就好像在磁盘上等待写入一样,但是我没有看到任何实际的I / O问题。 平均磁盘等待时间始终为0,平均等待队列在0.2-0.3范围内,磁盘繁忙百分比偶尔会爬入15%区域。 (所有这一切按照萨尔。)

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

我错过了什么?

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

在多处理器/多核盒子上,你不能真正使用CPU负载。 最初使用mpstat而不是prstat / top如果你想看看你的一个内核是否偶尔会被充分利用。

如果mpstat具有8行输出,则表示您有8个CPU内核,然后在prstat看到占用12.5%以上CPU资源(100/8)的任何进程都可能受CPU限制。 要testing这是否真的如此,您可以使用prstat -L -p <pid>来查看该进程的任何单个线程是否达到12.5%,因为那么您肯定知道该进程是CPU绑定的。 你的盒子上有很多可用的CPU核心,但你应该永远记住任何一个处理线程只能在一个CPU核心上运行。 为了让MySQL利用你的盒子,把它分成多个线程是一件好事。 如果在MySQL中有一个热门的线程,那么你的强大的机器没有什么帮助。

另外还有不less人会build议在Linux / Solaris服务器工作负载上closures英特尔®超线程技术,因为如果没有它,它的性能会更好。 YMMM。 根据我的理解,英特尔®超线程技术非常适合桌面型工作负载,但对于只能做一件事情的服务器来说,这样做可能会损害性能。

至less有十几条路线可以从这里出发,所以在你有更多的事实之前就有点难以提醒你。

你提到的平均载荷是20多岁,有时甚至是40多岁或50多岁。 然后你提到你有16个可用的处理器((2CPUS×4核心)×2),所以20年代的平均负载意味着你的进程争取CPU时间,在40或50年代你有大量的等待。

CPU利用率和CPU负载并没有很好地映射在一起,但是我希望看到更高的利用率,除非事情没有正确的线程。

还有另外一篇文章用桥上的交通情况来解释平均负载:

了解Linux CPU负载

简而言之 – 在一个完美的世界里,你的平均负载永远不会超过你的处理器数量(在你的情况下是16)。

我最有可能的系统只是负担过重,而不是ZFS或MySQL的问题。

**编辑,我看到有一个评论补充说,你看到一些100%的CPU利用率。 这也符合等待CPU时间的进程。