Python 线程内存使用情况 64 位与 32 位



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

我已经缩小了我的代码范围,类似于这个(有 2k 线程):网址提取线程示例:http://www.ibm.com/developerworks/aix/library/au-threadingpython/

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

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

有什么想法吗?

谢谢!

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

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

这可以通过将 env. 变量MALLOC_ARENA_MAX设置为较小的数字(如 1 或 4)来解决。

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

最新更新