我们有一个基于 AWS 的系统。我们使用 Beanstalk,具有自动扩展功能,我们的数据库 (mysql) 托管在 RDS 上。我们使用 apache 和 php。我们想在高负载下测试我们的系统。因此,我们为后端选择了大型实例(4 个 CPU,15GB RAM - 20 个实例)并为 RDS 选择了大型实例(8 个 CPU,30GB RAM)。我们开展了营销活动 - 很多用户访问了我们的网站。我们一直在检查延迟。然后它突然增加到 7 秒。如果发生这种情况,我会理解,因为 CPU 负载为 100% 或没有可用内存。但不,apache 服务器上的 CPU 利用率约为 50%,RDS 服务器上约为 20%。对数据库的请求 - 每秒约 20 次。内存足够。所以我不知道延迟为什么会增加。我为调查采取的步骤:
- 我看到错误“连接数过多”。之后,我增加了 RDS 中的 max_connections 选项
- 我增加了 apache 可以服务的用户数量。使用这篇文章:http://www.genericarticles.com/mediawiki/index.php?title=How_to_optimize_apache_web_server_for_maximum_concurrent_connections_or_increase_max_clients_in_apache
但问题仍然存在。我不知道该如何解决。为什么在有足够的资源来处理所有事情时,延迟值会增加?请帮忙。谢谢。
答案1
老实说,原因可能有很多种,你确实需要系统地分析每个组件并缩小引入延迟的范围,而不是试图猜测问题出在哪里。
话虽如此,我想到以下两件事:
ELB 无法立即扩展
如果您正在使用 ELB(我假设您正在使用),那么您需要缓慢扩大流量或请求 AWS 支持来预热您的负载均衡器。
我们建议您以以下速率增加负载每五分钟不超过 50%负载生成的阶跃模式和线性模式都应与 Elastic Load Balancing 配合良好。如果您要使用随机负载生成器,则必须设置峰值的上限,以使其不超过 Elastic Load Balancing 在扩展之前可处理的负载(请参阅预热 ELB)。
http://aws.amazon.com/articles/1636185810492479
磁盘输入输出
磁盘 IO 可能是一个问题在您的应用服务器或数据库上。人们通常认为磁盘 IO 是一种无限的资源,永远不会造成延迟,因为在本地未加载的机器上看起来就是这样。如果磁盘 IO 是一个问题,那么看看预配置 IOPS。