На доске объявлений есть ответ, с которым кто-то связался в комментарии к вопросу, однако, как представляется, лучше иметь ответ на этой странице, а также некоторое объяснение.
Краткий ответвнутри капсулы запустите 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()