Получу ли я пользу от 96 виртуальных ЦП gcloud Compute Engine, если в python multiprocessing.cpu_count () возвращает 64? - PullRequest
0 голосов
/ 22 мая 2018

Я запускаю задачу интенсивного использования параллельного процессора Python в Google Compute Engine.Следовательно, чем больше количество виртуальных процессоров, на которых я могу его запустить, тем выше скорость.

Я читал, что нет смысла создавать многопроцессорный пул с большим размером, чем количество доступных виртуальных процессоров, чтоИмеет смысл, поэтому я определяю размер моего multiprocessing.dummy.Pool пула, используя multiprocessing.cpu_count().

. Я запускаю этот скрипт в модуле Pod, используя gcloud Kubernetes Engine, и тестировал на машинах с менее чем 96 виртуальными ЦП во время разработки.,Казалось, что автоматически определяемый размер пула всегда соответствует количеству виртуальных ЦП.Тем не менее, если запустить его на машине с 96 виртуальными ЦП, multiprocessing.cpu_count() возвращает 64, а не 96. Мне все равно, если вручную установить этот размер на 96, но вопрос в том, выиграю ли я от этих дополнительных 32 виртуальных ЦП, если Python не «знает»«из них?

Машина представляет собой n1-highcpu-96 (96 виртуальных ЦП, 86,4 ГБ памяти) с ОС, оптимизированной для работы с контейнерами (cos).Версия Python 3.6.3.

1 Ответ

0 голосов
/ 01 августа 2019

На доске объявлений есть ответ, с которым кто-то связался в комментарии к вопросу, однако, как представляется, лучше иметь ответ на этой странице, а также некоторое объяснение.

Краткий ответвнутри капсулы запустите grep -c ^processor /proc/cpuinfo - это число должно совпадать с multiprocessing.cpu_count().Если это произойдет, вы можете доверять multiprocessing.cpu_count().

Однако, AFAICT, он идентифицирует все ядра на узле и полностью игнорирует ограничения ресурсов, установленные в YAML вашего развертывания в Kubernetes.Например, ваш файл развертывания может содержать:

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

В этой статье автор предоставляет следующую функцию, которая учитывает ресурс limit (не запросы):

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, но b / c вызова ceil возвращает 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...