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