当我使用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
目前没有回答
相关问题 更多 >
编程相关推荐