MySQL 高写入延迟

标签 mysql amazon-rds

我正在开发一个目前使用 AWS 服务部署的类社交应用程序。特别是,数据库使用 MYSQL 在 RDS 上运行。 到目前为止,我们正在使用有限数量的用户(主要是 friend )测试该应用,平均写入 IOPS 为 15 每秒。

真正的问题与数据库的写入延迟非常高有关,它总是在 100 毫秒以上。 RDS 实例是一个 db.m3.xlarge,这比我们需要的要多得多。

我尝试在单独的实例(DB 和 EC2 的相同配置)中执行负载测试,但我无法重现如此高的延迟,即使我发送了更多的请求也是如此。所以我认为这可能是由于表碎片造成的,但我还没有运行表优化,因为在此过程中无法访问数据库。

你有没有遇到过这个问题?

更多信息

  • 我们使用 mysql 5.6.21 版,并将 INNODB 作为存储引擎。
  • 整个数据库的大小约为 100MB
  • 最大的表(称为 Message)有大约 790k 行。关于这个表,下面的查询

    insert into Message (user_id, creationDate, talk_id, text, id) 
    values (2015, '2015-02-01 16:40:06.737', 18312, 'Some text ', 904870)
    

    执行时间为 11 秒。

  • 更糟糕的是,查询

    insert into Comment (anonymous, user_id, creationDate, deleted, post_id, text, id) 
    values (1, 107347, '2015-02-01 16:40:01.849', 0, 124888, 'Comment text', 265742)
    

    用了14s,但是表Comment有160k左右。

这两个表是由:

CREATE TABLE `comment` (
    `id` bigint(20) NOT NULL,
    `anonymous` bit(1) NOT NULL,
    `creationDate` datetime NOT NULL,
    `deleted` bit(1) NOT NULL,
    `text` varchar(1000) COLLATE utf8mb4_unicode_ci NOT NULL,
    `user_id` bigint(20) NOT NULL,
    `post_id` bigint(20) NOT NULL,
    PRIMARY KEY (`id`),
    KEY `FK_jhvt6d9ap8gxv67ftrmshdfhj` (`user_id`),
    KEY `FK_apirq8ka64iidc18f3k6x5tc5` (`post_id`),
    CONSTRAINT `FK_apirq8ka64iidc18f3k6x5tc5` FOREIGN KEY (`post_id`) REFERENCES `post` (`id`),
    CONSTRAINT `FK_jhvt6d9ap8gxv67ftrmshdfhj` FOREIGN KEY (`user_id`) REFERENCES `kuser` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE `message` (
    `id` bigint(20) NOT NULL,
    `creationDate` datetime NOT NULL,
    `text` varchar(1000) COLLATE utf8mb4_unicode_ci NOT NULL,
    `user_id` bigint(20) NOT NULL,
    `talk_id` bigint(20) NOT NULL,
    PRIMARY KEY (`id`),
    KEY `FK_d0j091jvk2y4mmfbadnqlohtf` (`user_id`),
    KEY `FK_64tr15t6wu5y9u143gxt6o3g2` (`thread_id `),
    CONSTRAINT `FK_64tr15t6wu5y9u143gxt6o3g2` FOREIGN KEY (`thread_id`) REFERENCES `thread` (`id`),
    CONSTRAINT `FK_d0j091jvk2y4mmfbadnqlohtf` FOREIGN KEY (`user_id`) REFERENCES `kuser` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

一些情节

使用 AppDynamics我已经能够提取以下图:

  • 等待状态:查询结束时间是不是太大了?

    SQL Wait states

  • 页面缓冲区:

    Page Buffer

  • 写入延迟和队列:

    RDS Stats

查询缓存

+------------------------------+-----------+
| Variable_name                | Value     |
+------------------------------+-----------+
| query_cache_limit            | 1048576   |
| query_cache_min_res_unit     | 4096      |
| query_cache_size             | 1048576   |
| query_cache_type             | OFF       |
| query_cache_wlock_invalidate | OFF       |
+------------------------------+-----------+

感谢您的帮助!

安德里亚

最佳答案

我联系了亚马逊的 RDS 工程师,他们给了我解决方案。 如此高的延迟是由于性能非常低的存储类型。事实上,我使用的是默认的 5GB SSD(他们称之为 GP2),它为每 GB 存储提供 3 IOPS,当我的应用程序需要大约 50 IOPS 甚至更多时,结果为 15 IOPS。

因此,他们建议我将存储类型更改为 Magnetic,它提供 100 IOPS 作为基准。此外,我还能够减少实例类型,因为瓶颈只是磁盘。

由于源磁盘 (GP2) 的性能非常低,迁移大约需要 3 小时。

希望它可以帮助那里的人!

关于MySQL 高写入延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28436858/

相关文章:

mysql - AWS Data Pipeline 将 CSV 从 S3 复制到 RDS MySQL

mysql - 对来自不同表的 AGGREGATE SUM 执行 LEFT JOIN

java - 如何使用 Java Hibernate 向联接表添加额外信息?

mysql - Amazon RDS (MySQL) -> 本地开发/测试服务器主-主或主-从+示例?

javascript - 从桌面应用程序连接到 AWS MySQL 数据库

mysql - 如何强制终止任何正在运行的 mysql 查询?

mysql - 使用 AND(或)根据多行值进行选择

Java从mysql中检索正确格式的日期记录

python - 有没有一种方法可以在 MySQL-Python 中对每个字符串执行多个查询?

database - AWS RDS MYSQL 导入数据库访问被拒绝