Ubuntu18.04:GNU parallel 无法在本地系统上找到并使用全部内核
Ubuntu 18.04: GNU parallel can't find and use the full number of cores on a local system
我在 Ubuntu Linux 18.04.4 和 运行 作业上使用 GNU parallel(版本 20200522),在本地服务器的所有内核上减去 2 个内核,这就是我使用 -j-2 参数。
find /folder/ -type f -iname "*.pdf" | parallel -j-2 --nice 2 "script.sh {1} {1/.}; mv -f -v {1} /folder2/; mv -f {1/.}.txt /folder3/" :::: -
但是,程序显示
Error: Cannot run any jobs.
我尝试使用 -j100% 参数,我看到它只使用 1 个核心(作业),我推断,对于 GNU parallel,这个系统上 100% 的可用核心只是一个核心。
如果我使用 -j5 参数(这并不意味着自动检测内核总数),一切正常,并行启动 5 个作业并使用 5 个内核。
有趣的是文件 /root/.parallel/tmp/sshlogin/MACHINE_NAME/cpuspec 包含以下内容:
1
6
6
这意味着,我认为 GNU parallel 应该有 6 个可用内核。
我尝试删除 cpuspec 文件并再次 运行 并行以重新检测内核总数,但 cpuspec 文件和程序的行为保持不变。
在不同的系统上,删除 cpuspec 文件解决了所有问题,但在这个特定的系统上它不起作用。虚拟机是从另一台具有不同配置的服务器复制的,这就是为什么我需要删除 cpuspec 文件。
我应该怎么做才能让 GNU parallel 正确检测系统上的核心数,以便我可以使用 -j-2 参数?
21.07 更新:
再次删除包含 cpuspec 文件的文件夹、运行 并行 --number-of-sockets/cores/threads 命令并仅使用一次 -S 6/: 参数后,问题似乎自行解决。现在 GNU parallel 可以正确检测到内核数量,并且 -j-2 参数可以正常工作。
我不确定发生了什么好事,但我无法再重现该错误。
奥莱,谢谢你的回答。如果我再次遇到这个错误或者我能够重现它,我会post在这里。
下面是命令的输出:
parallel --number-of-sockets
1
parallel --number-of-cores
6
parallel --number-of-threads
6
cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 63
model name : Intel(R) Xeon(R) CPU E5-2620 v3 @ 2.40GHz
stepping : 2
microcode : 0xffffffff
cpu MHz : 2397.218
cache size : 15360 KB
physical id : 0
siblings : 6
core id : 0
cpu cores : 6
apicid : 0
initial apicid : 0
fpu : yes
fpu_exception : yes
cpuid level : 13
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx lm constant_tsc rep_good nopl cpuid pni pclmulqdq ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm abm pti fsgsbase bmi1 avx2 smep bmi2 erms xsaveopt
bugs : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs itlb_multihit
bogomips : 4794.43
clflush size : 64
cache_alignment : 64
address sizes : 42 bits physical, 48 bits virtual
power management:
And it repeats itself for 5 more cores.
您可能发现了一个错误。请post输出:
cat /proc/cpuinfo
parallel --number-of-sockets
parallel --number-of-cores
parallel --number-of-threads
也看看你能不能做一个MCVE。
作为解决方法,您可以使用 -S 6/:
强制 GNU Parallel 检测系统上的 6 个内核。
find /folder/ -type f -iname "*.pdf" |
parallel -S 6/: -j-2 --nice 2 "script.sh {1} {1/.}; mv -f -v {1} /folder2/; mv -f {1/.}.txt /folder3/"
(也可以完全省略 :::: -
:如果没有 :::: :::: 那么 GNU Parallel 从标准输入读取)。
我在 Ubuntu Linux 18.04.4 和 运行 作业上使用 GNU parallel(版本 20200522),在本地服务器的所有内核上减去 2 个内核,这就是我使用 -j-2 参数。
find /folder/ -type f -iname "*.pdf" | parallel -j-2 --nice 2 "script.sh {1} {1/.}; mv -f -v {1} /folder2/; mv -f {1/.}.txt /folder3/" :::: -
但是,程序显示
Error: Cannot run any jobs.
我尝试使用 -j100% 参数,我看到它只使用 1 个核心(作业),我推断,对于 GNU parallel,这个系统上 100% 的可用核心只是一个核心。
如果我使用 -j5 参数(这并不意味着自动检测内核总数),一切正常,并行启动 5 个作业并使用 5 个内核。
有趣的是文件 /root/.parallel/tmp/sshlogin/MACHINE_NAME/cpuspec 包含以下内容:
1
6
6
这意味着,我认为 GNU parallel 应该有 6 个可用内核。
我尝试删除 cpuspec 文件并再次 运行 并行以重新检测内核总数,但 cpuspec 文件和程序的行为保持不变。
在不同的系统上,删除 cpuspec 文件解决了所有问题,但在这个特定的系统上它不起作用。虚拟机是从另一台具有不同配置的服务器复制的,这就是为什么我需要删除 cpuspec 文件。
我应该怎么做才能让 GNU parallel 正确检测系统上的核心数,以便我可以使用 -j-2 参数?
21.07 更新: 再次删除包含 cpuspec 文件的文件夹、运行 并行 --number-of-sockets/cores/threads 命令并仅使用一次 -S 6/: 参数后,问题似乎自行解决。现在 GNU parallel 可以正确检测到内核数量,并且 -j-2 参数可以正常工作。 我不确定发生了什么好事,但我无法再重现该错误。 奥莱,谢谢你的回答。如果我再次遇到这个错误或者我能够重现它,我会post在这里。
下面是命令的输出:
parallel --number-of-sockets
1
parallel --number-of-cores
6
parallel --number-of-threads
6
cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 63
model name : Intel(R) Xeon(R) CPU E5-2620 v3 @ 2.40GHz
stepping : 2
microcode : 0xffffffff
cpu MHz : 2397.218
cache size : 15360 KB
physical id : 0
siblings : 6
core id : 0
cpu cores : 6
apicid : 0
initial apicid : 0
fpu : yes
fpu_exception : yes
cpuid level : 13
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx lm constant_tsc rep_good nopl cpuid pni pclmulqdq ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm abm pti fsgsbase bmi1 avx2 smep bmi2 erms xsaveopt
bugs : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs itlb_multihit
bogomips : 4794.43
clflush size : 64
cache_alignment : 64
address sizes : 42 bits physical, 48 bits virtual
power management:
And it repeats itself for 5 more cores.
您可能发现了一个错误。请post输出:
cat /proc/cpuinfo
parallel --number-of-sockets
parallel --number-of-cores
parallel --number-of-threads
也看看你能不能做一个MCVE。
作为解决方法,您可以使用 -S 6/:
强制 GNU Parallel 检测系统上的 6 个内核。
find /folder/ -type f -iname "*.pdf" |
parallel -S 6/: -j-2 --nice 2 "script.sh {1} {1/.}; mv -f -v {1} /folder2/; mv -f {1/.}.txt /folder3/"
(也可以完全省略 :::: -
:如果没有 :::: :::: 那么 GNU Parallel 从标准输入读取)。