【问题标题】:memory usage never go down unless inactivity-timeout not set除非未设置不活动超时,否则内存使用量永远不会下降
【发布时间】:2017-04-27 13:22:37
【问题描述】:

/etc/apache2/sites-enabled/myproject.conf 的一部分:

WSGIDaemonProcess myporject user=tester group=tester processes=2 threads=5 python-eggs=xxx display-name=xxx

当一个用户开始浏览网站时,使用的内存增加了 80M(来自free -m 的输出),即使用户注销并关闭浏览器,内存使用量也不会下降,除非运行service apache2 restart .我尝试了worker modeprefork mode,但仍然没有发布。

inactivity-timeout 设置为 60 秒时,注销后 60 秒内存使用率会下降。

我是 apache2 和 wsgi 配置的新手。我只是想知道设置inactivity-timeout 是否是降低内存使用率的好方法?是否缺少其他重要配置?

欢迎任何 cmets。如果需要更多信息,请告诉我。谢谢

【问题讨论】:

    标签: django apache wsgi django-wsgi


    【解决方案1】:

    mod_wsgi 启动两个运行您的 Django 程序的进程(实际上这两个进程您的 Django 程序)。当请求完成时,进程继续运行,准备好处理新请求。

    您所指的请求需要 80 MB 内存,因此 Python 从操作系统请求该内存量,然后操作系统将其提供给 Python。当请求完成时,大部分内存都不再需要,并且未被使用。但是,Python 不会将其发布到操作系统。当 Python 再次需要内存时,它会重新使用这 80 MB。在大多数情况下,这种工作方式是令人满意的; Python不释放内存不是问题,因为它会重复使用它,所以通常你不需要做任何事情。

    inactivity-timeout 使mod_wsgi 在 60 秒后重新启动进程,因此新进程尚未处理请求,因此不会消耗大量内存。

    另见Releasing memory in Python

    【讨论】:

    • 谢谢。 inactivity-timeout是释放分配给python的内存的正确方法吗?还有其他更好的方法来释放它们吗?
    • 正如我所说,您通常不需要释放内存。如果你真的需要这样做,你可以使用inactivity-timeout,但你为什么要这样做呢?如果您的应用程序使用过多的内存,您应该做的是修复您的应用程序。
    • @BAE 请注意,这始终是一种权衡。如果您释放内存,下一个请求将明显变慢,因为它必须重新加载并重新计算之前保存在该内存中的所有内容。
    猜你喜欢
    • 1970-01-01
    • 2014-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-21
    • 1970-01-01
    • 2021-09-11
    • 1970-01-01
    相关资源
    最近更新 更多