Project

General

Profile

root / branches / 1.1 / src / haizea / lwf / analysis.py @ 847

1
# -------------------------------------------------------------------------- #
2
# Copyright 2006-2010, University of Chicago                                 #
3
# Copyright 2008-2010, Distributed Systems Architecture Group, Universidad   #
4
# Complutense de Madrid (dsa-research.org)                                   #
5
#                                                                            #
6
# Licensed under the Apache License, Version 2.0 (the "License"); you may    #
7
# not use this file except in compliance with the License. You may obtain    #
8
# a copy of the License at                                                   #
9
#                                                                            #
10
# http://www.apache.org/licenses/LICENSE-2.0                                 #
11
#                                                                            #
12
# Unless required by applicable law or agreed to in writing, software        #
13
# distributed under the License is distributed on an "AS IS" BASIS,          #
14
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   #
15
# See the License for the specific language governing permissions and        #
16
# limitations under the License.                                             #
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
        # Arbitrary start time
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
        #sorted_images = sorted(software.iteritems(), key=operator.itemgetter(1), reverse=True)
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
        #for image, count in sorted_images:
137
        #    print "%s: %i (%.2f%%)" % (image, count, (float(count)/nleases)*100)
138
        print