[torqueusers] set automatically a mem max ressources when the user submits a job with a nodes/cpu param

Gareth.Williams at csiro.au Gareth.Williams at csiro.au
Mon Sep 27 16:38:17 MDT 2010


> ok. but...I don't know perl or Python...perhaps when I will have a
> boring week-end, i will try it :)
> 
> thx for the tip!
> Guillaume

Hi Guillaume,

Here's a starting point for you.  It's a bit complicated - and it doesn't actually do anything.  It was written to force ncpus to be set to 1 (or unset or reject the job), but that content had been taken out and just the skeleton remains. It takes account of the command line arguments as well as embedded #PBS directives.  Nb. command line args override directives - and you can't readily override them with such a filter but you could reject the job and provide feedback.

You would need to add your memory request at:
# could add directives/content here
Say (for 2GB vmem per process(or) requested):
print "#PBS -l vmem=" . $np*2 . "GB\n";

Good luck,

Gareth

#!/usr/bin/env perl
use strict;
$^W = 1; # use warnings;
use Getopt::Long qw(:config pass_through); # for extracting -l options from ARGV
my $nodestring;
my $np_default = 1; # default number of ppn allocated in scheduling if not specified
my $np_header = 0;
my $ncpus_header = 0;
my @lresources = ();
my $lresource;
my $verbose = 0; # can embed line(s) with #verbose in script to turn verbosity up
my $debug = 0;
my $filter = 1;
my @savedargs = @ARGV;
print STDERR "qsub filter: filtering script through $0, to check resources requested\n" if $verbose;
# get requested resources from qsub args (which are also my args)
GetOptions('l=s' =>\@lresources);
foreach $lresource (@lresources) {
    print STDERR "qsub filter: in command line arguments found resourcestring '$lresource'\n" if $verbose;
    if ($lresource =~ /(?:^|,)nodes=([^,]+)/) {
        $np_header= &getnprocs($1); # np from nodes string
        print STDERR "  found nodestring '$1'\n" if $verbose > 1;
        print STDERR "  that would correspond to '$np_header' processes\n" if $verbose > 1;
    }
    if ($lresource =~ /(?:^|,)ncpus=(\d+)/) {
        $ncpus_header= $1; # ncpus if specified
        print STDERR "  found ncpus '$1'\n" if $verbose > 1;
        # this is the first opportunity to bail out if $ncpus_header >1
    }
}

my $head_done = 0; # only parse header - then add extra directives
my $np = $np_default;
my $ncpus  = 0;
my $lineno = 0;
my $header = "";
while (<STDIN>) {
    $lineno++;

    $debug = 1 if /^#debug/; # can embed line(s) with #debug to turn debug on
    $verbose++ if /^#verbose/; # can embed line(s) with #verbose in script to turn verbosity up
    $filter = 1 if /^#filter/; # can embed line(s) with #filter to turn filtering on
#    $filter = 0 if /^#nofilter/; # can embed line(s) with #nofilter to turn filtering off

    unless ($filter) { print; next }
    if ($head_done) { print; next } # do not filter after header
    if ($lineno == 1 and /^:/) { print; next } # skip special null command allowed in first line

    unless (/^ *#/ or /^ *$/) {
        $head_done=1;
        print STDERR "qsub filter: finished processing script header\n" if $verbose > 1;
        # could add directives/content here
    }
    $header .= $_;

    if (/^ *#PBS/) { # parse #PBS lines
        print STDERR "qsub filter: parsing a directive line:$_" if $verbose > 1;
        @ARGV = split; # reconstruct ARGV to use with GetOptions
        shift @ARGV; # drop #PBS sentinel
        @lresources = ();
        GetOptions('l=s' =>\@lresources);
        foreach $lresource (@lresources) {
            print STDERR "  found resourcestring '$lresource'\n" if $verbose > 1;
            if ($lresource =~ /(?:^|,)nodes=([^,]+)/) {
                $np = &getnprocs($1); # np from node string
                print STDERR "  found nodestring '$1'\n" if $verbose > 1;
                print STDERR "  that would correspond to '$np' processes\n" if $verbose > 1;
            }
            if ($lresource =~ /(?:^|,)ncpus=(\d+)/) {
                $ncpus = $1; # ncpus if specified
                print STDERR "  found ncpus '$1'\n" if $verbose > 1;
            }
        }
        @ARGV = ();
    }
    # could take action here...
    print;
}

sub getnprocs {
    my $nodestring = shift;
    my $nprocs = 0;
    my @chunks = split '\+', $nodestring; #nodestring like i:property+j:ppn=k+...
    foreach my $chunk (@chunks) {
        my ($nn, $np) = (1, $np_default);
        if ($chunk =~ /^(\d+)/) {
            $nn = $1;
        }
        if ($chunk =~ /ppn=(\d+)/) {
            $np = $1;
        }
        $nprocs += $nn*$np; # sum of  nodes*ppn  over chunks
    }
    return $nprocs;
}


More information about the torqueusers mailing list