如何在不使资源饱和的情况下在多核节点上获得合理的并行化?与许多其他类似问题一样,问题实际上是如何学习调整 GNU Parallel 以获得合理的性能。
在下面的示例中,我无法在不使资源饱和的情况下并行运行进程,或者在使用某些-j -N
选项后一切似乎都在一个 CPU 中运行。
从在多核机器上运行的 Bash 脚本内部,以下循环被传递给 GNU Parallel
for BAND in $(seq 1 "$BANDS") ;do
echo "gdalmerge_and_clean $VARIABLE $YEAR $BAND $OUTPUT_PIXEL_SIZE_X $OUTPUT_PIXEL_SIZE_Y"
done |parallel
然而,这会使机器饱和并减慢处理速度。
在man parallel
我读
--jobs -N
-j -N
--max-procs -N
-P -N从 CPU 线程数中减去 N。
并行运行这么多作业。如果评估的数字小于 1,则将使用 1。
另见:--线程数--核心数--套接字数
我试过使用
|parallel -j -3
但是,出于某种原因,这只使用了 40 个 CPU 中的一个。检查 [h]top,只有一个 CPU 被报告为高使用率,其余的减少到 0。不应该-j -3
使用“CPU 数量”- 3,这会例如37个CPU?
然后我延长了之前的电话
-j -3 --use-cores-instead-of-threads
盲目地这样做,我猜。我读过https://unix.stackexchange.com/a/114678/13011,我从集群的管理员那里知道我曾经运行过这样的并行作业,超线程被禁用了。这仍然在一个 CPU 中运行。
我现在正在尝试使用以下内容:
for BAND in $(seq 1 "$BANDS") ;do
echo "gdalmerge_and_clean $VARIABLE $YEAR $BAND $OUTPUT_PIXEL_SIZE_X $OUTPUT_PIXEL_SIZE_Y"
done |parallel -j 95%
或与|parallel -j 95% --use-cores-instead-of-threads
。
笔记
作为记录,这是批处理作业的一部分,通过 HTCondor 进行调度,每个作业都在一个单独的节点上运行,该节点有大约 40 个可用的物理 CPU。
上面,我只保留了必要的——完整的 for 循环管道parallel
是:
for BAND in $(seq 1 "$BANDS") ;do # Do not extract, unscale and merge if the scaled map exists already! SCALED_MAP="era5_and_land_${VARIABLE}_${YEAR}_band_${BAND}_merged_scaled.nc" MERGED_MAP="era5_and_land_${VARIABLE}_${YEAR}_band_${BAND}_merged.nc" if [ ! -f "${SCALED_MAP+set}" ] ;then echo "log $LOG_FILE Action=Merge, Output=$MERGED_MAP, Pixel >size=$OUTPUT_PIXEL_SIZE_X $OUTPUT_PIXEL_SIZE_Y, Timestamp=$(timestamp)" echo "gdalmerge_and_clean $VARIABLE $YEAR $BAND $OUTPUT_PIXEL_SIZE_X >$OUTPUT_PIXEL_SIZE_Y" else echo "warning "Scaled map "$SCALED_MAP" exists already! Skipping merging.-"" fi done |parallel -j 95% log "$LOG_FILE" "Action=Merge, End=$(timestamp)"
where `log` and `warning` are a custom functions
要对此进行调试,我建议您首先使用比
gdalmerge_and_clean
.尝试:
这是否正确地为每个 CPU 线程运行一项作业?
这是否为每 20 个 CPU 线程正确运行 19 个作业?
我的猜测是它
gdalmerge_and_clean
实际上在正确数量的实例中运行,但它取决于 I/O 并且正在等待它。因此,当 CPU 闲置等待时,您的磁盘或网络会被推到极限。您可以使用 验证启动的副本数是否正确
ps aux | grep gdalmerge_and_clean
。您可以查看您的磁盘是否正忙于
iostats -dkx 1
.