两周前,亚马逊推出了其下一代标准实例(M3 实例),在提供与 M1 实例相同的平衡 CPU 和内存资源的同时,计算能力/核心数量翻了一番。我们不在我们的 Redis Cloud 集群中使用 M1 实例(它们无法应对 Redis 对高吞吐量、低延迟的要求,详情请见此处),但我们想知道 M3 双倍超大实例 (m3.2xlarge) 是否真的比我们在许多集群节点中使用的 m2.2xlarge 高内存实例表现更好。这两个实例具有相似的内存配置并使用相同类型的 vcores,因此最令我们好奇的是 M3 实例可以在 Xen 硬件虚拟化模式 (HVM) 下运行。因此,它们应该能克服严重影响 Redis 性能的 Xen fork time 问题(详情请见此处)。此外,m3.2xlarge 实例的 vcore 数量是 m2.2xlarge 实例的两倍,而额外成本不到 30%。
实例类型 | 内存大小 | vcore 类型 | vcores 数量 | 每小时成本(北弗吉尼亚) | 每小时 vcore 成本(北弗吉尼亚) |
m3.2xlarge | 30 GB | 3.25 ECU | 8 | $1.160 | $0.145 |
m2.2xlarge | 34 GB | 3.25 ECU | 4 | $0.900 | $0.225 |
测试场景 考虑到以上所有因素,我们对 Redis 在 m3.2xlarge 和 m2.2xlarge 实例上的性能进行了以下比较测试
测试复制时间很重要,因为 m3.2xlarge 不带临时存储,或者更准确地说,只有 15GB 的本地磁盘大小。这意味着即使不需要数据持久性,也必须连接到一个 EBS 卷,因为 Redis 复制过程需要在持久性存储上两次写入整个数据集(主节点和从节点)。由于 EBS 在顺序写入方面速度较慢(更多详情请见此处),我们想看看 Redis 复制是否以及如何受此配置影响。 事不宜迟,以下是我们的发现:Fork 时间
实例类型 | 内存限制 | 已用内存 | 内存使用率 (%) | Fork 时间 | 每 GB 的 Fork 时间 |
m3.2xlarge | 30 GB | 18.7 GB | 62.3 % | 0.25 秒 | 0.01 秒 |
m2.2xlarge | 34 GB | 17.3 GB | 50.8 % | 5 秒 | 0.29 秒 |
正如预期,使用 m3.2xlarge 实例的 fork 时间明显低于 m2.2xlarge 实例上的 fork 时间,因为它使用了 Xen 的完全虚拟化模式 (HVM)。在 AWS Cluster Compute 实例上也看到了类似的低 fork 时间结果(更多信息请见此处),但实例成本要高得多。 吞吐量和延迟 我们比较了单个分片 Redis 在这两个实例上的吞吐量和延迟,结果如下
我们的洞察
复制时间
实例类型 | RDB 文件大小 | 复制时间 |
m3.2xlarge | 0.6 GB(代表 8GB 内存数据集) | 88 秒 |
m2.2xlarge | 0.6 GB(代表 8GB 内存数据集) | 78 秒 |
为了测量复制时间,我们在从节点连接到主节点时开始测量,并在从节点同步完成时停止。虽然我们将 m2.2xlarge 实例配置为使用运行速度高达 80 MB/秒(峰值)的本地磁盘接口,并将 m3.2xlarge 配置为使用运行速度高达 30 MB/秒(峰值)的 EBS 接口,但 m2.2xlarge 实例的总复制时间仅快了 13%。我们认为这是因为在这种 RDB 文件大小下,填充过程占用了大部分时间。我们假设填充时间与整个复制过程的时间之比与 RDB 文件的大小呈线性关系。因此,文件越大,磁盘访问吞吐量对整个复制过程的影响就越小。小型 RDB 文件的复制本质上是快速的,因此可以肯定地说,更高吞吐量的存储接口不会显著影响整个复制过程。 结论 AWS 带有 HVM AMI 的新 M3 实例完全消除了 Xen fork time 问题,该问题在进行时间点快照或重写 Append Only Files (AOF) 后台保存过程时严重影响了 Redis 性能。另一方面,单线程 Redis 服务器在 m3.2xlarge 实例上的性能在纯内存和 AOF 测试中都比 m2.2xlarge 实例慢约 15%。m2.3xlarge 实例的复制时间也较慢,但没有我们预期的那么显著。我们的建议是,仅在您运行不带复制的 Redis 或需要在同一实例上运行四个以上 Redis 进程时,才使用 m3.2xlarge 而非 m2.2xlarge。对于所有其他情况,我们仍然推荐使用 m2.2xlarge 实例。 测试设置 对于想了解更多测试详情的人,以下是我们使用的资源
这是我们的负载生成设置:一个 m2.2xlarge 实例,运行我们开发的 memtier_benchmark 负载生成工具(一个高级负载生成工具,我们很快将在我们的 github 帐户中分享)。 为了测试 fork 时间,我们采取了以下步骤
为了测试吞吐量和延迟,我们进行了 2 次测试
我们在每种配置上运行了三次测试,并使用以下参数计算了平均结果
为了测试复制,我们