#!/bin/sh # # Runs in the background on the server. This script keeps track of # the relative loads of the client machines, and specifies which machine(s) # should be handed new jobs, according to the following algorithm: # # For each machine listed in ${buildroot}/mlist, check whether its load # information has been updated in the last 15 seconds (should be updated by # the reportload script every 5 seconds). If so, then divide the number of # running jobs on the client by its weighting in mlist, and output the # machine(s) with the minimum value to ${buildroot}/ulist. # # Dividing by the weight has the effect of grouping machines with similar # job load (e.g. a weight of 5 will rank machines with job loads 0, 1, 2, 3, 4 # as the same; if the machines all had a weight of 1 then it would only # choose the machine with the least value of the job load, and would probably # choose a single machine most of the time). buildroot=/var/portbuild arches=$* sleep 60 while true; do for i in ${arches}; do mlist=${buildroot}/${i}/mlist unset DISPLAY min=99 set $(cat $mlist) while [ $# -gt 1 ]; do m=$1 l=$2 if (nc -w 5 $m infoseek > ${buildroot}/${i}/loads/$m < /dev/null); then num=$(awk '{print $1}' ${buildroot}/${i}/loads/$m) if [ "x$num" = "x" ]; then # logger "checkmachines: file ${buildroot}/${i}/loads/$m is empty" num=99 fi else # Don't ever want to list machines we couldn't connect to num=999 fi num=$(($num / $l)) if [ $num -lt $min ]; then mach=$m min=$num elif [ $num = $min ]; then mach="$mach $m" fi shift 2 done echo "$mach" > ${buildroot}/${i}/ulist done done