plot_sdcard.py revision 906d825d7033339bb37d7415bce77089bec3a2b6
139c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania#!/usr/bin/python2.5 239c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania# 3d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania# Copyright 2009, The Android Open Source Project 4d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania# 5d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania# Licensed under the Apache License, Version 2.0 (the "License"); 6d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania# you may not use this file except in compliance with the License. 7d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania# You may obtain a copy of the License at 8d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania# 9d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania# http://www.apache.org/licenses/LICENSE-2.0 10d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania# 11d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania# Unless required by applicable law or agreed to in writing, software 12d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania# distributed under the License is distributed on an "AS IS" BASIS, 13d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania# See the License for the specific language governing permissions and 15d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania# limitations under the License. 16d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania 1739c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania 1839c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania"""plot_sdcard: A module to plot the results of an sdcard perf test. 1939c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania 2039c016f875b793296a121f41de5775b88f6fa1c9Nicolas CataniaRequires Gnuplot python v 1.8 2139c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania 2239c016f875b793296a121f41de5775b88f6fa1c9Nicolas CataniaTypical usage: 23d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania -t x axis is time 24d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania -i x axis is iteration 25d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania -p profile data generated by profile_sdcard.sh 26d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania 27d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania./plot_sdcard.py -t /tmp/data.txt 28d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania./plot_sdcard.py -i /tmp/data.txt 29d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania./plot_sdcard.py -p 3039c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania 31d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Cataniapython interpreter 3239c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania>>> import plot_sdcard as p 33d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania>>> (metadata, data) = p.Parse('/tmp/data.txt') 34d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania>>> p.PlotIterations(metadata, data) 35d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania>>> p.PlotTimes(metadata, data) 3639c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania 3739c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania""" 3839c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania 39d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Cataniaimport getopt 4039c016f875b793296a121f41de5775b88f6fa1c9Nicolas Cataniafrom itertools import izip 41d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Cataniaimport re 42d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Cataniaimport sys 43d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Cataniaimport Gnuplot 44d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Cataniaimport numpy 45d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania 4639c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania 4739c016f875b793296a121f41de5775b88f6fa1c9Nicolas Cataniaclass DataSet(object): 48d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania """Dataset holds the summary and data (time,value pairs).""" 49d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania 5039c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania def __init__(self, line): 51d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania res = re.search(('# StopWatch ([\w]+) total/cumulative ' 52d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania 'duration ([0-9.]+). Samples: ([0-9]+)'), line) 5339c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania self.time = [] 5439c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania self.data = [] 5539c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania self.name = res.group(1) 5639c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania self.duration = float(res.group(2)) 5739c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania self.iteration = int(res.group(3)) 5839c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania self.summary = re.match('([a-z_]+)_total', self.name) 5939c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania 6039c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania def __repr__(self): 6139c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania return str(zip(self.time, self.data)) 6239c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania 63d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania def Add(self, time, value): 6439c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania self.time.append(time) 6539c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania self.data.append(value) 6639c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania 67d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania def RescaleTo(self, length): 6839c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania factor = len(self.data) / length 6939c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania 7039c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania if factor > 1: 7139c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania new_time = [] 7239c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania new_data = [] 7339c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania accum = 0.0 7439c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania idx = 1 75d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania for t, d in izip(self.time, self.data): 7639c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania accum += d 7739c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania if idx % factor == 0: 7839c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania new_time.append(t) 7939c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania new_data.append(accum / factor) 8039c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania accum = 0 8139c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania idx += 1 8239c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania self.time = new_time 8339c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania self.data = new_data 8439c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania 8539c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania 8639c016f875b793296a121f41de5775b88f6fa1c9Nicolas Cataniaclass Metadata(object): 8739c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania def __init__(self): 8839c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania self.kernel = '' 8939c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania self.command_line = '' 9039c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania self.sched = '' 9139c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania self.name = '' 9239c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania self.fadvise = '' 9339c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania self.iterations = 0 9439c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania self.duration = 0.0 9539c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania self.complete = False 9639c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania 97d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania def Parse(self, line): 9839c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania if line.startswith('# Kernel:'): 99906d825d7033339bb37d7415bce77089bec3a2b6Nicolas Catania self.kernel = re.search('Linux version ([0-9.]+-[^ ]+)', line).group(1) 10039c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania elif line.startswith('# Command:'): 10139c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania self.command_line = re.search('# Command: [/\w_]+ (.*)', line).group(1) 10239c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania self.command_line = self.command_line.replace(' --', '-') 10339c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania self.command_line = self.command_line.replace(' -d', '') 10439c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania self.command_line = self.command_line.replace('--test=', '') 10539c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania elif line.startswith('# Iterations'): 10639c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania self.iterations = int(re.search('# Iterations: ([0-9]+)', line).group(1)) 10739c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania elif line.startswith('# Fadvise'): 108d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania self.fadvise = re.search('# Fadvise: ([\w]+)', line).group(1) 109d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania elif line.startswith('# Sched'): 11039c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania self.sched = re.search('# Sched features: ([\w]+)', line).group(1) 11139c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania self.complete = True 11239c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania 113d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania def AsTitle(self): 114d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania return '%s-duration:%f\\n-%s\\n%s' % ( 115d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania self.kernel, self.duration, self.command_line, self.sched) 11639c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania 117d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania def UpdateWith(self, dataset): 11839c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania self.duration = max(self.duration, dataset.duration) 11939c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania self.name = dataset.name 12039c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania 12139c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania 122d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Cataniadef Parse(filename): 123d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania """Parse a file with the collected data. 12439c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania 125d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania The data must be in 2 rows (x,y). 12639c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania 127d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania Args: 128d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania filename: Full path to the file. 129d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania """ 13039c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania 13139c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania f = open(filename, 'r') 13239c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania 13339c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania metadata = Metadata() 13439c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania data = [] # array of dataset 13539c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania dataset = None 13639c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania 13739c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania for num, line in enumerate(f): 13839c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania try: 13939c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania line = line.strip() 14039c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania if not line: continue 14139c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania 14239c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania if not metadata.complete: 143d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania metadata.Parse(line) 14439c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania continue 14539c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania 14639c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania if re.match('[a-z_]', line): 14739c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania continue 14839c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania 149d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania if line.startswith('# StopWatch'): # Start of a new dataset 15039c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania if dataset: 15139c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania if dataset.summary: 152d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania metadata.UpdateWith(dataset) 15339c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania else: 15439c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania data.append(dataset) 15539c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania 15639c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania dataset = DataSet(line) 15739c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania continue 15839c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania 15939c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania if line.startswith('#'): 16039c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania continue 16139c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania 16239c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania # must be data at this stage 16339c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania try: 16439c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania (time, value) = line.split(None, 1) 16539c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania except ValueError: 166d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania print 'skipping line %d: %s' % (num, line) 16739c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania continue 16839c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania 16939c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania if dataset and not dataset.summary: 170d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania dataset.Add(float(time), float(value)) 17139c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania 172d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania except Exception: 173d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania print 'Error parsing line %d' % num, sys.exc_info()[0] 17439c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania raise 17539c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania data.append(dataset) 176d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania if not metadata.complete: 177d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania print """Error missing metadata. Did you mount debugfs? 178d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania [adb shell mount -t debugfs none /sys/kernel/debug]""" 179d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania sys.exit(1) 18039c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania return (metadata, data) 181d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania 182d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania 183d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Cataniadef PlotIterations(metadata, data): 184d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania """Plot the duration of the ops against iteration. 185d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania 186d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania If you are plotting data with widely different runtimes you probably want to 187d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania use PlotTimes instead. 188d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania 189d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania For instance when readers and writers are in the same mix, the 190d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania readers will go thru 100 iterations much faster than the 191d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania writers. The load test tries to be smart about that but the final 192d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania iterations of the writers will likely be done w/o any influence from 193d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania the readers. 194d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania 195d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania Args: 196d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania metadata: For the graph's title. 197d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania data: pair of to be plotted. 198d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania """ 199d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania 200d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania gp = Gnuplot.Gnuplot(persist=1) 201d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania gp('set data style lines') 202d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania gp.clear() 203d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania gp.xlabel('iterations') 204d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania gp.ylabel('duration in second') 205d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania gp.title(metadata.AsTitle()) 206d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania styles = {} 207d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania line_style = 1 208d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania 209d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania for dataset in data: 210d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania dataset.RescaleTo(metadata.iterations) 211d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania x = numpy.arange(len(dataset.data), dtype='int_') 212d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania if not dataset.name in styles: 213d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania styles[dataset.name] = line_style 214d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania line_style += 1 215d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania d = Gnuplot.Data(x, dataset.data, 216d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania title=dataset.name, 217d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania with_='lines ls %d' % styles[dataset.name]) 218d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania else: # no need to repeat a title that exists already. 219d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania d = Gnuplot.Data(x, dataset.data, 220d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania with_='lines ls %d' % styles[dataset.name]) 221d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania 222d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania gp.replot(d) 223d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania gp.hardcopy('/tmp/%s-%s-%f.png' % 224d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania (metadata.name, metadata.kernel, metadata.duration), 225d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania terminal='png') 226d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania 227d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania 228d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Cataniadef PlotTimes(metadata, data): 229d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania """Plot the duration of the ops against time elapsed. 230d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania 231d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania Args: 232d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania metadata: For the graph's title. 233d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania data: pair of to be plotted. 234d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania """ 235d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania 236d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania gp = Gnuplot.Gnuplot(persist=1) 237d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania gp('set data style impulses') 238d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania gp('set xtics 1') 239d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania gp.clear() 240d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania gp.xlabel('seconds') 241d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania gp.ylabel('duration in second') 242d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania gp.title(metadata.AsTitle()) 243d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania styles = {} 244d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania line_style = 1 245d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania 246d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania for dataset in data: 247d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania x = numpy.array(dataset.time, dtype='float_') 248d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania if not dataset.name in styles: 249d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania styles[dataset.name] = line_style 250d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania line_style += 1 251d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania d = Gnuplot.Data(x, dataset.data, 252d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania title=dataset.name, 253d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania with_='impulses ls %d' % styles[dataset.name]) 254d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania else: # no need to repeat a title that exists already. 255d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania d = Gnuplot.Data(x, dataset.data, 256d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania with_='impulses ls %d' % styles[dataset.name]) 257d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania 258d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania gp.replot(d) 259d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania gp.hardcopy('/tmp/%s-%s-%f.png' % 260d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania (metadata.name, metadata.kernel, metadata.duration), 261d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania terminal='png') 262d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania 263d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania 264d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Cataniadef PlotProfile(): 265d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania """Plot the time of a run against the number of processes.""" 266d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania (metadata, data) = Parse('/tmp/sdcard-scalability.txt') 267d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania gp = Gnuplot.Gnuplot(persist=1) 268d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania gp('set data style impulses') 269d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania gp('set xtics 1') 270d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania gp('set pointsize 2') 271d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania gp.clear() 272d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania gp.xlabel('writer process') 273d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania gp.ylabel('duration in second') 274d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania gp.title(metadata.AsTitle()) 275d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania 276d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania dataset = data[0] 277d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania x = numpy.array(dataset.time, dtype='int_') 278d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania d = Gnuplot.Data(x, dataset.data, 279d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania title=dataset.name, 280d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania with_='linespoints') 281d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania gp.replot(d) 282d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania gp.hardcopy('/tmp/%s-%s-%f.png' % 283d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania (metadata.name, metadata.kernel, metadata.duration), 284d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania terminal='png') 285d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania 286d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania 287d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Cataniadef Usage(): 288d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania """Print this module's usage.""" 289d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania print """ 290d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania To plot the result using the iter number of the x axis: 291d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania 292d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania plot_sdcard.py -i /tmp/data.txt 293d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania 294d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania To plot the result using time for the x axis: 295d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania 296d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania plot_sdcard.py -t /tmp/data.txt 297d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania 298d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania To plot the result from the profiler: 299d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania 300d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania profile_sdcard.sh 301d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania plot_sdcard.py -p 302d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania 303d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania """ 304d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania sys.exit(2) 305d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania 306d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania 307d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Cataniadef main(argv): 308d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania try: 309d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania (optlist, args) = getopt.getopt(argv[1:], 310d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania 'itp', ['iteration', 'time', 'profile']) 311d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania except getopt.GetoptError, err: 312d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania print str(err) 313d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania Usage() 314d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania 315d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania for flag, val in optlist: 316d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania if flag in ('-i', '--iteration'): 317d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania (metadata, data) = Parse(args[0]) 318d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania PlotIterations(metadata, data) 319d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania sys.exit(0) 320d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania elif flag in ('-t', '--time'): 321d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania (metadata, data) = Parse(args[0]) 322d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania PlotTimes(metadata, data) 323d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania sys.exit(0) 324d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania elif flag in ('-p', '--profile'): 325d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania PlotProfile() 326d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania sys.exit(0) 327d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania Usage() 328d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania 329d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania 330d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Cataniaif __name__ == '__main__': 331d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania main(sys.argv) 332