rails puma nginx并发访问-找不到瓶颈

rails puma nginx并发访问-找不到瓶颈

我在 puma 上运行了一个简单的 rails 应用程序,其前面有一个以标准方式配置的 nginx 代理服务器。它们在 aws t2.micro 实例上运行。

mysql db 正在另一个 t2.micro 实例上运行。

如果我对具有 20 个并发登录的简单登录用例运行 jmeter 负载测试,我会得到以下结果:

summary +      1 in 00:00:03 =    0.3/s Avg:  2542 Min:  2542 Max:  2542 Err:     0 (0.00%) Active: 20 Started: 20 Finished: 0
summary +     79 in 00:00:06 =   13.7/s Avg:  1734 Min:   385 Max:  3246 Err:     0 (0.00%) Active: 0 Started: 20 Finished: 20
summary =     80 in 00:00:09 =    9.2/s Avg:  1744 Min:   385 Max:  3246 Err:     0 (0.00%)

当我使用 100 个并发登录运行相同的测试时,我得到以下结果:

summary +    362 in 00:00:14 =   25.0/s Avg:  2081 Min:   381 Max:  9730 Err:     0 (0.00%) Active: 21 Started: 100 Finished: 79
summary +     38 in 00:00:13 =    3.0/s Avg:  4887 Min:   625 Max: 17995 Err:     0 (0.00%) Active: 0 Started: 100 Finished: 100
summary =    400 in 00:00:27 =   14.8/s Avg:  2347 Min:   381 Max: 17995 Err:     0 (0.00%)

平均和最大响应时间增加了 2-5 倍。这并不奇怪,但当我查看服务器 CPU 和内存负载时,我找不到瓶颈。测试时间范围内的最大 CPU 使用率为 36%,内存消耗几乎没有变化(增加了 5MB)。

我的问题是:实际瓶颈在哪里?扩展策略是什么?将美洲豹工作者放在单独的 EC2 实例上?

我对设置这样的服务器不是很有经验,所以欢迎所有提示。

答案1

值得深思的是:

  • 您只检查了有限资源模型中的两个项目:CPU 和内存。您忽略了与磁盘和网络相关的项目。
  • 如果您在 AWS 内部的虚拟机上运行 JMETER 实例,以避免来自 Amazon 外部的负载产生费用,那么您需要考虑虚拟机上称为“时钟跳跃”的问题,该问题会影响您的响应时间数据。系统时钟在客户操作系统内部虚拟化。当系统使用时,它会变慢,并且必须定期与虚拟机管理程序主机基准时钟重新同步。您既不知道何时发生这种情况,也不知道何时可以控制这种情况。它的表现形式是测试运行中的平均和最大计时记录更长,因为当事件的计时记录打开时,确实会发生此时钟重新同步。您可以使用测试设计中在物理硬件上运行的控制元素(例如控制负载生成器)来检查这一点。控制元素的结果应该有助于说明非控制集的数据偏差量。
  • 您正在虚拟机中运行,由于虚拟机管理程序向客户操作系统报告正在使用的内容的方式,因此很难获得实际使用资源的高精度数字。
  • 这时代码分析器或深度诊断工具就派上用场了。您需要明确查找资源分配过早、代码调用过于频繁或在代码中释放资源之前时间过长等情况。性能工程师在优化给定业务流程时,会从这种过早、过于频繁和过于漫长的角度来查找代码,因为这些情况在生产中很容易出现响应时间和可扩展性问题。

相关内容