Python / WSGI:跨安装动态地启动/关闭服务器工作进程

时间:2013-12-22 14:41:54

标签: python django wsgi

设置

我们的设置在以下方面是独一无二的:

  • 我们在一台服务器上安装了大量不同的Django。
  • 每个都有自己的代码库,甚至作为单独的linux用户运行。 (目前使用Apache mod_wsgi实现,每个安装在nginx代理后面配置了少量线程(2-5))。
  • 每个安装都有很大的内存占用(20 - 200 MB)
  • 这些安装是“网络应用程序” - 它们不会暴露于一般网络,并且将被有限的nr使用。用户(1 - 100)。
  • 预计每次安装的流量(小)突发。即如果使用某个安装,则预期该安装会有许多后续请求(而不是其他安装)。

由于这些进程中的每一个都有可能在20到200 MB的内存之间运行,因此Django进程的总内存占用量“太大”。即它会快速超过服务器上的可用物理内存,从而导致大量交换。

我看到当前设置有两个具体问题:

  • 我们正在考虑哪些安装需要在操作系统的物理内存中。在我看来,我们可以做得更好。具体来说,当前获得更多流量的安装会因为大量的现成工作人员而变得更好。另外:即使后续请求足够快,我们也可以处理初始请求的1-2s,因此在大量时间内没有流量的安装甚至可以使用0个就绪工作人员。我认为我们可以“比操作系统更智能”的一个特定原因:服务器在缓慢的一天重新启动后,服务器响应速度更快(差异非常大,可以用肉眼观察到)。这对我来说,即使他们当前没有活跃地为一整天的请求提供服务,大概交换过程的开销也很大。

  • 某些请求比其他请求具有更大的内存需求。曾经处理过这样一个请求的进程已经从操作系统中获取了内存,但是由于分段可能无法返回它。能够退休记忆猪是值得的。 (Currenlty我们只是在Apache上配置了一个retart-after-n-requests,但这不是在碎片后特别触发的。)

问题:

我的解决方案的想法是让主服务器根据流量方面的每个安装需求,每个安装启动/减少工作人员。进一步的细节: *配置一些一般的系统约束,即一旦服务器变得繁忙,在启动过程中就不那么慷慨了 *重启记忆猪。

有许多python(WSGI)服务器可用。他们中的哪一个(容易)允许这样的设置。什么是好的指针?

1 个答案:

答案 0 :(得分:1)

查看uWSGI是否适合您。我认为没有更灵活的东西。

你可以让它动态生成并杀死工人,设置最大内存使用量等。或者你可以在阅读docs后获得更好的想法。