如何在系统不忙时在Linux中调度任务

时间:2013-12-18 10:37:01

标签: linux multithreading bash shell unix

我正在使用12核24线程Linux机器来执行以下任务。每项任务都是独立的。

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

但是这段代码会一次性调度所有任务,这可能会导致严重的上下文切换缺少空闲的CPU功率和/或内存不足。

我想利用系统信息工具,例如免费顶部 ps 来确定是否应该调度任务。

使用免费

while read parameter
do
    #for instance using free
    free_mem=`free -g | grep Mem | awk '{print $4}'`
    if [ $free_mem -gt 10]; then
        ./program_a $parameter $parameter.log 2>&1 &
    fi
done < parameter_file

但这不起作用,因为这不会等到条件达到标准。我该怎么做?

此外,我应该如何使用顶部 ps 来确定系统是否正忙。我想在系统太忙时发送新任务。

也许我可以使用

ps aux | grep "program_a " | grep -v "grep" | wc -l

限制调度任务的数量。但这是确定系统是否繁忙的隐含方式。还有其他想法吗?

1 个答案:

答案 0 :(得分:1)

while read parameter
do
    #for instance using free
    while 1; do
      free_mem=`free -g | awk '/Mem/{print $4}'`
      if (( $free_mem > 10 )); then
        break
      fi
      sleep 1 # wait so that some tasks might finish
    done
    ./program_a $parameter $parameter.log 2>&1 &    
done < parameter_file