我正在Google Compute Engine上执行python并行CPU密集型任务。因此,我可以在其上运行的vCPU数量越多,速度越快。

我已经读到,创建一个大小大于可用vCPU数量的多处理池是没有意义的,这很有意义,因此我使用multiprocessing.dummy.Pool来确定multiprocessing.cpu_count()池的大小。

我正在使用gcloud Kubernetes Engine在Pod中运行此脚本,并在开发过程中在具有少于96个vCPU的计算机上进行了测试。自动确定的池大小似乎总是与vCPU的数量匹配。但是,在具有96个vCPU的计算机上运行它,multiprocessing.cpu_count()返回64,而不是96。我不在乎将大小手动设置为96,但是问题是,如果python不“了解”,我会从这32个vCPU中受益吗?他们?

该计算机是运行容器优化的操作系统(cos)的n1-highcpu-96(96个vCPU,86.4 GB内存)。 Python版本是3.6.3。

最佳答案

留言板上有一个答案,有人链接到该问题的注释中,但是,最好在此页面上找到答案以及一些解释。

简短的答案:在容器中,运行grep -c ^processor /proc/cpuinfo-此数字应与multiprocessing.cpu_count()一致。如果可以,您可以信任multiprocessing.cpu_count()

但是,AFAICT可以识别节点上的所有核心,并且完全忽略在Kubernetes部署YAML中设置的资源限制。例如,您的部署文件可能包含:

spec:
  containers:
  - image: IMAGENAME
    name: LABEL
    ports:
    - containerPort: 5000
    resources:
      limits:
        cpu: 100m
        memory: 400M
      requests:
        cpu: 50m
        memory: 200M

this article中,作者提供了以下功能,该功能遵守资源限制(不是请求):
import math
from pathlib import Path


def get_cpu_quota_within_docker():
    cpu_cores = None

    cfs_period = Path("/sys/fs/cgroup/cpu/cpu.cfs_period_us")
    cfs_quota = Path("/sys/fs/cgroup/cpu/cpu.cfs_quota_us")

    if cfs_period.exists() and cfs_quota.exists():
        # we are in a linux container with cpu quotas!
        with cfs_period.open('rb') as p, cfs_quota.open('rb') as q:
            p, q = int(p.read()), int(q.read())

            # get the cores allocated by dividing the quota
            # in microseconds by the period in microseconds
            cpu_cores = math.ceil(q / p) if q > 0 and p > 0 else None

    return cpu_cores

因此,对于示例YAML,该除法得出0.1,但是对ceil的调用的b / c则返回1.0。因此,您可能正在寻找类似以下内容(假设您已定义了上面定义的函数get_cpu_quota_within_docker):
import multiprocessing

from somewhere import get_cpu_quota_within_docker

docker_cpus = get_cpu_quota_within_docker()
cpu_count = docker_cpus if docker_cpus else multiprocessing.cpu_count()

08-07 19:32