负荷/压力testing方法。 期望什么和如何解释结果?

我们有这个新的客户,我们正在审查我们的服务器基础设施。

我非常了解web API,因为我已经帮助构build了它,现在我正在自己维护并推动它,这是一个非常大的挑战,也非常有趣。

它基于Amazon m1.large实例,nginx(+ ssl),django,amazon RDS(带有MySQL)和一个自己托pipe的memcached。

问题是,我们从我们的客户那里得到了一些信息,他们希望至less有2500名用户连接到这个API,每天两次,至less每天两次。

我们不知道什么时候会出现这些连接,我们不应该做出任何假设,所以我最终想到的是,我们的服务器在一个时间点更好地支持2500个连接。

我一直在玩Apache的基准发送2500并发连接,而​​连接/断开memcache或一些nginx设置,只是为了看到性能的变化。

最好的我每秒约100个请求,但最长的请求需要超过20秒(对于2500个并发连接,只有100个请求最多需要1秒)。 从用户的angular度来看,我不想等待超过1秒或2秒才能得到我的结果…

我想用nginx,django,mysql或者memcache来调整所有的设置,但是现在我想我需要一种方法,而不仅仅是一种方法,我需要一个目标来实现。

在网上search我看到的博客文章谈论的服务,每秒钟达到几百个请求。 我远非如此。

看到来自apachebench的所有这些数字只是给我一个印象,即我正在启动testing,看到结果,但我并不真正了解他们,也不知道如何改进我们的API。

那么,什么是一个好的方法,一个很好的方法来达到使web API能够尽可能快地处理这个连接数量的目标呢?

如果你需要更多的细节只是问!

我从来没有用Django的设置,所以可能无法进入Django的细节。 如果你能够提供CPU,IO,内存统计信息,当你达到每秒100个请求时,这将是非常好的。 根据您的资源紧缩的性质,您可能会因各种原因得到20秒的延迟。 如果不知道压力下系统的健康状况,您可能无法理解性能统计数据。 开始的好地方可能是Amazon CloudWatch指标和/或使用适当的graphics工具(如Graphite或Ganglia)启用对Munin,Nagios或类似工具的监控。 即使跟踪vmstat输出也可能揭示很多事情。

识别您的问题的关键是收集有关您的系统的健康的足够的数据,并遵循它。 您可以简单地在Graphite上绘制您的stream量趋势以及CPU使用率,IO等待,上下文切换,中断数量,可用内存等其他统计数据,并尝试将这些数据共同关联起来。 你甚至可以将你的请求周期分解成数据库,中间件和渲染阶段,并跟踪每个阶段所花费的时间。

  1. 检查数据库查询是否缓慢。 我不确定这一点,但RDS可能为您提供缓慢查询的统计数据。 你可能想优化这些。
  2. 如果CPU导致瓶颈,并且在高峰stream量期间看到CPU峰值,则可能需要检查处理过程中的峰值和零点处理状况,以确定是否在CPU上出现问题,从而使您的Web服务器在一段时间内不可用(导致20秒延迟)。 此外,你可以想出优化这个过程的措施,或者如果这是不可能的,你可能想切换到一个c1.xlarge实例。
  3. 如果您的服务器遇到内存紧缩并在高峰stream量期间显示可用内存不足,则可以检查应用程序内存密集的区域。 您可能希望在这些区域进行优化,或者通过将实例升级到高内存备选scheme来投入更多的内存。 此外,你甚至可以考虑调整你的应用程序代码,使你的内存绑定进程cpu-bound。 通常在内存紧缩期间CPU利用率不高。
  4. 如果你的服务器的CPU利用不足,甚至没有看到内存紧缩,那么你的系统很可能会花费大量时间在IO等待中。 这可能是由于任何依赖关系中的延迟。 在使用vmstat高峰负载期间,还要检查上下文切换和中断的数量。 如果您select运行更多数量的工作进程而不是可用的内核数量,则可能会发生这种情况。 服务器也可能正在等待块IO。 有些在EBS上遇到了阻塞IO延迟,虽然我很酷。

希望这可以帮助。

首先,你需要确定这个Web服务的瓶颈。 这可能是缓慢的数据库查询和/或糟糕的Django性能。 请注意,大多数用于快速Web应用程序开发( Django性能 )的框架并没有针对速度进行真正的优化。 除非你能负担得起使用许多服务器和负载平衡,否则你不能真正期待很好的性能。

反正…对于初学者我会尽力:

  1. 检查关键SQL查询的速度,并在必要时优化查询。 考虑使用memcached来cachingSQL查询的结果(您可能需要对代码进行一些更改)。
  2. testingdjango可以处理多less个请求(有和没有数据库查询)
  3. 检查一个典型的请求/响应的大小,并问自己,如果你的硬盘驱动器/连接可以处理这种types的stream量。 使用像IOTOP这样的I / O监视可以提供一些帮助。
  4. 检查你的CPU是否可以处理这种stream量 – 使用top命令。