我们有这个新的客户,我们正在审查我们的服务器基础设施。
我非常了解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等待,上下文切换,中断数量,可用内存等其他统计数据,并尝试将这些数据共同关联起来。 你甚至可以将你的请求周期分解成数据库,中间件和渲染阶段,并跟踪每个阶段所花费的时间。
vmstat高峰负载期间,还要检查上下文切换和中断的数量。 如果您select运行更多数量的工作进程而不是可用的内核数量,则可能会发生这种情况。 服务器也可能正在等待块IO。 有些在EBS上遇到了阻塞IO延迟,虽然我很酷。 希望这可以帮助。
首先,你需要确定这个Web服务的瓶颈。 这可能是缓慢的数据库查询和/或糟糕的Django性能。 请注意,大多数用于快速Web应用程序开发( Django性能 )的框架并没有针对速度进行真正的优化。 除非你能负担得起使用许多服务器和负载平衡,否则你不能真正期待很好的性能。
反正…对于初学者我会尽力: