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

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

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

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

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

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

Enviornment:

  • 所有交易都是在AWS的专用vpc内完成的
  • 所有的服务器都在不同的区域
  • 每台服务器上MySQL的configuration是:EC2上的MySQL:版本= 5.6,RDS:5.5,query_cache_size = 16777206,query_cache_state = ON。
  • 数据库一个大的数据库〜5GB,查询表有〜20000行。

服务器:

  • EC2 A,可用区域:us-east-1e,types:t2.micro。
  • EC2 B,可用区域:us-east-1b,types:t2.micro。
  • RDS可用区域:us-east-1c,types: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语句的10,000个循环testing中花费的时间如此不均匀? 为什么它比EC2服务器高呢?

[我不认为它是由networking引起的,因为当我用较小的循环(1000个循环)进行实验时,EC2-> RDS的读数是4,5,5,

当我logging每个提取请求的时间时,我注意到以下内容:

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

平均时间每个查询采取:0.015419

查询数量超过了10000:1644的平均时间

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

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

平均时间每个查询采取:0.063605

查询数量超过了10000:8629的平均时间

查询花费的平均时间:628.6426(占总时间的98.8%)

编辑1:

我logging每个抓取请求在10,000 req周期的时间我注意到,在一些请求后,每个请求的时间增加到〜0.07(从〜0.003)秒。 但是这个增加发生在随机数的请求之后。 就像有时在〜8000个请求之后,有时在〜3000个req​​之后。 可能是什么原因? 另外,当10,000 req需要约45秒时,RDS的CPU利用率约为5%。 而当它需要> 100秒,那么CPU是10-15%左右。

EDIT2:

我将RDS服务器从t2.micro升级到t2.small,然后再升级到t2.medium。 性能再次不平衡:

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

5次试验的结果是:53,54,53,158,698(全部秒)

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

5次试验的结果是:96,123,579,252(全部秒)

EDIT3:

我将RDS切换到另一个区域。 现在读数似乎是一致的。 可能是CPU被一些嘈杂的邻居窃取的问题。

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

5次试验的结果是:156,151,151,151,151,302(全部秒)

我注意到你正在使用db.micro实例。 与EC2一样,微型实例的devise也是经济实惠的,但是以性能为代价。 也就是说,加载这些types的服务器与正常实例相比,性能会差得多,因为与其他共享相同硬件的实例相比,CPU时间赋予实例“最后”。

为了certificate这一点,再次对db.medium实例运行你的testing,你会发现它更一致。