【问题标题】:apache memory gradually increasing over time with python/django/tastypie随着时间的推移,apache 内存随着 python/django/tastypie 逐渐增加
【发布时间】:2013-08-10 14:02:10
【问题描述】:

在运行 django/tastypie 的 Apache 中,随着时间的推移,内存逐渐增加。流量确实增加了,但我预计随着时间的推移内存会逐渐减少。

<IfModule mpm_worker_module>
StartServers           6
MinSpareThreads       12
MaxSpareThreads       24
ThreadLimit           48
ThreadsPerChild       24
MaxClients            24
MaxRequestsPerChild    0
MaxMemFree          1024
</IfModule>

守护进程:

WSGIDaemonProcess www.domain.com processes=24 threads=24

New Relic 的报告

我的想法有问题吗?如果内存最终稳定并呈线性增长,我真的不在乎内存是否会随着时间的推移而释放,只要它永远不会超过某个阈值。我有两台负载均衡的机器,它们的设置和做同样的事情。

否则一切都运行得很好,而且速度非常快。

谢谢, 标记

【问题讨论】:

    标签: python django apache wsgi tastypie


    【解决方案1】:

    您的 Apache MPM 和 mod_wsgi 守护程序配置一起被破坏了。我现在无法提供详细的答案,因为我正在度假和出门在外,但是去观看我的 PyCon 演讲,稍后我会尝试跟进,一旦我看到你已经观看并尝试自己修复你的配置并在此处发布跟进.


    更新 1

    顺便说一句,如果您查看 New Relic 下由 New Relic Python 代理监控的实际 Web 应用程序的容量分析报告,您应该会看到由于进程/线程数量过多导致您的容量利用不足的情况您正在使用 mod_wsgi 的守护进程模式。容量分析报告详见:

    【讨论】:

    • 我相信当特定站点的 apache 配置混杂在一起时我有点困惑(例如 WSGIDaemonProcess www.domain.com processes=24 threads=24)。我已将 apache 值降低为:StartServers 2 MinSpareThreads 25 MaxSpareThreads 50 ThreadLimit 50 ThreadsPerChild 25 MaxClients 75 MaxRequestsPerChild 0 MaxMemFree 1024,并且我已将 wsgi 文件降低为 WSGIDaemonProcess api.chanj.com threads=25。请注意,我不提供任何静态文件,这是盒子上唯一的网站。
    • 通过 wsgi 守护进程运行单个进程的缺点是什么?
    • 澄清一下,Apache 工作进程代理到 mod_wsgi 守护进程,因此守护进程组的进程*线程数不会超过 Apache 的 MaxClients,因为 Apache 工作进程永远无法同时代理多个 MaxClients 请求。因此,MaxClients 之上的守护进程组的任何东西都只是浪费了,并且随着时间的推移逐渐激活进程/线程,将看到内存逐渐增加,直到它达到稳定状态水平。
    • 对于大多数网站来说,运行单个守护进程通常没问题,因为它们从来没有足够的流量,所以你放什么并不重要。但在实践中,更好的配置可能是每个进程 5 个线程,然后需要尽可能多的进程来满足容量要求,这样对于典型的高吞吐量时间,容量利用率会下降约 30-50%。额外的容量将在流量激增的情况下出现。无论如何,这完全取决于您的应用程序,New Relic 容量分析报告是尝试调整它的一种方法。
    【解决方案2】:

    一天的运行时请求数量很少,因此很难判断您是否在泄漏内存。对我来说,你的图表看起来很合理,但有很多变量,所以很难确定。

    如果您担心泄漏,可以尝试使用maximum-requests WSGIDaemonProcess 选项在处理了这么多请求后重新启动进程。

    另外,你真的需要 24 个 WSGI 进程吗?每个都有自己的 python 解释器,因此随着时间的推移将消耗 24 * (1 python/django/tastypie 堆栈)。我建议进行负载测试并相应地减少进程数量。另请查看 Graham Dumpleton 的 this post

    【讨论】:

    • 谢谢,那篇文章中的图表有助于确定线程的进程是如何工作的。
    猜你喜欢
    • 2011-03-07
    • 2018-01-14
    • 2018-09-03
    • 1970-01-01
    • 2018-06-17
    • 2015-06-01
    • 2013-08-30
    • 1970-01-01
    • 2021-02-16
    相关资源
    最近更新 更多