繁体   English   中英

Python多处理分叉的空python进程的私有内存

[英]private memory of an empty python process forked by Python multiprocessing

我正在通过Python多处理创建多个子进程,但是这些子进程即使在为空进程时也会占用大量堆专用内存。 在启用了THP(透明大页面)的RHEL上运行时,这种情况变得越来越糟。

  • 空子进程的堆专用内存中有什么?
  • 在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

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

父进程堆内存:

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

大小:5216 kB

Rss:4120 kB

pss:4120 kB

Shared_Dirty:0 kB

私人肮脏:4120 kB

参考:4120 kB

匿名:4120 kB

页面数:0 kB

内核页面大小:4 kB

子进程堆内存:

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

大小:5216 kB

Rss:4396 kB

积分:2530 kB

Shared_Dirty:3732 kB

私人_脏:664 kB

参考:676 kB

匿名:4396 kB

页面数:0 kB

内核页面大小:4 kB

每个过程中的主要内容之一是Python解释器/ VM。 如果这是C程序,您会看到截然不同的画面,但是即使使用“空” Python进程,除非使用线程,否则仍会产生解释器的开销。 每个Python解释器都有大量的堆,堆栈和代码,Python的多重处理是Linux进程的包装(据我所知)。 所以基本上您正在处理fork() 分叉新进程意味着您将获得一个新的Python解释器。 即使操作系统对于“写时复制”非常聪明,但Python解释器的开销还是会增加的。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM