gpt4 book ai didi

python - 由 Python 多处理 fork 的空 python 进程的私有(private)内存

转载 作者:太空宇宙 更新时间:2023-11-03 17:28:22 29 4
gpt4 key购买 nike

我正在通过 Python 多处理创建多个子进程,但这些子进程使用大量堆私有(private)内存,即使它们是空进程也是如此。当在启用了 THP(透明大页)的 RHEL 上运行时,这种情况会变得更糟。

  • 空子进程的堆私有(private)内存中有什么?
  • 在Linux COW(写时复制)下,子进程不应该共享所有内存,因为它不创建/修改任何内存页面吗?或者子进程是尝试修改/写入内存页面,那么它尝试的数据类型修改/写入?
  • 或者是由于 python 对象引用计数之类的原因?

这是一个演示此功能的简单示例:

import os
import multiprocessing

print parent process's heap memory in /proc/<pid>/smaps

def emptyProcess():
print child process's heap memory in /proc/<pid>/smaps
return

multiprocessing.Process(name='p1', target=emptyProcess).start()

输出:

parent:  pid: 20920:   rss:8228864, shr:2781184, priv:5447680, swap:0, pss:6154240

child: pid: 20921: rss:6397952, shr:5472256, priv:925696, swap:0, pss:3381248

子进程的私有(private)内存中有什么(925696B,或堆中的 664KB)?

父进程堆内存:

006cc000-00be4000 rw-p 00000000 00:00 0 [heap]

Size: 5216 kB

Rss: 4120 kB

Pss: 4120 kB

Shared_Dirty: 0 kB

Private_Dirty: 4120 kB

Referenced: 4120 kB

Anonymous: 4120 kB

AnonHugePages: 0 kB

KernelPageSize: 4 kB

子进程堆内存:

006cc000-00be4000 rw-p 00000000 00:00 0 [heap]

Size: 5216 kB

Rss: 4396 kB

Pss: 2530 kB

Shared_Dirty: 3732 kB

Private_Dirty: 664 kB

Referenced: 676 kB

Anonymous: 4396 kB

AnonHugePages: 0 kB

KernelPageSize: 4 kB

最佳答案

每个进程中的主要内容之一是 Python 解释器/VM。如果这是一个 C 程序,您会看到截然不同的情况,但即使使用“空”Python 进程,您仍然会产生解释器的开销,除非您使用线程。每个 Python 解释器都有一 block 堆、堆栈和代码,Python 的多处理是 Linux 进程的包装器(据我所知);所以基本上你正在处理fork()。 Fork 一个新进程意味着你得到一个新的 Python 解释器。尽管操作系统在写入时复制方面非常智能,但 Python 解释器的开销会增加。

我的建议是尝试 Python 线程,或者将其切换为非解释语言以减少进程开销。

关于python - 由 Python 多处理 fork 的空 python 进程的私有(private)内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32262522/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com