AWS 云计算:全球第一的光环下,藏着怎样的真相? AWS 是全球云计算市场占有率第一的厂商,这一地位已持续十余年。但”第一”是否等于”最好”?当我们抛开品牌光环,从架构设计、工程实践、性能数据、价格四个维度进行实测和分析后,得出的结论可能会颠覆很多人的认知。
本文所有结论均基于一手测试数据和抓包分析,不做任何主观外推。
一、设计理念:高可用的代价,用户买单 1.1 强制跨可用区:每次写入都要跨机房 AWS 的 RDS MySQL 默认部署模式是 Multi-AZ(多可用区),主备实例强制分布在不同的可用区。这一设计的出发点是高可用——单个机房故障时可以自动切换。但代价是什么?
每一次写操作,至少需要跨可用区至少 1 次:
应用写入主库 → EBS 通过网络同 AZ落盘
半同步复制 → 跨 AZ 将 binlog 发送到备库
备库确认收到 → 跨 AZ 返回 ACK
实测 AWS 可用区间 RTT 约 0.75ms 。这意味着仅网络延迟这一项,每次写操作就要额外付出 0.75ms 的开销,这在数据库上是无法忍受的慢慢慢!
以上是理论计算,我们来看一下实际业务体感:
AWS 上一次最简单的 INSERT:3.32ms (业务实测)
同样的业务在 IDC 物理机:微秒级 (0.x ms)
差距不是百分之几十,而是 数倍到一个数量级 。
1.2 对比:阿里云的灵活选择 阿里云 RDS 提供集群模式,允许将 2 个节点部署在同一可用区 ,在对延迟极度敏感的场景下实现接近 IDC 的性能。用户可以根据自身业务特点在”极致高可用”和”极致低延迟”之间做选择。
AWS 和华为云目前不提供 这种灵活性,用户被强制接受跨 AZ 的延迟开销。
1.3 云盘延迟:贵不等于快 AWS 的 EBS 云盘走网络存储,延迟远高于本地盘。实测数据(fio 4K 随机读写,iodepth=1):
云盘类型
读延迟
写延迟
AWS io2(最贵)
393 us
306 us
AWS io1
588 us
868 us
AWS gp3
686 us
994 us
gp3 写延迟接近 1ms ,而阿里云 ESSD 在同等场景下可以做到 0.1~0.2ms 级别。AWS 最高档的 io2 写延迟(306us)仍然是阿里云高性能云盘的 2-3 倍 。
对于数据库这种对 IO 延迟极度敏感的负载,这意味着每一个 commit 都在额外等待。
二、工程实践:350 秒连接静默丢弃事件 如果说设计理念的问题还可以归结为”理念之争”,那么以下这个事件则暴露了 AWS 在工程实践和事故响应上的严重问题。
2.1 问题现象 业务迁移到 AWS 第 8 代实例(M8/C8/R8,Nitrov6 架构)后,Java 服务每隔 20~30 分钟出现批量连接超时:
1 Connection is not available; request timed out after 5006ms
网络延迟稳定在 ~8ms,0% 丢包,MySQL 健康。
2.2 根因:ENI 连接跟踪超时从 5 天骤降至 350 秒 通过 80 分钟、84595 个包的系统性抓包分析,定位到根因:
AWS 第 8 代实例的 ENI(弹性网卡)安全组连接跟踪,将 TCP Established 默认超时从 432000 秒(5 天)悄然改为 350 秒。
实例代次
Nitro 版本
TCP Established 默认超时
第 7 代及以下
Nitrov5 及以下
432000s(5 天)
第 8 代(M8/C8/R8)
Nitrov6
350s
这是一个 1234 倍的缩减 ,且行为极为恶劣——超时后 ENI 静默丢弃 数据包,不发送 RST,不通知任何一方。抓包中 84595 个包 0 个 RST 。
客户端和服务端都以为对方还在,TCP 连接变成”僵尸”——直到下次使用时才发现已死,此时应用只能等待重传超时(数十秒到数分钟),表现为”突然卡住然后超时”。
2.3 AWS 的事故复盘令人失望 这一事件中 AWS 的表现:
文档滞后 :用户 4 月初碰到问题,4 月 7 日定位到中间设备释放连接,4 月 15 日还在抓包验证。而 AWS 直到 4 月 11 日才在文档中加入警告段 (通过 Wayback Machine 快照对比确认)
变更未通知 :从 432000s 改到 350s 这种破坏性变更,C8gn GA 公告(2025-06)中未提及超时变更 。用户升级实例后莫名遇到连接问题,排查成本极高
比 NAT Gateway 更”哑” :
NAT Gateway / NLB 超时后至少一侧会收到 RST,应用能感知”对端断了”
ENI conntrack 超时:双侧都收不到 RST ,包被静默丢弃,应用只能靠 OS 重传超时来发现
复盘质量 :AWS 官方的事件复盘未能清晰阐述根因,定位路径模糊
2.4 “350 秒”——AWS 的系统性问题 350 秒这个数字在 AWS 生态中反复出现:
组件
空闲超时
超时后行为
NAT Gateway
350s(固定)
发 RST
NLB(2024-09 前)
350s(固定)
发 RST
GWLB
350s
发 RST
ENI Conntrack(Nitrov6)
350s(默认)
静默丢弃
社区早在 2021 年就有人踩坑(Paramount Tech Blog),2022 年 DBA 博客记录了 JDBC 挂起问题,2023 年 urllib3 专门开了 Issue。这不是新问题,但 AWS 在 ENI 层面重蹈覆辙,且行为更恶劣(不发 RST)。
三、性能数据:Sysbench 实测全面落后 以下数据来自 10 个环境的标准化 Sysbench 测试,使用 16 表 x 1000 万行(约 50GB 数据),MySQL Buffer Pool 16GB,故意制造 IO 压力以考验真实磁盘性能。
3.1 只写场景(oltp_write_only)—— 单线程 QPS 这是最能体现”每次写操作延迟”的场景:
环境
1 线程 QPS
对比 IDC
IDC(物理机)
19,282
基准
IDC(trx1)
15,367
80%
阿里云
12,484
65%
阿里云(trx1+repl)
5,832
30%
AWS io2
8,881
46%
AWS io2(trx1)
3,575
19%
AWS gp3
1,689
9%
AWS gp3 单线程写入性能仅为 IDC 的 9%,仅为阿里云的 14%。 即使用最贵的 io2 云盘(价格是 gp3 的数倍),开启 trx1 后也只有 IDC 的 19%。
3.2 读写混合场景(oltp_read_write)—— 64 线程 QPS
环境
64 线程 QPS
对比阿里云
阿里云
83,569
基准
IDC
69,255
83%
AWS io2
51,002
61%
AWS gp3
64,869
78%
3.3 点查询场景(oltp_point_select)—— 64 线程 QPS
环境
64 线程 QPS
对比阿里云
阿里云
328,098
基准
IDC
299,555
91%
AWS io2
157,480
48%
AWS gp3
228,321
70%
AWS io2 在纯读场景下也只有阿里云的 48% ,令人诧异。
3.4 延迟对比(95 分位,单线程)
场景
IDC
阿里云
AWS io2
AWS gp3
点查询
0.04ms
0.07ms
0.09ms
0.67ms
只写
0.52ms
0.99ms
1.61ms
5.99ms
读写混合
2.81ms
3.30ms
3.89ms
15.00ms
AWS gp3 的只写延迟是 IDC 的 11.5 倍,是阿里云的 6 倍。
3.5 小结 即便使用 AWS 最贵的 io2 云盘(2T 云盘价格是 8C32G 机器的 8 倍),性能仍然大幅落后于阿里云使用普通云盘的配置。云盘延迟是 AWS 数据库性能的致命瓶颈。
四、价格:花更多的钱,买更差的性能 4.1 AWS RDS MySQL 成本 以 16C64G、GP3 2TB 20000 IOPS、3 节点(1 主 1 Multi-AZ 备 1 只读副本)为例:
Intel(db.m5d.4xlarge):
计算:¥204,964/年(折后)
存储(GP3 2TB x3):¥83,589/年(折后)
监控(CloudWatch):¥25,713/年(折后)
合计:约 ¥314,266/年
ARM(db.m6gd.4xlarge):
计算:¥183,718/年(折后)
存储:¥83,589/年(折后)
合计:约 ¥267,307/年 (不含监控)
最新一代 Intel(m7i.4xlarge,ap-southeast-1):价格更高。
4.2 性价比对比
维度
AWS(io2,最贵)
AWS(gp3)
阿里云
只写 64 线程 QPS
79,754
43,519
110,923
读写混合 64 线程 QPS
51,002
64,869
83,569
云盘写延迟(iodepth=1)
306 us
994 us
~100-200 us
价格档位
极高
高
中
AWS 用最贵的云盘(io2),花了最多的钱,性能仍然不如阿里云用普通云盘。
io2 的 2T 云盘年费约为同规格机器的 8 倍——付出如此高昂的代价,换来的却是垫底的性能表现。
4.3 隐性成本 除了直接的资源费用,AWS 还有大量隐性成本:
排障成本 :350 秒静默丢连接这种问题,排查周期以周计,需要系统性抓包分析
架构妥协成本 :被迫跨 AZ 部署,无法选择同 AZ 低延迟模式
升级风险成本 :实例升代时默认行为发生破坏性变更,无事先通知
学习曲线成本 :需要深入了解 ENI 连接跟踪、NAT Gateway 固定超时等独有”坑点”
五、RDS MySQL 小版本升级维护需要重启两次 正常工程师脑回路的升级流程:Slave 升级到新版本,HA切换,业务闪断一次立即恢复正常,然后升级集群其它节点,完毕。
但AWS RDS MySQL 小版本升级的时候Master要重启2次,是的他们的升级逻辑就是这么干的导致我们业务2次跌0,很难想象这是全球最牛逼的云服务厂商干出来的事情,关键还不改 最可气的是他们认为这不是bug,只是by design,照这个歪理就没有bug,都是设计好了的
用户在这里最无助的就是他们不认为是bug,而且绝对不会去改
六、EMR 默认 JDBC 驱动兼容性缺陷:用了开源不测试,出了问题让客户自己换 jar 6.1 问题现象 EMR 集群(Hive 3.1.3)执行 CREATE TABLE 报错:
1 2 MetaException: Table "partition_keys" has been specified with a primary-key to include column "TBL_ID" but this column is not found in the table.
Metastore 后端是 RDS MySQL 8.0,设置了 lower_case_table_names=1(AWS RDS 支持的合法配置)。
6.2 根因 EMR 默认打包的 JDBC 驱动是 MariaDB Connector/J 2.7.2 ,而非 MySQL 官方驱动。该驱动的 DatabaseMetaData.getColumns() 方法在连接 MySQL 8.0 + lower_case_table_names=1 时存在 bug:
MySQL 8.0 在 lower_case_table_names=1 下,数据字典中所有标识符以小写存储
MariaDB Connector 查询 information_schema 时,不对表名做大小写归一化,返回的列名全部是小写(tbl_id)
Hive Metastore 使用的 DataNucleus ORM 内部以大写定义主键列名(TBL_ID),做大小写敏感比较 → 匹配失败
MySQL 官方 Connector/J 很早就有 normalizeIdentifierCase() 方法处理此场景,替换为 MySQL Connector/J 8.0.33 后问题消失。
6.3 为什么 EMR 用 MariaDB Connector 而不是 MySQL 官方驱动 这是许可证原因,不是技术原因:
Oracle MySQL Connector/J 是 GPL v2 (强 copyleft),商业产品分发时无法满足条款
Oracle 的 FOSS Exception 要求整体作品为自由软件,EMR 不适用
Apache 基金会将 GPL 列为 Category X 禁用许可 ,Hive/Spark 等上游项目本身就不能打包它
MariaDB Connector/J 是 LGPL 2.1 (弱 copyleft),允许商业分发,协议兼容,能正常连接 MySQL
法律上没问题。但工程责任上呢?
6.4 AWS 的工程责任缺失 选择了 MariaDB Connector 作为默认驱动,连接的后端是 MySQL 8.0,lower_case_table_names=1 又是 MySQL Server 支持的合法参数组合——这条数据通路是 EMR 最核心的路径之一(Hive Metastore 每次建表、查表都走这里)。但 AWS:
没有充分集成测试 :lower_case_table_names=1 + MySQL 8.0 + MariaDB Connector 的组合不是什么边缘场景,是 Hive Metastore 的核心路径。AWS 自己的 RDS 文档还专门说明如何设置此参数,结果自家 EMR 的默认驱动不兼容自家 RDS 的合法配置
没有回馈上游 :这个 bug 在 MariaDB Connector 中存在多年,AWS 作为最大的间接用户之一,从未提交过 patch 或 issue
没有文档提示 :EMR 文档中不存在任何 Known Issues 警告此兼容性问题
修复方案甩给客户 :官方答复是”可通过 bootstrap action 自行替换 jar”——把本应是产品质量保证的工作,转嫁为客户的排障成本
6.5 这不是个案,是模式 我们已经向 MariaDB 社区提交了 bug report(CONJ-1344),但这件事本质上暴露的是 AWS 对开源组件的态度:
“我用 LGPL 不用付费也不用回馈,出了问题客户自己换 jar。”
这在法律上没毛病,但在工程责任上是甩锅。一个年收入百亿美元级的云产品,连核心数据通路的驱动兼容性都不做充分验证——不测试自家 RDS 参数和自家 EMR 驱动的组合——确实说不过去。
这和前面的”350 秒超时不通知”、”小版本升级重启两次 by design”如出一辙:AWS 追求的是”能跑起来”而非”跑得对”,出了问题不认 bug 只认 design,修复靠客户自助。全球第一的产品,三流的工程责任感。
其它
AWS 同一个Region下跨AZ流量收费的,0.02美金每GB(双向收费加起来)——相对应的阿里云、华为云这部分流量均免费
强制升级但不退费——这个特别奇葩,买了一年的优惠套餐打折,结果半年后AWS强制RDS MySQL大版本从8.0升级到8.4,不用了也不行,要继续收费,如果是客户的原因继续收费是有道理的,但是AWS强制升级(相当于合同强制变更),但不退钱就是抢劫了
七、结论:惯性认知 vs 客观事实 AWS 能成为全球第一,有其历史原因:起步最早(2006 年)、生态最完善、全球覆盖最广。但”市场占有率第一”不等于”技术最优”,更不等于”性价比最高”。
从本文的实测数据来看:
维度
表现
设计理念
强制跨 AZ,牺牲延迟换高可用,不给用户选择权
工程实践
350s 超时静默丢包,变更不通知,复盘不透明
开源责任
用 LGPL 组件不测试不回馈,驱动兼容性问题甩给客户自行替换
性能
全场景 Sysbench 垫底,gp3 只写仅为 IDC 的 9%
价格
同等配置显著高于竞品,io2 价格是机器的 8 倍
性价比
花最多的钱,得到最差的性能
很多企业选择 AWS 的原因是”大家都在用””全球第一应该不会错”——这是典型的幸存者偏差 和品牌惯性 。当我们真正用数据说话时,会发现这个”全球第一”的光环,更多是依靠先发优势和生态锁定维持的,而非技术和性价比的领先。
对于数据库这类对延迟和 IO 性能极度敏感的工作负载,在有选择的情况下,AWS 恐怕是最不应该选的那一个。
当然站在 AWS 立场有一个必杀技:AWS 的设计理念就是……
注:本文所有性能数据均来自实际测试环境,测试工具为 sysbench,测试代码开源。网络分析基于 84595 个包的系统性抓包。价格数据来自官方控制台和报价器。文档变更时间线通过 Wayback Machine 快照验证。