python线程内存使用64位vs 32位

时间:2012-10-16 22:41:58

标签: python linux memory-management 64-bit python-multithreading

我有一个基本的python程序,可以制作大量的线程(2000),处理一些东西,然后写出来。

我已将我的代码缩小到与此类似(使用2k个线程): URL获取线程示例: http://www.ibm.com/developerworks/aix/library/au-threadingpython/

除了我的课程内部,我实际上什么都不做(从队列中获取项目,然后调用任务完成)。在这个缩小版本和我做事的版本中,内存使用情况都是一样的。在32位python解释器中,我使用大约105兆的虚拟内存。在64位,我使用超过8演出。

我正在运行rhel 6.我还补充说: threading.stack_size(32768) 减少堆栈大小我假设python正在获取一些内存的默认限制来保留,我只是无法弄清楚这个限制是什么。

有什么想法吗?

谢谢!

2 个答案:

答案 0 :(得分:2)

如果您使用的是RHEL6,或者您的glibc比2.10更新(您可以使用rpm -q glibc进行检查)。这是由于缺少MALLOC_ARENA_MAX。

在RHEL 6中,glibc(> = 2.10)的malloc有一个新的竞技场分配器,它允许每个线程能够分配自己的竞技场。并且可重复使用的竞技场的最大数量取决于核心数量。在64位系统上,这些竞技场是64M映射,16核系统的默认竞技场数量最多可达128.您可以轻松获得128 * 64MB = 8GB。因此,当使用多个线程时,它会导致大量的虚拟内存(VMS)(尽管RSS的增加可能完全正常。)

这可以通过设置env来解决。将MALLOC_ARENA_MAX变量为1或4之类的小数。

答案 1 :(得分:0)

如果你真的需要2k +线程,你会有兴趣阅读全球解释器锁(GIL):http://wiki.python.org/moin/GlobalInterpreterLock