我试图了解一个简单的作业消耗多少内存(基于这个Python脚本)。我在分配了不同数量的核心的单个工作线程上运行相同的脚本。
这个小测试的结果是:
$ sacct -j 875,876,877,878,879,880 --format=JobID,reqcpus,elapsed,MaxRSS,maxvmsize
JobID ReqCPUS Elapsed MaxRSS MaxVMSize
------------ -------- ---------- ---------- ----------
875 1 00:03:24
875.batch 1 00:03:24 33584K 254884K
876 2 00:01:52
876.batch 2 00:01:52 43560K 274124K
877 4 00:01:09
877.batch 4 00:01:09 66672K 311580K
878 8 00:00:38
878.batch 8 00:00:38 111636K 385468K
879 16 00:00:20
879.batch 16 00:00:20 1308K 79660K
880 32 00:00:11
880.batch 32 00:00:11 1488K 79792K
这基本上没问题,我希望如果我使用更多核心,时间会更短。我不太明白的是为什么 MaxRSS 和 MaxVMSize 随着核心数量的增加而增加,但随后突然下降。
有人知道这是怎么回事吗?
内存使用量会随着 CPU 数量的增加而增加,这是预料之中的,因为
multiprocessing
包依赖于 forking,在 Python 上下文中,由于引用计数,它在大多数情况下都会重复内存,并且 multiprocessing
默认情况下,通过pickling 信息和发送数据副本来管理内存共享。 当
ReqCPUS>8
时它减少的事实很可能是由于Slurm以采样间隔计算内存使用量,默认情况下是
30
(用scontrol show config|grep JobAcctGatherFrequency
检查)似乎在你的情况下,用ReqCPUS>8
,Elapsed
是 <30s
,因此您最终会得到在作业开始时进行的内存测量,并不代表实际使用情况。