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 从标准输入读取)。