什么使用了我的 python 进程的内存?(RSS 与 VMS)

gue*_*tli 10 python django memory-profiling

如果我执行 Python 解释器,它大约需要 111 MB:

>>> import psutil
>>> psutil.Process().memory_info()
pmem(rss=19451904, vms=111677440, shared=6905856, text=4096, lib=0, data=12062720, dirty=0)
Run Code Online (Sandbox Code Playgroud)

导入 django 后,它使用 641 MB

>>> import django
>>> django.setup()
>>> psutil.Process().memory_info()
pmem(rss=188219392, vms=641904640, shared=27406336, text=4096, lib=0, data=284606464, dirty=0)
Run Code Online (Sandbox Code Playgroud)

WSGI进程(已经执行了一些http请求)919 MByte:

>>> psutil.Process(13843).memory_info()
pmem(rss=228777984, vms=919306240, shared=16076800, text=610304, lib=0, data=485842944, dirty=0)
Run Code Online (Sandbox Code Playgroud)

我认为这太过分了。

我可以做什么来更详细地调查这个问题?内存被什么占用了?

背景:服务器上的内存有时会不足,oom-killer 会终止进程。

hee*_*ayl 11

您正在查看错误的属性:

  • rss是 Resident Set Size,即进程正在使用的实际物理内存
  • vms是虚拟内存大小,即进程正在使用的虚拟内存

内核允许进程获得内存的不同视图,进程认为它是系统中运行的唯一程序,这就是虚拟地址空间的用途。而实际上内核使用内存管理来同步进程之间的内存使用情况。另请注意,进程之间的共享库也会影响内存消耗。

关于 OOM 事件,请查看哪个进程被终止,并查看该进程正在做什么。例如,Linux 使用/proc/PID/oom_score跟踪每个进程的 OOM 分数来查找在 OOM 情况下要终止哪个进程 - 值越高表示选择的概率越高。Linux 根据不同的启发式设置该值,例如子进程的数量、运行时间、CPU 使用率、友好度等。您可以通过写入 来调整该过程/proc/PID/oom_score_adj

但不要影响OOM分数,尝试调试过程中的实际问题。像这样的内存分析器valgrind在这方面可能会有所帮助。