python的cpu\u count和linux的nproc命令有什么区别

2024-05-07 14:17:39 发布

您现在位置:Python中文网/ 问答频道 /正文

当我使用nproc时,我有18个cpu。 当我使用top命令然后按1时,我在屏幕上看到8cpu

实际上,在docker环境中,8CPU是正确的答案。 top命令和python cpu\u count()得到了正确的结果 nproc和/proc/cpuinfo得到错误的结果

我在下面做了一些测试

[log@xxx /home/log]
$python -c "import multiprocessing as mp;print(mp.cpu_count())"
8

[log@xxx /home/log]
$nproc
18

[log@xxx /home/log]
$cat /proc/cpuinfo | grep processor |wc -l
18

在python3.6.1的源代码中,我发现

文件:Modules/posixmodule.c

static PyObject *
os_cpu_count_impl(PyObject *module)
/*[clinic end generated code: output=5fc29463c3936a9c input=e7c8f4ba6dbbadd3]*/
{
    int ncpu = 0;
#ifdef MS_WINDOWS
    SYSTEM_INFO sysinfo;
    GetSystemInfo(&sysinfo);
    ncpu = sysinfo.dwNumberOfProcessors;
#elif defined(__hpux)
    ncpu = mpctl(MPC_GETNUMSPUS, NULL, NULL);
#elif defined(HAVE_SYSCONF) && defined(_SC_NPROCESSORS_ONLN)
    ncpu = sysconf(_SC_NPROCESSORS_ONLN);
#elif defined(__DragonFly__) || \
      defined(__OpenBSD__)   || \
      defined(__FreeBSD__)   || \
      defined(__NetBSD__)    || \
      defined(__APPLE__)
    int mib[2];
    size_t len = sizeof(ncpu);
    mib[0] = CTL_HW;
    mib[1] = HW_NCPU;
    if (sysctl(mib, 2, &ncpu, &len, NULL, 0) != 0) 
        ncpu = 0;
#endif
    if (ncpu >= 1) 
        return PyLong_FromLong(ncpu);
    else  
        Py_RETURN_NONE;
}

一段时间后,我发现“nproc”命令返回的cpu号可以在相同的docker环境中更改

有人能解释一下吗

[log@xxx /home/log]
$lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                32
On-line CPU(s) list:   8-15,18-21,24-31
Off-line CPU(s) list:  0-7,16,17,22,23
Thread(s) per core:    1
Core(s) per socket:    8
Socket(s):             2
NUMA node(s):          2
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 62
Model name:            Intel(R) Xeon(R) CPU E5-2650 v2 @ 2.60GHz
Stepping:              4
CPU MHz:               2599.841
BogoMIPS:              5206.20
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              20480K
NUMA node0 CPU(s):     0-7,16-23
NUMA node1 CPU(s):     8-15,24-31

[log@xxx /home/log]
$nproc
20

[log@xxx /home/log]
$python -c "import multiprocessing as mp;print(mp.cpu_count())"
8

[log@xxx /home/log]
$cat /proc/cpuinfo | grep processor |wc -l
20


Tags: 命令logcachehomecountmpproccpu