|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
由于在linux中,用户权限很大,做任何事情都很自由,所以,你往往需要知道你做的每一步在干什么。
比来在做的是假造化相干的一个demo,扳连到假造化情况下的服务器负载平衡。我们用到一个复杂的case,就是在负载呈现“不屈衡”的时分,举行livemigration。因为只是demo必要,我们的负载临时只思索到cpu的使用率。
而实践筹办中,因为没有客户真个压力,很难做到CPU使用率的准确控制。这里写了个复杂的剧本程序,经由过程自顺应的调治,来到达将服务器CPU使用率把持在必定的局限内,从而为确保在某台服务器CPU太高的时分,会主动将虚拟机livemigration到其他CPU使用率低的呆板上的测试做了筹办。
python完成的剧本以下,这个剧本必要5个数字参数的输出,分离为:
最低CPU使用率,最高CPU使用率,初始线程数目,每次调治的线程数目,每一个线程就寝的工夫(毫秒)
固然,很年夜水平上,因为硬件情况的分歧,这些参数带有很强的履历性。
#!/usr/bin/python
importthreading
importtime
importos
importstring
importsys
classControlThread(threading.Thread):
def__init__(self):
threading.Thread.__init__(self)
self.runflag=True#线程运转标示,用于未来削减线程时可以一般停止
defrun(self):
whileself.runflag:
os.popen(usleep+sys.argv[5])
#time.sleep(string.atof(sys.argv[5]))
#这里利用的是linux下shell内里的usleep,而不是python自带的sleep函数。
#比拟之下,usleep仍是相称壮大的,而python的sleep单元为秒,固然能够输出浮点数,但仍是绝对弱了些
defstop(self):
self.runflag=False
#让其一般停止轮回
threadList=[]
printStartThreadNumber:+sys.argv[3]+ SleepTime(ms):+sys.argv[5]
#初始化必定数目的线程,不然从零入手下手,大概必要很长的工夫才干到达指定局限
foriinrange(0,string.atoi(sys.argv[3])):
thread=ControlThread()
threadList.append(thread)
thread.start()
#这里利用sar来抓取cpu使用率,这里指的是总的cpu使用率。然后经由过程对照,举行自顺应调剂
whileTrue:
output=100-string.atof(os.popen(sar11|grep^Average|awk{print$8}).read())
printCPUUsage:+str(output)+ CurrentThreadNumber:+str(len(threadList))
ifoutput<string.atoi(sys.argv[1]):#增添线程
foriinrange(0,string.atoi(sys.argv[4])):
thread=ControlThread()
thread.start()
threadList.append(thread)
print"+++++"
ifoutput>string.atoi(sys.argv[2]):#削减线程
foriinrange(0,string.atoi(sys.argv[4])):
thread=threadList.pop()
thread.stop()
print"-----"
总的来讲,这个剧本对照复杂,并且在分歧的呆板上,必要操纵职员的履历来初始化才干到达最好效果。但这究竟是我第一个python程序,并且也到达了预期的目标。以上只是能运转的中心代码,至于usage,毛病处置,加入程序等,就没有给出来了:)
</p>
常用的linux命令,尤其是一些能帮你提高开发效率的命令,(eg:grep,awk,sed,split等); |
|