总结:为什么从 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
,您会发现它更加一致。