1*d9f75844SAndroid Build Coastguard Worker#!/usr/bin/env vpython3 2*d9f75844SAndroid Build Coastguard Worker# 3*d9f75844SAndroid Build Coastguard Worker# Copyright (c) 2014 The WebRTC project authors. All Rights Reserved. 4*d9f75844SAndroid Build Coastguard Worker# 5*d9f75844SAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license 6*d9f75844SAndroid Build Coastguard Worker# that can be found in the LICENSE file in the root of the source 7*d9f75844SAndroid Build Coastguard Worker# tree. An additional intellectual property rights grant can be found 8*d9f75844SAndroid Build Coastguard Worker# in the file PATENTS. All contributing project authors may 9*d9f75844SAndroid Build Coastguard Worker# be found in the AUTHORS file in the root of the source tree. 10*d9f75844SAndroid Build Coastguard Worker 11*d9f75844SAndroid Build Coastguard Workerimport sys 12*d9f75844SAndroid Build Coastguard Worker 13*d9f75844SAndroid Build Coastguard Workerimport psutil 14*d9f75844SAndroid Build Coastguard Workerimport numpy 15*d9f75844SAndroid Build Coastguard Workerfrom matplotlib import pyplot 16*d9f75844SAndroid Build Coastguard Worker 17*d9f75844SAndroid Build Coastguard Worker 18*d9f75844SAndroid Build Coastguard Workerclass CpuSnapshot: 19*d9f75844SAndroid Build Coastguard Worker def __init__(self, label): 20*d9f75844SAndroid Build Coastguard Worker self.label = label 21*d9f75844SAndroid Build Coastguard Worker self.samples = [] 22*d9f75844SAndroid Build Coastguard Worker 23*d9f75844SAndroid Build Coastguard Worker def Capture(self, sample_count): 24*d9f75844SAndroid Build Coastguard Worker print(('Capturing %d CPU samples for %s...' % 25*d9f75844SAndroid Build Coastguard Worker ((sample_count - len(self.samples)), self.label))) 26*d9f75844SAndroid Build Coastguard Worker while len(self.samples) < sample_count: 27*d9f75844SAndroid Build Coastguard Worker self.samples.append(psutil.cpu_percent(1.0, False)) 28*d9f75844SAndroid Build Coastguard Worker 29*d9f75844SAndroid Build Coastguard Worker def Text(self): 30*d9f75844SAndroid Build Coastguard Worker return ( 31*d9f75844SAndroid Build Coastguard Worker '%s: avg=%s, median=%s, min=%s, max=%s' % 32*d9f75844SAndroid Build Coastguard Worker (self.label, numpy.average(self.samples), numpy.median( 33*d9f75844SAndroid Build Coastguard Worker self.samples), numpy.min(self.samples), numpy.max(self.samples))) 34*d9f75844SAndroid Build Coastguard Worker 35*d9f75844SAndroid Build Coastguard Worker def Max(self): 36*d9f75844SAndroid Build Coastguard Worker return numpy.max(self.samples) 37*d9f75844SAndroid Build Coastguard Worker 38*d9f75844SAndroid Build Coastguard Worker 39*d9f75844SAndroid Build Coastguard Workerdef GrabCpuSamples(sample_count): 40*d9f75844SAndroid Build Coastguard Worker print('Label for snapshot (enter to quit): ') 41*d9f75844SAndroid Build Coastguard Worker label = eval(input().strip()) 42*d9f75844SAndroid Build Coastguard Worker if len(label) == 0: 43*d9f75844SAndroid Build Coastguard Worker return None 44*d9f75844SAndroid Build Coastguard Worker 45*d9f75844SAndroid Build Coastguard Worker snapshot = CpuSnapshot(label) 46*d9f75844SAndroid Build Coastguard Worker snapshot.Capture(sample_count) 47*d9f75844SAndroid Build Coastguard Worker 48*d9f75844SAndroid Build Coastguard Worker return snapshot 49*d9f75844SAndroid Build Coastguard Worker 50*d9f75844SAndroid Build Coastguard Worker 51*d9f75844SAndroid Build Coastguard Workerdef main(): 52*d9f75844SAndroid Build Coastguard Worker print('How many seconds to capture per snapshot (enter for 60)?') 53*d9f75844SAndroid Build Coastguard Worker sample_count = eval(input().strip()) 54*d9f75844SAndroid Build Coastguard Worker if len(sample_count) > 0 and int(sample_count) > 0: 55*d9f75844SAndroid Build Coastguard Worker sample_count = int(sample_count) 56*d9f75844SAndroid Build Coastguard Worker else: 57*d9f75844SAndroid Build Coastguard Worker print('Defaulting to 60 samples.') 58*d9f75844SAndroid Build Coastguard Worker sample_count = 60 59*d9f75844SAndroid Build Coastguard Worker 60*d9f75844SAndroid Build Coastguard Worker snapshots = [] 61*d9f75844SAndroid Build Coastguard Worker while True: 62*d9f75844SAndroid Build Coastguard Worker snapshot = GrabCpuSamples(sample_count) 63*d9f75844SAndroid Build Coastguard Worker if snapshot is None: 64*d9f75844SAndroid Build Coastguard Worker break 65*d9f75844SAndroid Build Coastguard Worker snapshots.append(snapshot) 66*d9f75844SAndroid Build Coastguard Worker 67*d9f75844SAndroid Build Coastguard Worker if len(snapshots) == 0: 68*d9f75844SAndroid Build Coastguard Worker print('no samples captured') 69*d9f75844SAndroid Build Coastguard Worker return -1 70*d9f75844SAndroid Build Coastguard Worker 71*d9f75844SAndroid Build Coastguard Worker pyplot.title('CPU usage') 72*d9f75844SAndroid Build Coastguard Worker 73*d9f75844SAndroid Build Coastguard Worker for s in snapshots: 74*d9f75844SAndroid Build Coastguard Worker pyplot.plot(s.samples, label=s.Text(), linewidth=2) 75*d9f75844SAndroid Build Coastguard Worker 76*d9f75844SAndroid Build Coastguard Worker pyplot.legend() 77*d9f75844SAndroid Build Coastguard Worker 78*d9f75844SAndroid Build Coastguard Worker pyplot.show() 79*d9f75844SAndroid Build Coastguard Worker return 0 80*d9f75844SAndroid Build Coastguard Worker 81*d9f75844SAndroid Build Coastguard Worker 82*d9f75844SAndroid Build Coastguard Workerif __name__ == '__main__': 83*d9f75844SAndroid Build Coastguard Worker sys.exit(main()) 84