8

我有Apache++mod_wsgi应用Django程序。mod_wsgi以守护程序模式运行。

我有一个视图,它从数据库中获取重要的查询集,并通过计算查询集的结果另外分配数组,然后返回这个数组。我没有使用线程本地存储、全局变量或类似的东西。

问题是我的应用程序占用的内存相对于我为 mod_wsgi 设置的线程数。

我通过在 mod_wsgi 中设置不同数量的线程然后通过 curl 检查 wsgi 进程可以内存爬升多远来达到我的视图,进行了小实验。

它是这样的:

1 个线程 - 256Mb
2 个线程 - 400Mb
3 个线程 - 535Mb
4 线程 - 650Mb

所以每个线程在最高内存使用量上增加了大约 120-140Mb。

我似乎永远不会释放为第一个请求分配的初始内存。在单线程场景中,当第二个请求(对同一视图)到达时,它会被重用。这样我就可以离开了。

但是当我使用多个线程时,当请求由以前从未运行过此请求的线程处理时,该线程会在本地某处“保存”另外 140mb。

  • 如何解决这个问题?
  • 可能 Django 在 TSL 中保存了一些数据。如果是这种情况,我该如何禁用它?
  • 或者,作为一种解决方法,是否可以将请求执行绑定到某个线程mod_wsgi

谢谢。

PS。DEBUG在中设置为 Falsesettings.py

4

1 回答 1

10

在这种情况下,您应该做的是垂直分区您的 Web 应用程序,以便它跨多个 mod_wsgi 守护进程组运行。这样,您可以根据您委派给每个的 URL 子集的要求定制 mod_wsgi 守护进程的配置。由于 Django 应用程序的管理界面 URL 通常具有较高的临时内存使用要求,但并不经常使用,因此可以建议这样做:

WSGIScriptAlias / /my/path/site/wsgi.py
WSGIApplicationGroup %{GLOBAL}

WSGIDaemonProcess main processes=3 threads=5
WSGIProcessGroup main

WSGIDaemonProcess admin threads=2 inactivity-timeout=60
<Location /admin>
WSGIProcessGroup admin
</Location>

所以它的作用是创建两个守护进程组。默认情况下,URL 将在进程持久存在的主守护进程组中处理。

然而,对于管理界面的 URL,它们将被定向到管理守护进程组,该进程组可以设置为具有减少线程数的单个进程,加上不活动超时,这样如果管理员可以自动重新启动该进程接口在 60 秒后未使用,从而回收任何过多的瞬态内存使用。

这意味着如果自上次以来进程已被回收,则向管理界面提交请求可能会稍微变慢,因为所有内容都必须再次加载,但由于它是管理界面而不是公共 URL,这通常是可以接受。

于 2013-10-22T14:08:11.333 回答