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() <</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) <</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