4

设置:EC2 服务器在 ELB 后面自动扩展,连接到 RDS mysql 数据库,所有静态文件都从云端提供。

我在 EC2 服务器上运行 nginx 作为 Web 服务器,keepalive 设置为 20,工作进程 4,. Codeigniter 是后端并使用 codeigniter 会话。

我一直在运行许多基准测试来尝试测试性能、围攻、apache 基准测试、blitz.io。

我正在测试两个特定页面,第一个性能非常好,它使用 codeigniter 会话,因此会访问数据库以读取和更新 ci_sessions 数据库。第二页是我遇到问题的页面,它运行一个包含多个连接的查询,单个用户在大约 0.4 秒内完成。此查询已优化,我正在使用 InnoDB 表。在使用 c10 和 n1000 的 apache 基准测试下,100% 的请求会在 634 毫秒内返回。

当我运行并发用户 > 200 时,我开始遇到问题。添加更多 EC2 服务器无济于事,CPU 的利用率约为 50%。RDS 数据库监控还显示 CPU 和内存使用率低于 70%,平均 DB 连接数 < 35。

通过迁移到大型 RDS 实例和大型 EC2 实例提高了性能,这让我想知道 I/O 是否在这里发挥作用。

如果我在负载测试期间启动 ELB 之外的服务器并点击此页面,它会在不到一秒的时间内返回,但如果我在 ELB 内启动另一台服务器,它最多会保持 4 或 5 秒。这表明我没有超载 RDS。

我尝试用 5 分钟的爆发缓慢地增加 ELB,但这似乎没有帮助。

我想知道下一步该去哪里寻找这个问题,无论是某种 I/O 问题还是其他问题,因为 RDS 和 EC2 服务器似乎没有发挥它们的能力。任何建议或想法下一步将不胜感激

4

1 回答 1

2

好的。如您所知,这是一个非常广泛的主题。但我会尽力帮助。

  1. ELB 通常不擅长突发扩展。在与亚马逊工程师讨论过这个问题后,我发现他们实际上不会在爆发时扩展 ELB,因为这是不可能的。您需要随着时间的推移保持一致的负载才能扩大 ELB。因此,我切换到了 haproxy。除了 ELB 不会在突发负载上扩展之外,它还使用 CNAME 进行 DNS 查找,这也会影响您的性能。因此,如果您计划经常进行突发负载,或者要求进行 DNS 查找,最好不要使用 ELB。

  2. RDS 是一个黑匣子。好吧,这并不完全正确,但总的来说,我会避免使用 RDS,除非我知道后端是一个易于扩展的简单设置。话虽如此,RDS 确实有助于扩展,但我会简化后端并确保您的查询快速运行。在常规 MySQL 实例上运行它,看看它是否是亚秒级的。根据我的经验,当您说查询是“优化的”时,这并不意味着如果您发现我的想法没有其他方法可以使其更加“优化”。

于 2012-07-02T15:25:14.103 回答