xref: /aosp_15_r20/external/webrtc/tools_webrtc/cpu/cpu_mon.py (revision d9f758449e529ab9291ac668be2861e7a55c2422)
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