15263c5892374c8ae4ed4ddb90c8a4a775e86dbb5tommi@webrtc.org#!/usr/bin/env python 25263c5892374c8ae4ed4ddb90c8a4a775e86dbb5tommi@webrtc.org# 35263c5892374c8ae4ed4ddb90c8a4a775e86dbb5tommi@webrtc.org# Copyright (c) 2014 The WebRTC project authors. All Rights Reserved. 45263c5892374c8ae4ed4ddb90c8a4a775e86dbb5tommi@webrtc.org# 55263c5892374c8ae4ed4ddb90c8a4a775e86dbb5tommi@webrtc.org# Use of this source code is governed by a BSD-style license 65263c5892374c8ae4ed4ddb90c8a4a775e86dbb5tommi@webrtc.org# that can be found in the LICENSE file in the root of the source 75263c5892374c8ae4ed4ddb90c8a4a775e86dbb5tommi@webrtc.org# tree. An additional intellectual property rights grant can be found 85263c5892374c8ae4ed4ddb90c8a4a775e86dbb5tommi@webrtc.org# in the file PATENTS. All contributing project authors may 95263c5892374c8ae4ed4ddb90c8a4a775e86dbb5tommi@webrtc.org# be found in the AUTHORS file in the root of the source tree. 105263c5892374c8ae4ed4ddb90c8a4a775e86dbb5tommi@webrtc.org 115263c5892374c8ae4ed4ddb90c8a4a775e86dbb5tommi@webrtc.org 125263c5892374c8ae4ed4ddb90c8a4a775e86dbb5tommi@webrtc.orgimport psutil 135263c5892374c8ae4ed4ddb90c8a4a775e86dbb5tommi@webrtc.orgimport sys 145263c5892374c8ae4ed4ddb90c8a4a775e86dbb5tommi@webrtc.org 155263c5892374c8ae4ed4ddb90c8a4a775e86dbb5tommi@webrtc.orgimport numpy 165263c5892374c8ae4ed4ddb90c8a4a775e86dbb5tommi@webrtc.orgfrom matplotlib import pyplot 175263c5892374c8ae4ed4ddb90c8a4a775e86dbb5tommi@webrtc.org 185263c5892374c8ae4ed4ddb90c8a4a775e86dbb5tommi@webrtc.org 195263c5892374c8ae4ed4ddb90c8a4a775e86dbb5tommi@webrtc.orgclass CpuSnapshot(object): 205263c5892374c8ae4ed4ddb90c8a4a775e86dbb5tommi@webrtc.org def __init__(self, label): 215263c5892374c8ae4ed4ddb90c8a4a775e86dbb5tommi@webrtc.org self.label = label 225263c5892374c8ae4ed4ddb90c8a4a775e86dbb5tommi@webrtc.org self.samples = [] 235263c5892374c8ae4ed4ddb90c8a4a775e86dbb5tommi@webrtc.org 245263c5892374c8ae4ed4ddb90c8a4a775e86dbb5tommi@webrtc.org def Capture(self, sample_count): 255263c5892374c8ae4ed4ddb90c8a4a775e86dbb5tommi@webrtc.org print ('Capturing %d CPU samples for %s...' % 265263c5892374c8ae4ed4ddb90c8a4a775e86dbb5tommi@webrtc.org ((sample_count - len(self.samples)), self.label)) 275263c5892374c8ae4ed4ddb90c8a4a775e86dbb5tommi@webrtc.org while len(self.samples) < sample_count: 285263c5892374c8ae4ed4ddb90c8a4a775e86dbb5tommi@webrtc.org self.samples.append(psutil.cpu_percent(1.0, False)) 295263c5892374c8ae4ed4ddb90c8a4a775e86dbb5tommi@webrtc.org 305263c5892374c8ae4ed4ddb90c8a4a775e86dbb5tommi@webrtc.org def Text(self): 315263c5892374c8ae4ed4ddb90c8a4a775e86dbb5tommi@webrtc.org return ('%s: avg=%s, median=%s, min=%s, max=%s' % 325263c5892374c8ae4ed4ddb90c8a4a775e86dbb5tommi@webrtc.org (self.label, numpy.average(self.samples), 335263c5892374c8ae4ed4ddb90c8a4a775e86dbb5tommi@webrtc.org numpy.median(self.samples), 345263c5892374c8ae4ed4ddb90c8a4a775e86dbb5tommi@webrtc.org numpy.min(self.samples), numpy.max(self.samples))) 355263c5892374c8ae4ed4ddb90c8a4a775e86dbb5tommi@webrtc.org 365263c5892374c8ae4ed4ddb90c8a4a775e86dbb5tommi@webrtc.org def Max(self): 375263c5892374c8ae4ed4ddb90c8a4a775e86dbb5tommi@webrtc.org return numpy.max(self.samples) 385263c5892374c8ae4ed4ddb90c8a4a775e86dbb5tommi@webrtc.org 395263c5892374c8ae4ed4ddb90c8a4a775e86dbb5tommi@webrtc.org 405263c5892374c8ae4ed4ddb90c8a4a775e86dbb5tommi@webrtc.orgdef GrabCpuSamples(sample_count): 415263c5892374c8ae4ed4ddb90c8a4a775e86dbb5tommi@webrtc.org print 'Label for snapshot (enter to quit): ' 425263c5892374c8ae4ed4ddb90c8a4a775e86dbb5tommi@webrtc.org label = raw_input().strip() 435263c5892374c8ae4ed4ddb90c8a4a775e86dbb5tommi@webrtc.org if len(label) == 0: 445263c5892374c8ae4ed4ddb90c8a4a775e86dbb5tommi@webrtc.org return None 455263c5892374c8ae4ed4ddb90c8a4a775e86dbb5tommi@webrtc.org 465263c5892374c8ae4ed4ddb90c8a4a775e86dbb5tommi@webrtc.org snapshot = CpuSnapshot(label) 475263c5892374c8ae4ed4ddb90c8a4a775e86dbb5tommi@webrtc.org snapshot.Capture(sample_count) 485263c5892374c8ae4ed4ddb90c8a4a775e86dbb5tommi@webrtc.org 495263c5892374c8ae4ed4ddb90c8a4a775e86dbb5tommi@webrtc.org return snapshot 505263c5892374c8ae4ed4ddb90c8a4a775e86dbb5tommi@webrtc.org 515263c5892374c8ae4ed4ddb90c8a4a775e86dbb5tommi@webrtc.org 525263c5892374c8ae4ed4ddb90c8a4a775e86dbb5tommi@webrtc.orgdef main(): 535263c5892374c8ae4ed4ddb90c8a4a775e86dbb5tommi@webrtc.org print 'How many seconds to capture per snapshot (enter for 60)?' 545263c5892374c8ae4ed4ddb90c8a4a775e86dbb5tommi@webrtc.org sample_count = raw_input().strip() 555263c5892374c8ae4ed4ddb90c8a4a775e86dbb5tommi@webrtc.org if len(sample_count) > 0 and int(sample_count) > 0: 565263c5892374c8ae4ed4ddb90c8a4a775e86dbb5tommi@webrtc.org sample_count = int(sample_count) 575263c5892374c8ae4ed4ddb90c8a4a775e86dbb5tommi@webrtc.org else: 585263c5892374c8ae4ed4ddb90c8a4a775e86dbb5tommi@webrtc.org print 'Defaulting to 60 samples.' 595263c5892374c8ae4ed4ddb90c8a4a775e86dbb5tommi@webrtc.org sample_count = 60 605263c5892374c8ae4ed4ddb90c8a4a775e86dbb5tommi@webrtc.org 615263c5892374c8ae4ed4ddb90c8a4a775e86dbb5tommi@webrtc.org snapshots = [] 625263c5892374c8ae4ed4ddb90c8a4a775e86dbb5tommi@webrtc.org while True: 635263c5892374c8ae4ed4ddb90c8a4a775e86dbb5tommi@webrtc.org snapshot = GrabCpuSamples(sample_count) 645263c5892374c8ae4ed4ddb90c8a4a775e86dbb5tommi@webrtc.org if snapshot == None: 655263c5892374c8ae4ed4ddb90c8a4a775e86dbb5tommi@webrtc.org break 665263c5892374c8ae4ed4ddb90c8a4a775e86dbb5tommi@webrtc.org snapshots.append(snapshot) 675263c5892374c8ae4ed4ddb90c8a4a775e86dbb5tommi@webrtc.org 685263c5892374c8ae4ed4ddb90c8a4a775e86dbb5tommi@webrtc.org if len(snapshots) == 0: 695263c5892374c8ae4ed4ddb90c8a4a775e86dbb5tommi@webrtc.org print 'no samples captured' 705263c5892374c8ae4ed4ddb90c8a4a775e86dbb5tommi@webrtc.org return -1 715263c5892374c8ae4ed4ddb90c8a4a775e86dbb5tommi@webrtc.org 725263c5892374c8ae4ed4ddb90c8a4a775e86dbb5tommi@webrtc.org pyplot.title('CPU usage') 735263c5892374c8ae4ed4ddb90c8a4a775e86dbb5tommi@webrtc.org 745263c5892374c8ae4ed4ddb90c8a4a775e86dbb5tommi@webrtc.org for s in snapshots: 755263c5892374c8ae4ed4ddb90c8a4a775e86dbb5tommi@webrtc.org pyplot.plot(s.samples, label=s.Text(), linewidth=2) 765263c5892374c8ae4ed4ddb90c8a4a775e86dbb5tommi@webrtc.org 775263c5892374c8ae4ed4ddb90c8a4a775e86dbb5tommi@webrtc.org pyplot.legend() 785263c5892374c8ae4ed4ddb90c8a4a775e86dbb5tommi@webrtc.org 795263c5892374c8ae4ed4ddb90c8a4a775e86dbb5tommi@webrtc.org pyplot.show() 805263c5892374c8ae4ed4ddb90c8a4a775e86dbb5tommi@webrtc.org return 0 815263c5892374c8ae4ed4ddb90c8a4a775e86dbb5tommi@webrtc.org 825263c5892374c8ae4ed4ddb90c8a4a775e86dbb5tommi@webrtc.orgif __name__ == '__main__': 835263c5892374c8ae4ed4ddb90c8a4a775e86dbb5tommi@webrtc.org sys.exit(main()) 84