m7n's picture
first commit
d1ed09d
raw
history blame
1.47 kB
import math
import os
import sys
try:
import psutil
except ImportError:
psutil = None # type: ignore
__all__ = ("cpu_count", "CPU_COUNT")
def cpu_count():
"""Get the available CPU count for this system.
Takes the minimum value from the following locations:
- Total system cpus available on the host.
- CPU Affinity (if set)
- Cgroups limit (if set)
"""
count = os.cpu_count()
# Check CPU affinity if available
if psutil is not None:
try:
affinity_count = len(psutil.Process().cpu_affinity())
if affinity_count > 0:
count = min(count, affinity_count)
except Exception:
pass
# Check cgroups if available
if sys.platform == "linux":
# The directory name isn't standardized across linux distros, check both
for dirname in ["cpuacct,cpu", "cpu,cpuacct"]:
try:
with open("/sys/fs/cgroup/%s/cpu.cfs_quota_us" % dirname) as f:
quota = int(f.read())
with open("/sys/fs/cgroup/%s/cpu.cfs_period_us" % dirname) as f:
period = int(f.read())
# We round up on fractional CPUs
cgroups_count = math.ceil(quota / period)
if cgroups_count > 0:
count = min(count, cgroups_count)
break
except Exception:
pass
return count
CPU_COUNT = cpu_count()