云数据库RDS MySQL的性能

一直都在非常深度调研、关注和使用云数据库,其中性能是关注的重点之一。一方面性能是最终成本的重要影响因素,更好的性能,通常意味着使用更少的资源支撑更高的业务量,从而降低整体成本。另外,性能还意味着在极端场景下,数据库的上限支撑能力。所以,一直以来都会持续的对RDS MySQL的不同厂商、规格进行性能测试,在此汇总相关数据,供开发者和企业在云数据库选型时的参考。

实用结论(TL;DR)

先说些一些基于测试的实用结论吧,可以让更多的开发者参考:

  1. 在阿里云上,强烈建议考虑使用经济版(ARM)替换标准版(x86),很容易获得超30%的性价比(参考
  2. 总是建议使用最新一代CPU实例,通常都可以获得15%的性价比提升,例如AWS m6i vs m5i,m7g vs m6g(参考
  3. 几大云厂商的”企业级”实例的性能有着显著差异,主要原因是主从复制架构、CPU代差、存储架构等不同导致(参考
  4. 国内云厂商都提供了“通用型”实例,以非常小的资源共享换取了非常大的性价比提升,非常适合非关键场景使用(参考

整体上,在不同的平台上ARM-based的RDS MySQL有着不同的表现。具体如下:

Graviton vs x86 on AWS

  • 在AWS上,Graviton 3实例RDS性能在高并发时,相对x86有较明显的性价比优势,以128并发为例,m7g vs m6i的对比
  • Graviton 3 相比Graviton 2有非常明显的性能优势(参考),这与宣称的27%性价比提升是较为一致的
  • Graviton 2实例相比x86几乎没有什么优势,与宣称的52%性价比提升结果相悖

ARM vx x86 on 阿里云

  • 经济版(ARM)比标准版(x86)性价比要高出32%
  • 具体的:选取16并发,ARM版TPS为2185,x86版TPS为2324。价格上, ARM版价格为1.61元/时, x86版价格为2.52元/时,那么对应每1000个TPS的价格分别为:0.74元与1.08元。从性价比的角度来看,经济版提升了31.5%

鲲鹏 vs x86 on 华为云

  • x86和鲲鹏架构实例价格是相同的
    鲲鹏版本相比x86约有15~45%的性能差距
  • 考虑到自研鲲鹏芯片在中国自主可控芯片中的地位,在国内大量无法使用x86的场景中,这个性能下降通常都是可以接受

开启传输加密时,对性能的影响约为2%~8%,不同的环境不同的数据库版本会有一些不同。在实际的生产环境中,建议默认打开该功能,应用连接是否需要开启,可以根据实际场景决定。通常,如果Client端和数据库服务器不再同一个网络环境中,则建议Client端启用加密传输。

阿里云RDS MySQL开启/关闭TLS的性能测试

如下是本人在2024年1月的ACMUG(中国MySQL用户组)大会上的分享内容,较为详细对之前的云数据库 RDS MySQL性能测试做了分享。如下为分享的PDF,供参考:

云数据库RDS-MySQL性能深度测评与对比-202401-v1.4

参考链接

这里使用常用的、易用重现的Sysbench工具进行测试。主要的模型包括oltp_read_write以及部分自定义模型。Sysbench因为其易用使用,可定制性高被业绩广泛使用,包括AWSGoogle Cloud阿里云腾讯云等。

sysbench oltp_read_write模型

sysbench的oltp_read_write模型是一个事务压测模型,单个事务中包含了10个点查、4个范围查询(包括了ORDER BY/SUM/DISTINCT等)、影响索引的更新、不影响索引的更新、删除数据、插入数据。具体的,SQL示例如右侧代码所示。

关于该测试模型的详细说明可以参考文章:

oltp_read_write模型的Queries

BEGIN
SELECT c FROM sbtest3 WHERE id=5025
SELECT c FROM sbtest3 WHERE id=5010
SELECT c FROM sbtest3 WHERE id=5004
SELECT c FROM sbtest3 WHERE id=5019
SELECT c FROM sbtest3 WHERE id=5027
SELECT c FROM sbtest3 WHERE id=5020
SELECT c FROM sbtest3 WHERE id=4326
SELECT c FROM sbtest3 WHERE id=5044
SELECT c FROM sbtest3 WHERE id=6045
SELECT c FROM sbtest3 WHERE id=3529
SELECT c FROM sbtest3 WHERE id BETWEEN 5020 AND 5119
SELECT SUM(k) FROM sbtest5 WHERE id BETWEEN 5010 AND 5109
SELECT c FROM sbtest3 WHERE id BETWEEN 5000 AND 5099 ORDER BY c
SELECT DISTINCT c FROM sbtest4 WHERE id BETWEEN 5039 AND 5138 ORDER BY c
UPDATE sbtest4 SET k=k+1 WHERE id=4291
UPDATE sbtest1 SET c='57995045141-...-55126207842' WHERE id=5022
DELETE FROM sbtest4 WHERE id=4999
INSERT INTO sbtest4 (id, k, c, pad) VALUES (4999, 5049, '77394423405-...-74420299847', '43459108876-...-51424111535')
COMMIT

Leave a Reply

Your email address will not be published. Required fields are marked *