【问题标题】:Why is uWSGI using more memory than Apache?为什么 uWSGI 使用的内存比 Apache 多?
【发布时间】:2012-07-24 10:30:28
【问题描述】:

我决定为我的 Django 应用程序尝试 NGINX/uWSGI,而不是 Apache/mod_wsgi。我尝试这样做的原因是我听说 NGINX/uWSGI 使用的内存更少,在高流量情况下表现更好,而且 NGINX 非常适合提供静态内容。

但是我发现 uWSGI 使用的 RAM 几乎是 Apache 的 5 倍。

ubuntu@domU-12-31-39-0A-9C-1A:~$ sudo ps_mem.py
 Private  +   Shared  =  RAM used       Program

184.0 KiB +  31.5 KiB = 215.5 KiB       atd
220.0 KiB +  94.0 KiB = 314.0 KiB       upstart-socket-bridge
260.0 KiB + 101.0 KiB = 361.0 KiB       upstart-udev-bridge
340.0 KiB +  63.0 KiB = 403.0 KiB       cron
392.0 KiB +  82.0 KiB = 474.0 KiB       sudo
560.0 KiB +  14.0 KiB = 574.0 KiB       dhclient3
612.0 KiB + 189.0 KiB = 801.0 KiB       getty (6)
816.0 KiB +  35.5 KiB = 851.5 KiB       dbus-daemon
660.0 KiB + 359.0 KiB =   1.0 MiB       udevd (3)
960.0 KiB +  74.0 KiB =   1.0 MiB       rsyslogd
  1.1 MiB +  38.5 KiB =   1.2 MiB       redis-server
  1.1 MiB + 146.5 KiB =   1.2 MiB       init
  1.7 MiB +   1.1 MiB =   2.9 MiB       nginx (3)
  1.3 MiB +   1.8 MiB =   3.1 MiB       sshd (3)
  7.5 MiB +  69.5 KiB =   7.6 MiB       bash
 14.4 MiB +   5.7 MiB =  20.1 MiB       apache2 (6)
 23.6 MiB + 113.0 KiB =  23.7 MiB       mysqld
 95.5 MiB +   8.6 MiB = 104.1 MiB       uwsgi (7)
---------------------------------
                        169.7 MiB
=================================

这是预期的吗?

我是否可能配置错误? (master=true,4 个工人)

您是否仅在服务器处于压力下时才看到好处?

【问题讨论】:

  • “你是否只看到服务器处于压力下的好处?”不仅仅是在启动时。
  • 这取决于配置。什么是 apache 服务?它有多少预先分叉的进程? Apache 是否预分叉?我很确定 uwsgi 使用的内存比 apache 少得多。但是没有给出实际的配置——你把苹果比作桃子..
  • Apache 正在使用 pre-fork。 5个过程。所以我收集到的是,这并不罕见,也没什么好担心的?

标签: django nginx uwsgi


【解决方案1】:

这一切都归结为配置。因为大部分内存来自胖 Python Web 应用程序,实际底层 WSGI 服务器内存使用通常贡献很小。

你应该去看我的 PyCon 演讲,我在其中讨论了这个特定问题,以及人们是如何被不同 WSGI 服务器解决方案使用的默认值所欺骗的。

http://lanyrd.com/2012/pycon/spcdg/

简而言之,Apache/mod_wsgi 将使用更多内存是一个误会。以与其他解决方案类似的方式对其进行配置,并且它将为相同的 Python Web 应用程序使用类似的内存。

【讨论】:

  • 谢谢。我明白我的问题太含糊了。谈话很有帮助。
【解决方案2】:

将下一条规则添加到项目 uWSGI .ini

limit memory per process 以 MB 为单位

limit-as=128

max requests: 达到 5k 请求时回收进程

max-requests=5000

【讨论】:

  • 旧答案,但我很好奇您的意见 - 当您的进程由于达到最大内存使用量/最大请求数而随机重新启动时,您的用户会不会得到不好的体验?
  • @Greg0ry 最坏的情况(当用户假设某些事情不正常时)处理重生并且必须从磁盘读取源(而不是 RAM 中的操作系统缓存)。 “用户假设”(在我的项目中)我的意思是他不是在 50-200 毫秒内而是在 500-2000 毫秒内得到答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-31
  • 2021-04-05
  • 2018-09-29
  • 1970-01-01
  • 2016-10-24
相关资源
最近更新 更多