【问题标题】:python threading memory usage 64 bit vs 32 bitpython线程内存使用64位与32位
【发布时间】:2012-10-16 22:41:57
【问题描述】:

我有一个基本的 Python 程序,它可以创建大量线程 (2000),处理某些内容,然后将其写出。

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

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

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

有什么想法吗?

谢谢!

【问题讨论】:

  • 您为什么关心虚拟使用? RSS 值是多少?
  • 我知道这不是“真正的”内存使用,但我想知道为什么。 RSS 相当低,只有几兆。
  • python 中的列表为项目保留空间,也许这就是问题所在?

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


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    如果您确实需要 2k+ 线程,您将有兴趣了解全局解释器锁 (GIL):http://wiki.python.org/moin/GlobalInterpreterLock

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-28
      • 1970-01-01
      • 2014-12-17
      • 2013-06-21
      • 1970-01-01
      • 1970-01-01
      • 2011-09-03
      • 2013-08-19
      相关资源
      最近更新 更多