1
|
|
2
|
|
3
|
|
4
|
|
5
|
|
6
|
|
7
|
|
8
|
|
9
|
|
10
|
|
11
|
|
12
|
|
13
|
|
14
|
|
15
|
|
16
|
|
17
|
|
18
|
from mx.DateTime import DateTime
|
19
|
from haizea.core.leases import LeaseWorkload, Site, UnmanagedSoftwareEnvironment,\
|
20
|
DiskImageSoftwareEnvironment, LeaseAnnotations
|
21
|
import operator
|
22
|
from haizea.common.stats import percentile, print_percentiles, print_distribution
|
23
|
|
24
|
class LWFAnalyser(object):
|
25
|
|
26
|
|
27
|
def __init__(self, lwffile, utilization_length, annotationfile, verbose = False):
|
28
|
|
29
|
self.starttime = DateTime(2006,11,25,13)
|
30
|
|
31
|
self.workload = LeaseWorkload.from_xml_file(lwffile, self.starttime)
|
32
|
self.site = Site.from_lwf_file(lwffile)
|
33
|
|
34
|
if utilization_length == None:
|
35
|
self.utilization_length = self.workload.get_leases()[-1].submit_time - self.starttime
|
36
|
else:
|
37
|
self.utilization_length = utilization_length
|
38
|
|
39
|
if annotationfile != None:
|
40
|
annotations = LeaseAnnotations.from_xml_file(annotationfile)
|
41
|
annotations.apply_to_leases(self.workload.get_leases())
|
42
|
|
43
|
self.verbose = verbose
|
44
|
|
45
|
def analyse(self):
|
46
|
requtilization = 0
|
47
|
actutilization = 0
|
48
|
software = {"Unmanaged": 0}
|
49
|
nnodes = []
|
50
|
reqdurations = []
|
51
|
actdurations = []
|
52
|
nleases = len(self.workload.get_leases())
|
53
|
for lease in self.workload.get_leases():
|
54
|
if lease.start.requested == "Unspecified":
|
55
|
start = lease.submit_time
|
56
|
else:
|
57
|
start = lease.start.requested
|
58
|
|
59
|
if start + lease.duration.requested > self.starttime + self.utilization_length:
|
60
|
reqduration = (self.starttime + self.utilization_length - start).seconds
|
61
|
else:
|
62
|
reqduration = lease.duration.requested.seconds
|
63
|
|
64
|
if lease.duration.known != None:
|
65
|
if start + lease.duration.known > self.starttime + self.utilization_length:
|
66
|
actduration = (self.starttime + self.utilization_length - start).seconds
|
67
|
else:
|
68
|
actduration = lease.duration.known.seconds
|
69
|
else:
|
70
|
actduration = reqduration
|
71
|
|
72
|
for res in lease.requested_resources.values():
|
73
|
for i in range(1,res.get_ninstances("CPU") + 1):
|
74
|
requtilization += (res.get_quantity_instance("CPU", i) / 100.0) * reqduration
|
75
|
actutilization += (res.get_quantity_instance("CPU", i) / 100.0) * actduration
|
76
|
|
77
|
nnodes.append(len(lease.requested_resources))
|
78
|
reqdurations.append(lease.duration.requested.seconds)
|
79
|
|
80
|
if lease.duration.known != None:
|
81
|
actdurations.append(lease.duration.known.seconds)
|
82
|
|
83
|
if isinstance(lease.software, UnmanagedSoftwareEnvironment):
|
84
|
software["Unmanaged"] += 1
|
85
|
elif isinstance(lease.software, DiskImageSoftwareEnvironment):
|
86
|
image = lease.software.image_id
|
87
|
software[image] = software.setdefault(image, 0) +1
|
88
|
|
89
|
if self.site != None:
|
90
|
max_utilization = 0
|
91
|
duration = self.utilization_length.seconds
|
92
|
for res in self.site.nodes.get_all_nodes().values():
|
93
|
for i in range(1,res.get_ninstances("CPU") + 1):
|
94
|
max_utilization += (res.get_quantity_instance("CPU", i)/100.0) * duration
|
95
|
|
96
|
if self.verbose:
|
97
|
reqdurd = {}
|
98
|
nnodesd = {}
|
99
|
for reqduration in reqdurations:
|
100
|
reqdurd[reqduration] = reqdurd.setdefault(reqduration, 0) +1
|
101
|
for n in nnodes:
|
102
|
nnodesd[n] = nnodesd.setdefault(n, 0) +1
|
103
|
|
104
|
|
105
|
print actutilization
|
106
|
print max_utilization
|
107
|
print "Requested utilization: %.2f%%" % ((requtilization / max_utilization) * 100.0)
|
108
|
print " Actual utilization: %.2f%%" % ((actutilization / max_utilization) * 100.0)
|
109
|
print
|
110
|
|
111
|
print "NODES"
|
112
|
print "-----"
|
113
|
print_percentiles(nnodes)
|
114
|
print
|
115
|
if self.verbose:
|
116
|
print "NODES (distribution)"
|
117
|
print "--------------------"
|
118
|
print_distribution(nnodesd, nleases)
|
119
|
print
|
120
|
print "REQUESTED DURATIONS"
|
121
|
print "-------------------"
|
122
|
print_percentiles(reqdurations)
|
123
|
print
|
124
|
if self.verbose:
|
125
|
print "REQUESTED DURATIONS (distribution)"
|
126
|
print "----------------------------------"
|
127
|
print_distribution(reqdurd, nleases)
|
128
|
print
|
129
|
print "ACTUAL DURATIONS"
|
130
|
print "----------------"
|
131
|
print_percentiles(actdurations)
|
132
|
print
|
133
|
print "IMAGES"
|
134
|
print "------"
|
135
|
print_distribution(software, nleases)
|
136
|
|
137
|
|
138
|
print
|