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

现在我使用 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行.每个任务的处理时间几乎线性地取决于行数,每个任务是独立的.

我有6核CPU和12个线程.因为处理时间可能不同,所以在运行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常用进程通信方式包括管道(pipe)、有名管道(FIFO)、...
Linux性能观测工具按类别可分为系统级别和进程级别,系统级别...
本文详细介绍了curl命令基础和高级用法,包括跳过https的证书...
本文包含作者工作中常用到的一些命令,用于诊断网络、磁盘占满...
linux的平均负载表示运行态和就绪态及不可中断状态(正在io)的...
CPU上下文频繁切换会导致系统性能下降,切换分为进程切换、线...