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

Sum*_*nha 4 mysql latency amazon-ec2 amazon-web-services amazon-rds

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

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

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

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

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

环境:

  • 所有交易都在 AWS 的私有 vpc 内完成
  • 所有服务器都在不同的区域
  • MySQL 在每台服务器上的配置是:EC2 上的 MySQL:版本 = 5.6,RDS 上: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(更新)

结果 :

执行 SELECT 查询的 10,000 次循环所花费的时间:

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

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

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

5 次试验的结果是:33、33、33、33、3(全部在秒内)

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

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。]

当我为每个 fetch 请求记录时间时,我注意到以下几点:

  • 对于 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 req 的周期中记录了每个 fetch 请求的时间,我注意到在一些请求之后,每个 req 的时间增加到 ~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(全部在秒内)

Nat*_*n C 6

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

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

  • @SumitSinha 微类实例是为突发而设计的。这样做,您将在一段时间内获得“高”性能……然后它会受到限制。在 EC2 中,您可以通过在使用某些活动加载服务器 CPU 时观察 `top` 输出来看到这一点 - “窃取”CPU 使用率作为一种节流形式而增加。 (3认同)