5

我在 AWS 上有一个 MySQL m2.2xlarge 实例。MySQL 数据目录位于根 EBS / 中。它是单个 EBS 而不是 RAID。我们有三个主要的表。其中一个Table C,最大的内容,仅用于最后几天的数据。这些表中的插入率约为每天 80.000 行。这 3 个表有大约 4200 万行。innodb_buffer_pool_size 有大约 30GB 的实例 RAM。

Table A最重要的是,它的数据长度为~33GB,索引~11GB Table B,数据长度为~8GB,索引~5GB

在我们的网站中,两个主要查询(延迟方面)是这样的:

SELECT * FROM TableA WHERE id in (.....)

SELECT * FROM TableB JOIN .... WHERE id in (.....)

在大多数页面中,(...)将是大约 50 个最近的 id,这些查询每个花费的时间 < 50 毫秒。但是在其他一些页面中,我们遇到了较旧的 id,这些查询的延迟飙升至 500 毫秒、800 毫秒,最多 1.5 秒。

我做了一个测试,在 Mysql 重新启动后,我做了一个SELECT id FROM TableB强制索引到缓存/内存中。Table B查询仍然很慢。然后我做了一个SELECT * FROM TableB。现在有了缓存/内存中的整个表,查询变得非常快(<50ms)。

我的问题:> 500 毫秒,> 1000 毫秒对于仅通过 PRIMARY KEY 检索行的查询来说是合理的延迟?即使在 42M 的表中?即使所有行都在磁盘中?对我来说似乎太多了。

将 MySQL 数据移动到临时存储 (/mnt) 会改善这一点吗?使用预置 IOPS 会有所帮助吗?

4

2 回答 2

8

免责声明:我根本不是 (My)SQL 性能方面的专家,只是评论您的用例的 AWS 方面。

有了这个,首先有几个问题需要解决:

将 MySQL 数据移动到临时存储 (/mnt) 会改善这一点吗?

我已经为相同的问题提供了答案将数据从 EBS 移动到临时存储会提高 MySQL 查询性能吗?,请查看一些重要细节 - TL;DR:如果您有任何持久性需求(除非您确切知道自己在做什么),并且通过声称的临时存储获得性能提升,您绝对不想这样做从今天的角度来看,即使不是完全错误的,过去也充其量是可疑的。

使用预置 IOPS 会有所帮助吗?

当然,预置 IOPS 卷是专门为满足 I/O 密集型工作负载的需求而设计的,尤其是数据库工作负载,这些工作负载对存储性能和随机访问 I/O 吞吐量的一致性很敏感,请参阅文章Fast Forward-Provisioned IOPS for EBS一般介绍卷

  • 请注意,这些理想情况下(但不一定)与EBS-Optimized Instances齐头并进,后者使用优化的配置堆栈并为 EBS I/O 提供额外的专用容量。此优化通过最大程度地减少 EBS I/O 与来自您的 Amazon EC2 实例的其他流量之间的争用,为您的 EBS 卷提供最佳性能。

  • 具体来说,您需要阅读专门的部分提高 EBS 性能,其中介绍了如何查看所需的 I/O 性能以及提高 EBS 性能以满足这些要求的选项RAID 和/或预置 IOPS,具体取决于您的使用案子。

我的问题:> 500 毫秒,> 1000 毫秒对于仅通过 PRIMARY KEY 检索行的查询来说是合理的延迟?即使在 42M 的表中?即使所有行都在磁盘中?对我来说似乎太多了。

如前所述,我无法判断这些值,但是,鉴于您的规范,您似乎存在内存争用,就 m2.2xlarge 实例具有“仅”34.2 GiB 的内存而言,您已经分配了 ~30GB innodb_buffer_pool_size- 这似乎考虑到操作系统和/或 MySQL 的其他内存要求,对我来说有点高,所以可能已经涉及到交换,这将完美地解释您正在经历的缓存/内存变暖行为。

  • 作为对数据库工作负载的一般建议,到目前为止,它似乎是迄今为止最大的收益,只需确保您的数据集完全适合 RAM,这比以往任何时候都更容易使用过多的实例类型(如果在第一次完全可行的话地方)。

最后,我建议阅读有关在 AWS EC2 上提高 PostgreSQL 性能的最新文章——那里的建议主要也针对 AWS 方面的问题,并且相应地也适用于 MySQL;持久数据库部分几乎总结了我上面的建议:

对于您关心数据的持久数据库,您想要的不是高 I/O 实例而是EBS 优化实例,它保证了 EBS 存储服务器的网络带宽。使用具有预置 IOP的 EBS 卷,并为获得最佳结果,将一组 EBS 卷条带化到 RAID10 阵列中。请参阅提高 EBS 性能

于 2013-02-13T19:01:34.467 回答
0

如果您的 IN 语句包含 SQL 子查询,则 EC2 实例可能会非常慢,因为默认情况下它使用 MySQL 5.5(有关详细信息,请查看MySQL 在 EC2 上非常慢

于 2013-06-22T21:12:21.707 回答