X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=python%2Fcpulimit.py;fp=python%2Fcpulimit.py;h=708f09259654fe7317bcc55d5b4f6422d6586ed4;hb=df355f88a5a42ff138930edc607d2d3538d140e5;hp=0000000000000000000000000000000000000000;hpb=73929cd988b29cc673ff12945fc921957bd3ce78;p=util-vserver-pl.git diff --git a/python/cpulimit.py b/python/cpulimit.py new file mode 100755 index 0000000..708f092 --- /dev/null +++ b/python/cpulimit.py @@ -0,0 +1,117 @@ +#!/usr/bin/python2 -u + +import sys, os, re, string + + +TCBASE="/rcfs/taskclass/" +RULES="/rcfs/ce/rules/" + +SYSCLASS=TCBASE + "system" +SYSRULE=RULES + "system" +SYSCPUSHARE=100 +DEFAULTMAXCPUSHARE=8192 + +def checkckrm(): + checks = [ "/rcfs", TCBASE, RULES ] + + for check in checks: + try: + answer = os.stat(check) + except: + print "%s does not exist" % check + return False + + return True + +def checkclass(tc): + try: + answer = os.stat(TCBASE + tc) + return True + + except: + print "%s class does not exist" % tc + return False + +def getxid(name): + xid = -1 + fp = open('/etc/passwd') + for line in fp.readlines(): + rec = string.splitfields(line,':') + if rec[0] == name: + xid = int(rec[2]) + break + + fp.close() + + if xid == -1: + # raise an exception + pass + + return xid + +def write(filename,s): + fp = os.open(filename,os.O_WRONLY|os.O_CREAT) + os.write(fp,s) + os.close(fp) + +def vs2ckrm_on(tc): + xid = getxid(tc) + + try: + os.mkdir(TCBASE + tc) + except OSError: + pass # ignore oserror for file exists + + s = "xid=%d,class=%s" % (xid,TCBASE+tc) + fname = RULES + tc + write(fname, s) + +def vs2ckrm_off(tc): + fname = TCBASE + tc + "/members" + for i in range(1,15): + fp = open(fname) + lines = fp.readlines() + try: + lines.remove("No data to display\n") + except ValueError: + pass + if len(lines) == 0: + try: + answer = os.stat(RULES + tc) + os.unlink(RULES + tc) + answer = os.stat(TCBASE + tc) + os.rmdir(TCBASE + tc) + except: + pass + break + + else: + print "enter context 1 and kill processes", lines + + +def cpulimit(tc,limit): + global TCBASE + + fname = TCBASE + tc + "/shares" + s = "res=cpu,guarantee=%d\n" % limit + write(fname,s) + +def cpuinit(): + global TCBASE + + fname = TCBASE + "shares" + s = "res=cpu,total_guarantee=%d\n" % DEFAULTMAXCPUSHARE + write(fname,s) + +if __name__ == "__main__": + try: + name = sys.argv[1] + limit = int(sys.argv[2]) + except: + print "caught exception" + + if checkckrm() is True: + cpuinit() + vs2ckrm_on(name) + cpulimit(name,limit) + vs2ckrm_off(name)