API服务器上的Apache KeepAlive

时间:2011-06-04 10:50:02

标签: apache api keep-alive

我有一台带有Rackspace的LAMP服务器(Quad Core Debian,4GB RAM,Apache 2.2和PHP 5.3),用作API服务器。我想知道在我们的设置下,Apache的最佳KeepAlive选项是什么。

  • API服务器托管一个PHP文件,该文件以普通JSON响应。这是一个相当大的文件,它执行一些MySql读/写和相当多的Memcache查找。
  • 我们一次有大约90个登录系统的客户端。
  • 大约1/3的客户将闲置。
  • 在活动客户端(大约60个)中,他们每3秒向API发送一个请求。
  • 客户端每15或20分钟左右从活动状态切换到空闲状态,反之亦然。

随着KeepAlive On,服务器疯狂,内存峰值接近4GB(交换等)。 使用KeepAlive Off,内存为3GB,但我注意到Apache不断杀死并创建新进程来处理每个连接。

所以,我的三个选择是:

  1. KeepAlive On和KeepAliveTimeout默认 - 在这种情况下,我想我只需要获得更多内存。
  2. KeepAlive On和KeepAliveTimeout低(可能是10秒?)如果KeepAliveTimeout设置为10秒,客户端是否会通过访问常规资源3来保持与该进程的持续连接第二个间隔?当该客户端空闲超过10秒后,该过程会被杀死吗?如果是这样,我猜选项2看起来是最好的选择?

  3. KeepAlive Off 这显然最适合RAM,但是由于为每个请求设置新流程所涉及的工作,它会对响应时间产生影响吗?

  4. 哪个选项最好?

3 个答案:

答案 0 :(得分:0)

看起来你的php脚本正在泄漏内存。在使它们长时间运行之前,你应该掌握它。

如果您不了解每个请求的内存使用情况,并且从请求添加内存请求不是一个真正的解决方案。它现在可能会有所帮助,下周会再次破裂。

我将继续运行单独的进程,直到内存管理得到控制。如果您目前有响应问题,最好的办法就是添加另一台服务器来分散负载。

答案 1 :(得分:0)

您应该检查的第一件事是客户端是否实际上正在使用keepalive功能。我不确定你的'API服务器'是什么意思,但如果它的某种web服务然后(IME)使用keepalive很难实现表现良好的客户端。(请参阅mod_log_config的%k指令)。

另外,我们真的需要知道你的目标和限制是什么?性能/容量/低成本?

这是通过HTTP还是HTTPS运行 - 延迟有很大差异。

我已经说过10秒的保持时间非常高 - 一点也不低。

即使你有90个客户端保持连接打开,4Gb似乎是一个相当大的内存供他们使用 - 我运行的系统有150-200个并发连接到复杂的PHP脚本,使用大约0.5Gb而不是休息用法。您的250 + 90 x 20M的数字仅为您提供了大约2Gb的足迹(我知道并不是那么简单 - 但它并不复杂得多)。

对于你给出的数字,我不会期望任何好处 - 但显着更大的内存占用 - 使用超过5秒的keepalive。您可能使用2秒的保持活动时间而没有任何显着的吞吐量损失,但是无法替代测量各种配置的有效性 - 并且分析数据以找到最佳配置。

当然,如果您发现您的客户能够利用Keepalive并从中获得可衡量的收益,那么您需要找到适应这种情况的最佳方式。使用线程服务器可能会对内存使用有所帮助,但您可能会发现在Web服务器前运行反向代理会带来更多好处 - 尤其是SSL。

除此之外,您可以通过正常调整获得显着的好处 - 代码分析,输出压缩等。

答案 2 :(得分:-2)

您应该考虑将Apache切换到基于MPM的事件或基于线程的MPM,而不是管理KeepAlive设置,这些设置在3个选项之间的特定情况下没有明显的优势。{{ 1}}并将KeepAlive On值设置为高。

我还会考虑在Windows上切换到Apache。这里的好处是它的MPM完全基于线程,并利用Windows对线程而不是进程的偏好。在1-2GB的RAM上,你可以轻松地使用KeepAlive On和Timeout 3-10秒来完成512个线程。

WampDeveloper Pro - Xampp - WampServer

否则,您唯一的其他选择是将MPM从Prefork切换到Worker ... http://httpd.apache.org/docs/2.2/mod/worker.html

或者事件(使用Apache 2.4也变得更好)...... http://httpd.apache.org/docs/2.2/mod/event.html