将我们的 Web 服务器从 Debian 迁移到 Ubuntu 后,我们注意到 uWSGI 主进程和工作进程使用的内存量 (RSS) 大幅增加。uWSGI 版本 (1.9.13) 保持不变。
我使用 pmap 检查了每个进程的内存使用情况。在 Debian 下,主进程如下所示:
Address RSS Dirty Mode Mapping
---------------- ------ ------ ------
kB 15976 11316
0000000001a880000 7308 7308 rw--- [anon
400000 1608 0 r-x-- uwsgi
00007ff16c5a70000 772 772 rw--- [anon
00007ff176c3a0000 668 0 r-x-- libcrypto.so.0.9.8
00007ff175f010000 548 0 r-x-- libc-2.11.3.so
00007ff177fc70000 512 512 rw--- [anon
00007ff17807b0000 512 512 rw--- [anon
00007ff1759e50000 356 0 r-x-- libstdc++.so.6.0.13
80 268 184 rw--- uwsgi
我只显示最相关的内存块,RSS 下的数字以千字节为单位。
而现在,Ubuntu 下 uWSGI 已经为自己分配了更多的内存。
Address RSS Dirty Mode Mapping
---------------- ------ ------ ------
kB 24216 19196
2401000 15508 15508 rw--- [ anon ]
00007f3094e86000 1648 0 r-x-- libpython2.7.so.1.0
00007f308c6ce000 772 772 rw--- [ anon ]
00007f3094abe000 680 0 r-x-- libc-2.17.so
00007f309595d000 612 0 r-x-- libcrypto.so.1.0.0
00007f3096de4000 512 512 rw--- [ anon ]
00007f3096e67000 512 512 rw--- [ anon ]
400000 480 0 r-x-- uwsgi
00007f30945b3000 352 0 r-x-- libstdc++.so.6.0.17
00007f309532e000 340 248 rw--- libpython2.7.so.1.0
这些主进程中加载的应用程序的配置和类型在其他方面是相同的。Debian 的内核版本为 2.6.32-5-xen-amd64,Ubuntu 的内核版本为 3.8.0-19-generic。
有人知道为什么每个主机都要给自己分配另外 8MB 的内存吗?
答案1
发现问题,Ubuntu自带的系统版本Python2.7导致uWSGI进程占用内存较多,编译新版本的Python,用新版本启动uWSGI Emperor,问题解决。
在 Ubuntu 13.04 上使用以下命令可以编译 Python 并安装 uWSGI。
wget http://python.org/ftp/python/2.7.5/Python-2.7.5.tar.bz2
tar jxf Python-2.7.5.tar.bz2
cd Python-2.7.5/
./configure --prefix=/opt/python2.7.5 && make && make install
cd /opt/python2.7.5/
curl -O http://python-distribute.org/distribute_setup.py
bin/python2.7 distribute_setup.py
bin/easy_install-2.7 pip
bin/pip-2.7 install uwsgi