[gridengine users] Formula to calculate job's priority

Jesse Becker beckerjes at mail.nih.gov
Wed May 1 15:20:11 UTC 2013


On Wed, May 01, 2013 at 08:21:17PM +0530, Sangamesh Banappa wrote:
>Hi,
>
>
>The cluster is configured with share based policy (user based) with equal shares (100 shares) for all.
>
>
>As per the below link:
>
>
>http://arc.liv.ac.uk/SGE/htmlman/htmlman5/sge_priority.html
>
>
>The job's priority is calculated as follows:
>
>
>prio    = weight_priority * npprio +
>                    weight_urgency  * nurg +
>                    weight_ticket   * ntckts


There's a bit more to this as well.  I wrote a small Perl script do help
me vizualize the calculation heriarchy (attached).  It needs the
GraphViz Perl module, and (obviously) outputs a .dot file which can be
converted into the image format of your choice.

Run it on a system that can call 'qconf', as it will attempt to pull in
your actual SGE settings for the chart.




-- 
Jesse Becker
NHGRI Linux support (Digicon Contractor)
-------------- next part --------------
#!/usr/bin/perl -w
# Scheduling tree grapher...

use strict;
use GraphViz;
use Carp;
use Data::Dumper;

my %replacements = (
	COLOR_COMPUTED => 'black',
	COLOR_CONFIG   => 'blue',
	COLOR_USER     => 'darkgreen',
	COLOR_FINAL    => 'red3',
);


my %qconf;

my $qconf_bin = "qconf";

my $graph_template = <<'END_TEMPLATE';
digraph priority {

//Colors:
//  COLOR_COMPUTED = computed
//  COLOR_CONFIG  = SGE configuration
//  COLOR_USER = User modifiable
//  COLOR_FINAL = Final priority

	style="invis";

	samehead=true;
	sametail=true;
	concentrate=true;
	rankdir="BT";
	center=true;
	//splines="polylines";

	urg        [ label="Urgency (urg)" ];
	tckts      [ label="Tickets (tckts)" ];

	npprior    [ label="Priority\n(npprior)" ];
	nurg       [ label="Urgency\n(nurg)" ];
	ntckts     [ label="Tickets\n(ntckts)" ];

	prio       [ label="Final Priority\n(prior)" shape="box" color=COLOR_FINAL ];

	rrcontr    [ label="Resource\nRequirement\n(rrcontr)"  color=COLOR_CONFIG ];
	wtcontr    [ label="Wait time\nRequirement\n(wtcontr)" color=COLOR_CONFIG ];
	dlcontr    [ label="Deadline\nRequirement\n(dlcontr)"  color=COLOR_CONFIG ];
	
	hhr        [ label="Hard resource\nrequest\n(hhr)" color=COLOR_USER ];
	wait_time  [ label="Waiting time\n(wait_time)"           color=COLOR_USER ];
	deadline   [ label="Deadline time\n(deadline)"          color=COLOR_USER ];
	
	stckt      [ label="Share Tickets\nWEIGHT_TICKETS_SHARE\n(stkct)"           color=COLOR_CONFIG ];
	ftckt      [ label="Functional Tickets\nWEIGHT_TICKETS_FUNCTIONAL\n(ftkct)" color=COLOR_CONFIG ];
	otckt      [ label="Override Tickets\nTICKETS_OVERRIDE\n(otckt)"            color=COLOR_CONFIG ];
	
	pprio      [ label="User set\nPriority\n(pprio)" color=COLOR_USER ];
	
	
	subgraph cluster_urgency_sources { 
		rank="same";
		wait_time;
		deadline;
		hhr;
	} 
	
	subgraph cluster_priority_sources {
		rank="source";
	}
	
	subgraph cluster_urgency {
		rrcontr -> urg;
		wtcontr -> urg;
		dlcontr -> urg;
		
		wait_time -> wtcontr [ label="Weighted\nby WEIGHT_WAITING_TIME" ];
		deadline  -> dlcontr [ label="Deadline weight (WEIGHT_DEADLINE) /\nTime left" ];
		
		hhr -> rrcontr       [ label="Resource\nurgency" color=COLOR_CONFIG ];
		//hhr -> rrcontr       [ label="Cumulative\n* # slots" ];
	}

/* 
	subgraph ticket_sources {
		jobs_ftckt -> ftckt ;
		user_ftckt -> ftckt ;
		project_ftckt -> ftckt ;
		dept_ftckt -> ftckt ;

		jobs_stckt -> stckt ;
		user_stckt -> stckt ;
		project_stckt -> stckt ;
		dept_stckt -> stckt ;
	}
*/
	subgraph cluster_tickets {
		ftckt -> tckts;
		otckt -> tckts;
		stckt -> tckts;
	}

	subgraph cluster_summation {
		npprior -> prio ;
		nurg    -> prio ;
		ntckts  -> prio ; 
	}

	subgraph cluster_normalized {
		pprio -> npprior [ label="(normalize)\nWeight=WEIGHT_PRIORITY" ];
		urg   -> nurg    [ label="(normalize)\nWeight=WEIGHT_URGENCY" ];
		tckts -> ntckts  [ label="(normalize)\nWeight=WEIGHT_TICKET" ];
	}
		
}
END_TEMPLATE

#########################################################################
#########################################################################
sub HumanTime {
	
	my $sec=shift;
	my ($min,$hour,$day);

	$min = int ( $sec / 60 );
	$hour = int ( $min / 60 );
	$day = int ( $hour / 24 );
	
	$sec %= 60;
	$min %= 60;
	$hour %= 24;

	my $t = '';
	
	$t  = $day.'d ' if ($day);
	$t .= sprintf ('%02d:%02d:02d', $hour,$min,$day);

	return $t;
}
#########################################################################


foreach my $config_option ( qw (-ssconf -sconf) ) {

	open ( QCONF , "$qconf_bin $config_option |") || croak "Failed to run qconf: $!";

	my ($key,$value);
	while (my $line = <QCONF>) {

		next if $line =~ /^\s*$/;

		chomp $line;
		#print STDERR "[$line]\n";
		
		
		if ( $line =~ /^(\S+)\s+([^\\]+)(?: \\)?/ ) {
		
			$qconf{$key} = $value if defined $value;
			($key,$value) = ($1,$2);
		
		} elsif ( $line =~ /^\s+(.+)/) { 
		
			$value .= $1;			
		
		} 
	}
	close QCONF;

	$qconf{$key} = $value;
}

my (@active_users, $override_tickets, $functional_tickets);
open ( QCONF , "$qconf_bin -suserl|") || croak "Failed to run qconf: $!";
@active_users=<QCONF>;
close QCONF;

$override_tickets = $functional_tickets = 0;
foreach my $user (@active_users) {
	open ( QCONF , "$qconf_bin -suserl|") || croak "Failed to run qconf: $!";
	while (<QCONF>) {
		if (/^oticket\s+(\d+)/) {
			$override_tickets+=$1;
			next;
		}
		if (/^fticket\s+(\d+)/) {
			$functional_tickets+=$1;
			next;
		}
	}
	close QCONF;
	
}

$replacements{TICKETS_OVERRIDE}=$override_tickets;



# Clean up some of the data before replacements
foreach (grep (/weight/, keys %qconf)) {
	if ($qconf{$_} =~ /^-?0*\d+(\.\d+)$/) {
		$replacements{uc($_)} = sprintf "%.2f", $qconf{$_};
	} else {
		$replacements{uc($_)} = $qconf{$_};
	}
}




my $output = $graph_template;
study $output;

#print STDERR Dumper(\%replacements);
foreach my $key (keys %replacements) {
	$output =~ s/$key/$replacements{$key}/gmsx;
}


print $output;


####################################################################
####################################################################
####################################################################
####################################################################
####################################################################

#
#
#my $g=GraphViz->new(
#	directed => 1,
#	layout => 'dot', 
#	style => 'invis',
#	samehead => 'true',
#	sametail => 'true',
#	concentrate => 'true',
#	rankdir => 0,
#	center => 'true',
#	splines => 'polylines',
#	overlap => 'false', 
#);
#
#my %nodes =( 
#	wait_time => { 
#		label    => 'Waiting time',
#		type     => 'user',
#		cluster  => 
#		},
#	deadline => { 
#		label => 'Deadline time',
#		type => 'user', 
#		cluster  => 
#		},
#	hhr => { 
#		label => "Hard Resource\nRequest",
#		type => 'user', 
#		cluster  => 
#		},
#
#	pprio => { 
#		label => 'User Priority',
#		type => 'user',
#		cluster  => 
#		},
#
#	wait_time => { 
#		label => 'Waiting time',
#		type => 'user', 
#		cluster  => 
#		},
#	deadline => { 
#		label => 'Deadline time',
#		type => 'user', 
#		cluster  => 
#		},
#	hhr => { 
#		label => "Hard Resource\nRequest",
#		type => 'user', 
#		cluster  => 
#		},
#);
#
#
#sub print_header {
#	return <<END_HEADER
#digraph priority {
#
#//Colors:
#//  $color{computed} = computed
#//  $color{config}  = SGE configuration
#//  $color{user} = User modifiable
#
#
#	style="invis";
#
#	samehead=true;
#	sametail=true;
#	concentrate=true;
#	rankdir="BT";
#	center=true;
#	splines="polylines";
#
#END_HEADER
#
#}

#########################################################



More information about the users mailing list