为什么uWSGI使用比Apache更多的内存?

问题描述:

我决定尝试用我的Django应用程序代替Apache/mod_wsgi的NGINX/uWSGI。我尝试这样做的理由是,我听说NGINX/uWSGI使用较少的内存,在高流量情况下性能更好,NGINX非常适合静态内容。为什么uWSGI使用比Apache更多的内存?

但是我发现uWSGI使用的RAM比Apache多5倍。

[email protected]:~$ 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名工作人员)

当服务器处于压力下时,您是否只看到了好处?

+2

*“你只看到当利益服务器是否处于压力之下?“*我认为这是公平的打赌,你会在一些负载下看到差异,而不仅仅是在启动时。 – Marcin 2012-07-25 21:45:59

+0

这取决于配置。什么是Apache服务?它有多少预分叉过程?阿帕奇是否有预压?我很确定uwsgi比apache使用的内存少得多。但没有给出实际的配置 - 你将苹果与桃子进行比较.. – Tisho 2012-07-25 21:47:50

+0

Apache正在使用预分叉。 5个过程。所以我收集的是,这并不罕见,无需担心? – 2012-07-25 22:17:02

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

你应该去看看我的PyCon谈话,我将讲述这个特定的问题以及人们如何被不同的WSGI服务器解决方案所使用的默认设置所欺骗。

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

总之,这是一个有点阿帕奇/ mod_wsgi的会使用更多的内存mistruth的。将其配置为与其他解决方案相似的方式,并将相同的内存用于相同的Python Web应用程序。

+0

谢谢。我看到我的问题太模糊了。谈话很有帮助。 – 2012-07-26 04:35:10

旁的添加规则项目uWSGI以MB为单位的.ini

limit memory per process

limit-as=128 

max requests:回收过程中时达到5K要求

max-requests=5000 
+0

旧的答案,但我很好奇你的意见 - 你的用户不会得到不好的经历,当你的进程将随机重启,因为它达到了最大内存使用量/最大请求数量? – Greg0ry 2016-07-01 11:27:56

+0

@ Greg0ry最糟糕的情况(当用户认为某件事情不好时)处理respawn并且必须从磁盘读取源(而不是RAM中的OS缓存)。通过“用户承担”(在我的项目上),我的意思是他得到的答案不是50-200毫秒,而是500-2000毫秒。 – nk9 2016-07-13 13:22:04