【问题标题】:Django occupying more memory with every requestDjango 每次请求都会占用更多内存
【发布时间】:2017-07-12 23:34:41
【问题描述】:

我的 Django 应用程序的许多视图都使用一个大模型 (900Mb) 来计算它们的输出。我想加载这个模型一次并与所有视图共享。我这样做的方式是在views.py 中加载模型,然后将模型用作全局变量。

with open('big_model.pkl','rb') as f:
  model = pickle.load(f)

def view1(request):
  out = model.compute(request)
  ...

def view2(request):
  out = model.compute(request)
  ...

我在 AWS beanstalk 上部署了我的 Django 应用程序。如果我在运行我的应用程序的实例上运行 top,我会在 1 个请求后看到以下内容:

Mem:   4048016k total,  2807496k used,  1240520k free,     3660k buffers
 PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                        
11530 wsgi      20   0 2817m 1.6g  30m S  0.0 41.9   0:04.63 httpd   

第二次请求后,出现另一个进程,占用了 1Gb 内存。

Mem:   4048016k total,  3941208k used,   106808k free,     2192k buffers
 PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                        
11530 wsgi      20   0 2817m 1.6g  29m S  0.0 41.9   0:04.63 httpd                          
11532 wsgi      20   0 2817m 1.6g  29m S  0.0 41.9   0:04.32 httpd 

这不会发生在我的本地机器上。有什么想法吗?

【问题讨论】:

    标签: python django amazon-elastic-beanstalk


    【解决方案1】:

    这个模块级全局是进程内的共享状态。在本地使用runserver,您将拥有一个具有多个线程的进程。在 EB 上,您可能有多个独立的进程,每个进程都有自己的副本。您无法控制哪个进程将处理每个传入请求。内存使用量不应随着每个请求而继续增加,而是应在每个进程在导入时创建其副本时最大化。您可以将 WSGI 服务器的并发性限制为具有多个线程的单个进程(如何取决于您使用的 WSGI 服务器)。这将减少您的内存使用量以及您的网站容量/性能。

    【讨论】:

      猜你喜欢
      • 2011-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-10
      • 2023-03-12
      • 2012-02-02
      • 1970-01-01
      相关资源
      最近更新 更多