【问题标题】:PHP/MySQL: Can 12 CPU cores make app faster than 6 CPU cores although CPU usage always below 40%?PHP/MySQL:尽管 CPU 使用率始终低于 40%,但 12 个 CPU 内核能否使应用程序比 6 个 CPU 内核更快?
【发布时间】:2014-11-11 16:07:05
【问题描述】:

我们的问题是 MySQL 在我们减少 CPU 内核后延迟了我们的应用程序,尽管 CPU 使用率一直低于 40%。我的问题是:真的是 CPU 减少导致 MySQL 现在变慢了吗?还是我应该去别的地方?

更多详情:我的团队正在运行一个移动应用,最多有几千名用户同时在线。他们向后端发送高达 100 个请求/秒。我们使用 PHP/MySQL,有 12 个 CPU 内核和 8 GB RAM。 phpMyAdmin 工具显示 CPU 使用率为 15-25%,RAM 使用率为 1 GB。

然后我们将 CPU 核心数减少到 6 个。CPU 使用率最多上升到 40% 左右。然而,面对更高的负载(但没有比我们运行 12 核时更高的负载)MySQL 无法立即处理所有查询,并且查询排队延迟了我们的整个应用程序。当我们有 12 个内核时,这不会发生。

如有任何提示或提示,我将不胜感激。我们已经在对服务器(变量)配置进行全面审查。我们只使用 InnoDB 表。

非常感谢, 弗曼

【问题讨论】:

  • MySQL 主要依赖于它所拥有的硬盘和内存。你什么也没提到。此外,还有一个名为innodb_buffer_pool_size 的神奇变量。它的默认值为 8MB。您希望该变量非常高,达到 RAM 的 80-90%。
  • @Martin Barker 我知道查询正在使用“SHOW PROCESSLIST”排列。昨天,在高峰时段,许多查询要等待 2-20 秒才能处理。我对并发连接没有限制(设置为 0)。整个程序在 Apache 2.2.22、MySQL 5.5.37 和 PHP 5.4.30 上运行。
  • 如有疑问 - 最好检查每件事的作用。 innodb_buffer_pool_size 是一个数字,表示 MySQL 允许为任何目的分配多少 RAM。通常,MySQL 将工作数据集保存在那里。这意味着它将从 RAM 而不是 HDD 中提取数据。使用 128MB,您无能为力。您希望您的 整个 数据集适合 RAM。处理数据不是问题,问题在于 CPU 足够快地获取数据。将其从 HDD 传输到 CPU 很慢 :)
  • 至于日志文件,Percona guys 解释得非常好,所以我觉得没什么好说的。
  • @FMan - 不客气,是的 - 他们有关于调优和其他各种东西的优秀文章。另外,既然我们已经在这里了,那么您可能会考虑另一件事,它可能会像这样解决您的问题 - a drop-in ACID compliant engine for MySQL with excellent performance and compression rate。至于关于使用 MyISAM 的评论——如果你能够充分利用 InnoDB 的潜力,它确实不会比 InnoDB 快。你应该或多或少不需要 MyISAM。

标签: php mysql database performance innodb


【解决方案1】:

在我看来,您的 MySQL 可能已达到其 I/O 限制。我们在我们的数据库服务器上进行了压力测试,对于理解数据库阻塞点至关重要的是,当您添加或更改记录时,您必须进行磁盘写入(SELECT 可以被缓存)。因此,当我们刚刚阅读我们的网站时,它处理了相当大的负载,但是当我们模拟结帐(创建了多条记录)时,它很快就陷入了困境。

那时,我们没有任何选择。与磁性相比,SSD 太贵了(而且我们的扼流圈数量远远超出了我们真正遇到的任何东西)。我们能做的最好的事情是 RAID 10。但是,多亏了云,您现在可以轻松(而且便宜)拥有一个相当强大的数据库服务器,可以更好地处理 I/O 负载(尤其是在 SSD 价格迅速下降的情况下)。您会注意到,亚马逊甚至在 Provisioned IOPS feature 上销售他们的中间实例

对于任何需要快速且一致的 I/O 性能的生产应用程序,我们建议使用预置 IOPS(每秒输入/输出操作数)存储。预置 IOPS 存储是一种可提供快速、可预测且一致的吞吐量性能的存储类型。创建数据库实例时,您需要指定 IOPS 速率和存储空间分配。 Amazon RDS 在数据库实例的生命周期内或直到您更改它之前预置 IOPS 速率和存储。预置 IOPS 存储针对具有一致性能要求的 I/O 密集型在线事务处理 (OLTP) 工作负载进行了优化。

听起来很像您可能有一个简单的设置(甚至可能将您的数据库托管在同一台服务器上)。 AWS 不是城里唯一的游戏,但您可能想要考虑迁移到某种云,或者至少升级到可以处理您对服务器提出的更高 I/O 要求的东西。忘记核心数。如果您的 HDD 卡住了,您可能会运行 72 个内核并且没有任何区别。

另一个提示:查看MySQL Tuner。当您运行它时,它会检查您的数据库统计信息(运行时间越长越好),并且可以推荐许多有助于提高性能的调整。

【讨论】:

    猜你喜欢
    • 2012-04-26
    • 2018-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多