天天看点

通过libvirt 控制vCPU使用,为了缓解CPU资源争抢

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

<code>#!/usr/bin/env python</code>

<code>#-*-coding:UTF-8-*-</code>

<code>"""</code>

<code>@Item   :  IO Ctl</code>

<code>@Author :  Villiam Sheng</code>

<code>@Group  :  Python DEV Group</code>

<code>@Date   :  2013-05-29</code>

<code>@Funtion:</code>

<code>        </code><code>CPU control:</code>

<code>                </code><code>To control for CPU</code>

<code>import</code> <code>os,sys,time , libvirt , traceback,commands</code>

<code>'''</code>

<code>    </code><code>Func : Record error message</code>

<code>        </code><code>path :  Message save path</code>

<code>        </code><code>formats : Record message time formata</code>

<code>        </code><code>log_name : Message file name</code>

<code>        </code><code>itme :  function error</code>

<code>        </code><code>info :  Error / info information</code>

<code>def</code> <code>oper_log(log_name,item,info):</code>

<code>    </code><code>path  </code><code>=</code> <code>'/tmp/'</code>

<code>    </code><code>stime </code><code>=</code> <code>time.strftime(</code><code>'%Y-%m-%d %H:%M:%S'</code><code>)</code>

<code>    </code><code>formats</code><code>=</code> <code>'[%s] %s:: %s \n'</code> <code>%</code> <code>(stime,item,info)</code>

<code>    </code><code>if</code> <code>not</code> <code>os.path.exists(path):</code>

<code>        </code><code>os.mkdir(path)</code>

<code>    </code><code>try</code><code>:</code>

<code>        </code><code>if</code> <code>log_name.split(</code><code>'.'</code><code>)[</code><code>1</code><code>] </code><code>=</code><code>=</code> <code>'log'</code><code>:</code>

<code>            </code><code>fp </code><code>=</code> <code>open</code><code>(path </code><code>+</code> <code>log_name,</code><code>'a'</code><code>)</code>

<code>        </code><code>elif</code> <code>log_name.split(</code><code>'.'</code><code>)[</code><code>1</code><code>] </code><code>=</code><code>=</code> <code>'info'</code><code>:</code>

<code>            </code><code>fp </code><code>=</code> <code>open</code><code>(path </code><code>+</code> <code>log_name,</code><code>'w'</code><code>)</code>

<code>        </code><code>else</code><code>:</code>

<code>        </code><code>fp.write(formats)</code>

<code>        </code><code>fp.close()</code>

<code>    </code><code>except</code> <code>Exception,e:</code>

<code>        </code><code>pass</code>

<code>class</code> <code>cpuctl(</code><code>object</code><code>):</code>

<code>    </code><code>def</code> <code>__init__(</code><code>self</code><code>):</code>

<code>        </code><code>self</code><code>.conn </code><code>=</code> <code>libvirt.</code><code>open</code><code>(</code><code>None</code><code>)</code>

<code>    </code><code>def</code> <code>_VmsCPUPercent(</code><code>self</code><code>,uuid):</code>

<code>        </code><code>'''</code>

<code>        </code><code>Func info : Calculation virtual machine of CPU percentage , if error , return 0</code>

<code>            </code><code>uuid : instance uuid</code>

<code>            </code><code>cycle_time : 10s</code>

<code>            </code><code>cpuTimeStart:  virtual machine cpu running time</code>

<code>            </code><code>nr_cores :  CPU number all</code>

<code>            </code><code>Formula to calculate:</code>

<code>                    </code><code>%CPU = 100 × cpu_time_diff / (t × nr_cores × 1e9)</code>

<code>        </code><code>try</code><code>:</code>

<code>            </code><code>nr_cores </code><code>=</code>  <code>self</code><code>.conn.getInfo()[</code><code>2</code><code>]</code>

<code>            </code><code>cpuTimeStart </code><code>=</code>  <code>self</code><code>.conn.lookupByID(uuid).info()[</code><code>-</code><code>1</code><code>]</code>

<code>            </code><code>sysTimeStart </code><code>=</code> <code>time.time()</code>

<code>            </code><code>time.sleep(</code><code>1</code><code>)</code>

<code>            </code><code>cpuTimeEnd </code><code>=</code> <code>self</code><code>.conn.lookupByID(uuid).info()[</code><code>-</code><code>1</code><code>]</code>

<code>            </code><code>sysTimeEnd </code><code>=</code> <code>time.time()</code>

<code>            </code><code>cpuTimeDiff </code><code>=</code> <code>cpuTimeEnd </code><code>-</code> <code>cpuTimeStart</code>

<code>            </code><code>sysTimeDiff </code><code>=</code> <code>sysTimeEnd </code><code>-</code> <code>sysTimeStart</code>

<code>            </code><code>return</code> <code>100</code> <code>*</code> <code>cpuTimeDiff </code><code>/</code> <code>( sysTimeDiff </code><code>*</code> <code>1</code> <code>*</code> <code>1e9</code><code>)</code>

<code>        </code><code>except</code> <code>Exception,e:</code>

<code>            </code><code>oper_log(</code><code>'cpuctl.log'</code><code>,</code><code>'_cpuPercent'</code><code>,</code><code>'ID : %s Error : %s'</code><code>%</code><code>(uuid,e))</code>

<code>            </code><code>return</code> <code>0</code>

<code>    </code><code>def</code> <code>_isHostUpload(</code><code>self</code><code>):</code>

<code>        </code><code>Func info : Return kvm host the current system load every 1 minute</code>

<code>            </code><code>if error , return 0</code>

<code>            </code><code>return</code> <code>float</code><code>(os.popen(</code><code>'uptime'</code><code>).read().split(</code><code>':'</code><code>)[</code><code>-</code><code>1</code><code>].strip()[:</code><code>4</code><code>])</code>

<code>        </code><code>except</code><code>:</code>

<code>            </code><code>oper_log(</code><code>'cpuctl.log'</code><code>,</code><code>'_isUpload'</code><code>,traceback.format_exc())</code>

<code>    </code><code>def</code> <code>_operRate(uuid):</code>

<code>            </code><code>x,y  </code><code>=</code> <code>commands.getstatusoutput(</code><code>'virsh dumpxml %s'</code> <code>%</code><code>uuid)</code>

<code>            </code><code>print</code> <code>x,y</code>

<code>            </code><code>LOG.error(traceback.format_exc())</code>

<code>    </code><code>def</code> <code>_isHostCPUFreePercent(</code><code>self</code><code>):</code>

<code>        </code><code>''''</code>

<code>        </code><code>Func info : Return kvm host CPU free percent . Go to 2 times every 3 seconds, get the average CPU idle percentage</code>

<code>            </code><code>return</code> <code>float</code><code>(os.popen(</code><code>'sar 3 3 '</code><code>).readlines()[</code><code>-</code><code>1</code><code>].split()[</code><code>-</code><code>1</code><code>])</code>

<code>            </code><code>oper_log(</code><code>'cpuctl.log'</code><code>,</code><code>'_isCPUFreePercent'</code><code>,traceback.format_exc())</code>

<code>    </code><code>def</code> <code>_isHostCPUNum(</code><code>self</code><code>):</code>

<code>            </code><code>pass</code>

<code>    </code><code>def</code> <code>_isVMScpuNum(</code><code>self</code><code>,uuid):</code>

<code>        </code><code>Func info : Return virtual machine cpu number</code>

<code>            </code><code>if error ,return 1</code>

<code>            </code><code>return</code> <code>self</code><code>.conn.lookupByID(uuid).info()[</code><code>-</code><code>2</code><code>]</code>

<code>            </code><code>oper_log(</code><code>'cpuctl.log'</code><code>,</code><code>'isVMScpuNum'</code><code>,traceback.format_exc())</code>

<code>            </code><code>return</code> <code>1</code>

<code>    </code><code>def</code> <code>work(</code><code>self</code><code>):</code>

<code>        </code><code>Working func :  .....</code>

<code>            </code><code>vms_list : Getting all virtual machine ID</code>

<code>            </code><code>self._VmsCPUPercent() : Return cpu percent ...</code>

<code>            </code><code>self._isUpload()   : Return kvm host loads one s</code>

<code>            </code><code>sefl._isCPUFreePercent: Return kvm host cpu free percent</code>

<code>            </code><code>loadValues : KVM HOST Default load values</code>

<code>        </code><code>hostPercen </code><code>=</code> <code>self</code><code>._isHostCPUFreePercent()</code>

<code>        </code><code>loadValues </code><code>=</code> <code>49</code>

<code>        </code><code>print</code> <code>hostPercen</code>

<code>        </code><code>vms_list </code><code>=</code> <code>self</code><code>.conn.listDomainsID()</code>

<code>        </code><code>if</code>  <code>self</code><code>._isHostUpload() &lt;</code><code>=</code> <code>loadValues:</code>

<code>            </code><code>for</code> <code>i </code><code>in</code> <code>vms_list:</code>

<code>                </code><code>if</code>  <code>self</code><code>._VmsCPUPercent(i) &lt;</code><code>=</code> <code>99.0</code><code>:</code>

<code>                    </code><code>print</code> <code>self</code><code>.conn.lookupByID(i).name()</code>

<code>                    </code><code>print</code> <code>self</code><code>._isVMScpuNum(i)</code>

<code>                </code><code>else</code><code>:</code>

<code>                    </code><code>print</code> <code>'ot'</code>

<code>            </code><code>print</code> <code>'no upload'</code>

<code>if</code> <code>__name__ </code><code>=</code><code>=</code> <code>"__main__"</code><code>:</code>

<code>    </code><code>st </code><code>=</code> <code>cpuctl()</code>

<code>    </code><code>st.work()</code>

本文转自 swq499809608 51CTO博客,原文链接:http://blog.51cto.com/swq499809608/1412020

继续阅读