gpt4 book ai didi

linux - 如何在Linux中控制并行任务以避免过多的上下文切换

转载 作者:IT王子 更新时间:2023-10-29 00:41:52 25 4
gpt4 key购买 nike

现在我正在使用 Linux 执行以下任务:

while read parameter
do
./program_a $parameter $parameter.log 2>&1 &
done < parameter_file

每个参数都是指要处理的文件名。每个文件包含不同数量的要处理的行。

例如:
参数文件包含:

File_A
File_B
File_C

File_A包含1k行,File_B包含10k行,File_C包含1000k行,也就是说上面的脚本program_a分别同时处理了1000行、10k行和1000k行。每个任务的处理时间几乎与行数成线性关系,并且每个任务都是独立的。

我有 12 个线程的 6 核 CPU。由于处理时间可能不同,因此在运行 File_A 和 File_B 的任务后,只有一个内核会处理 File_C 的任务。这是在浪费资源。

我想将每个文件拆分为 1k 行并同时运行它们。但是对于这个例子,将有 1011 个任务在运行(每个任务 1k)。我认为这会导致严重的过度上下文切换问题。也许我可以调整每行中的数字来解决这个问题,但我认为这不是一个好的解决方案。

我的想法是将运行的任务限制为 6 个任务,这意味着始终使用最大数量的内核来运行并将上下文切换减少到尽可能少。但我不知道如何修改我的脚本来实现这个目标。谁能给我一些建议?

最佳答案

我不会尝试通过拆分文件来重新发明负载平衡轮。使用 gnu parallel 来处理不同规模任务的管理。它有很多选项可以在一台或多台机器上并行执行。例如,如果您将其设置为允许 4 个并行进程,它将执行此操作,并在较短的任务完成时启动新任务。

https://www.gnu.org/software/parallel/

https://www.gnu.org/software/parallel/parallel_tutorial.html

这是一个使用 cat 作为 ./program 的替代品的简单示例:

...write a couple of files
% cat > a
a
b
c

% cat > b
a
b
c
d

% cat > files
a
b

... run the tasks
% parallel cat {1} \> {1}.log < files

% more b.log
a
b
c
d

关于linux - 如何在Linux中控制并行任务以避免过多的上下文切换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20603639/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com