为什么从 RDS 获取 10,000 次查询的结果所用的时间如此不均匀?(实验)

为什么从 RDS 获取 10,000 次查询的结果所用的时间如此不均匀?(实验)

总结:为什么从 EC2 请求时从 RDS 获取 10,000 次 SELECT 语句的结果所花费的时间如此不均匀?

使用中小型 RDS 服务器的结果更新了问题

在尝试使用 AWS 检查获取 SQL 查询结果所花费的时间时,我得到了以下非常不均匀的结果:

我编写了一个 PHP 代码来报告获取 SELECT 查询结果所花费的时间n来自服务器的时间。

while($flag<n)
    {
       $t=microtime(true);
       $result=$con->query($q);
       $t=microtime(true)-$t;
       $total+=$t;
       $flag++;
    }

环境:

  • 所有交易均在 AWS 的私有 VPC 内完成
  • 所有服务器位于不同的区域
  • 每台服务器上 MySQL 的配置是:EC2 上的 MySQL:version = 5.6,RDS 上的 MySQL:5.5,query_cache_size = 16777206,query_cache_state = ON。
  • 数据库 A 大型数据库 ~= 5GB,查询表有 ~= 20000 行。

服务器:

  • EC2 A,可用区域:us-east-1e,类型:t2.micro。
  • EC2 B,可用区域:us-east-1b,类型:t2.micro。
  • RDS 可用区:us-east-1c,类型:db.t2.micro、db.t2.small(已更新)、db.t2.medium(已更新)

结果 :

执行 10,000 次 SELECT 查询所需的时间:

  • 请求服务器B,数据库服务器B

5 次试验的结果为:20、21、20、20、21(单位:秒)

  • 请求服务器A,数据库服务器B

5 次试验的结果为:33、33、33、33、3(全部以秒为单位)

  • 请求服务器A,数据库服务器RDS(micro)

11 次试验的结果如下:272, 709, 49, 48, 711, 593, 47, 316, 153, 47, 636(全部在秒内)

  • 请求服务器A,数据库服务器RDS(小)

5 次试验的结果如下:53, 54, 53, 158, 698(全部在秒内)

  • 请求服务器A,数据库服务器RDS(中)

5 次试验的结果如下:96, 123, 579, 252(全部在秒内)

为什么 RDS 在 SELECT 语句 10000 次循环的测试中耗时这么不均衡? 而且为什么比 EC2 服务器高那么多?

[我不认为这是由于网络造成的,因为当我用较少的循环(1000 个循环)做实验时,EC2 -> RDS 的读数是 4、5、5、5、4。]

当我记录每个获取请求的时间时,我注意到以下情况:

  • 对于 RDS 上 10,000 个循环花费 153 秒的情况:

每个查询所花费的平均时间:0.015419

查询次数超过 10000 次中平均时间的次数:1644

查询所花费的时间超过平均完成时间的总时间:119.364(占总时间的 78%)

  • 对于 RDS 上 10,000 个循环花费 636 秒的情况:

每个查询所花费的平均时间:0.063605

查询次数超过 10000 次中平均时间的次数:8629

查询所花费的时间超过平均完成时间:628.6426(占总时间的 98.8%)

编辑1:

我记录了 10,000 个请求周期中每个获取请求的时间,我注意到,经过一些请求后,每个请求的时间增加到 ~0.07 秒(从 ~0.003 秒)。但这种增加发生在随机数量的请求之后。例如,有时在 ~8000 个请求之后,有时在 ~3000 个请求之后。可能是什么原因?此外,当 10,000 个请求需要 ~45 秒时,RDS 中的 CPU 利用率约为 5%。而当需要 >100 秒时,CPU 约为 10-15%。

编辑2:

我将 RDS 服务器从 t2.micro 升级到 t2.small,然后升级到 t2.medium。性能依然不稳定:

  • 请求服务器A,数据库服务器RDS(小)

5 次试验的结果为:53、54、53、158、698(单位:秒)

  • 请求服务器A,数据库服务器RDS(中)

5 次试验的结果为:96、123、579、252(单位:秒)

编辑3:

我将 RDS 切换到另一个区域。现在读数似乎一致。问题可能是某个吵闹的邻居窃取了 CPU。

  • 请求服务器A,数据库服务器RDS(小型,在不同区域)

5 次试验的结果为:156、151、151、151、151、302(单位:秒)

答案1

我注意到您正在使用db.micro实例。与 EC2 一样,微型实例的设计旨在节省成本,但会牺牲性能。也就是说,您将获得很多与普通实例相比,加载这些类型的服务器时性能较差,因为与共享相同硬件的其他实例相比,CPU 时间是“最后”分配给该实例的。

为了证明这一点,请针对实例再次运行测试db.medium,您会发现它更加一致。

相关内容