From c55e81ec12f80f60846b251aa7bbe0f6c044e7e8 Mon Sep 17 00:00:00 2001 From: Glenn Elliott Date: Wed, 29 Jan 2014 23:25:46 -0500 Subject: Compute stats for response time percentiles --- parse/sched.py | 74 +++++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 52 insertions(+), 22 deletions(-) (limited to 'parse') diff --git a/parse/sched.py b/parse/sched.py index 11a614e..49a945b 100644 --- a/parse/sched.py +++ b/parse/sched.py @@ -4,6 +4,9 @@ import re import struct import subprocess +import scipy.stats as stats +import numpy as np + from collections import defaultdict,namedtuple from common import recordtype,log_once from point import Measurement @@ -16,6 +19,8 @@ class TimeTracker: def __init__(self, is_valid_duration = lambda x: True, delay_buffer_size = 1, max_pending = -1): self.validator = is_valid_duration self.avg = self.max = self.num = 0 + self.all_measurements = [] + self.all_measurements_arr = None self.matches = 0 @@ -32,6 +37,18 @@ class TimeTracker: unmatched = len(self.start_records) + len(self.end_records) return self.discarded + unmatched + def stdev(self): + if self.all_measurements_arr is None: + self.all_measurements_arr = np.asarray(self.all_measurements) + self.all_measurements_arr.sort() + return np.std(self.all_measurements_arr) + + def percentile(self, which): + if self.all_measurements_arr is None: + self.all_measurements_arr = np.asarray(self.all_measurements) + self.all_measurements_arr.sort() + return stats.scoreatpercentile(self.all_measurements_arr, which) + def process_completed(self): completed = self.start_records.viewkeys() & self.end_records.viewkeys() self.matches += len(completed) @@ -47,6 +64,7 @@ class TimeTracker: old_avg = self.avg * self.num self.num += 1 self.avg = (old_avg + dur) / float(self.num) + self.all_measurements.append(dur) # Give up on some jobs if they've been hanging around too long. # While not strictly needed, it helps improve performance and @@ -423,38 +441,41 @@ def extract_sched_data(result, data_dir, work_dir): # start with basic task information stat_data["miss-ratio" ].append(miss_ratio) - stat_data["response-max"].append(float(response.max)/NSEC_PER_MSEC) - stat_data["response-avg"].append(response.avg/NSEC_PER_MSEC) - stat_data["response-prop-max"].append(float(response.max) / tdata.params.period) - stat_data["response-prop-avg"].append(response.avg / tdata.params.period) - - stat_data["tard-max"].append(float(miss.max)/NSEC_PER_MSEC) - stat_data["tard-avg"].append(avg_tard/NSEC_PER_MSEC) - stat_data["tard-prop-max"].append(float(miss.max) / tdata.params.period) - stat_data["tard-prop-avg"].append(avg_tard / tdata.params.period) - - stat_data["lateness-max"].append(float(lateness.max)/NSEC_PER_MSEC) - stat_data["lateness-avg"].append(lateness.avg/NSEC_PER_MSEC) - stat_data["lateness-prop-max"].append(float(lateness.max) / tdata.params.period) - stat_data["lateness-prop-avg"].append(lateness.avg / tdata.params.period) +# WE DON'T REALLY CARE ABOUT THESE VALUES IN PGM +# stat_data["response-max"].append(float(response.max)/NSEC_PER_MSEC) +# stat_data["response-avg"].append(response.avg/NSEC_PER_MSEC) +# stat_data["response-prop-max"].append(float(response.max) / tdata.params.period) +# stat_data["response-prop-avg"].append(response.avg / tdata.params.period) +# +# stat_data["tard-max"].append(float(miss.max)/NSEC_PER_MSEC) +# stat_data["tard-avg"].append(avg_tard/NSEC_PER_MSEC) +# stat_data["tard-prop-max"].append(float(miss.max) / tdata.params.period) +# stat_data["tard-prop-avg"].append(avg_tard / tdata.params.period) +# +# stat_data["lateness-max"].append(float(lateness.max)/NSEC_PER_MSEC) +# stat_data["lateness-avg"].append(lateness.avg/NSEC_PER_MSEC) +# stat_data["lateness-prop-max"].append(float(lateness.max) / tdata.params.period) +# stat_data["lateness-prop-avg"].append(lateness.avg / tdata.params.period) # same data, but with PGM-adjusted release times (shifted deadlines) stat_data["pgm-miss-ratio" ].append(pgm_miss_ratio) stat_data["pgm-response-max"].append(float(pgm_response.max)/NSEC_PER_MSEC) stat_data["pgm-response-avg"].append(pgm_response.avg/NSEC_PER_MSEC) + stat_data["pgm-response-std"].append(pgm_response.stdev()/NSEC_PER_MSEC) stat_data["pgm-response-prop-max"].append(float(pgm_response.max) / tdata.params.period) stat_data["pgm-response-prop-avg"].append(pgm_response.avg / tdata.params.period) + stat_data["pgm-response-prop-std"].append(pgm_response.stdev()/ tdata.params.period) - stat_data["pgm-tard-max"].append(float(pgm_miss.max)/NSEC_PER_MSEC) - stat_data["pgm-tard-avg"].append(pgm_avg_tard/NSEC_PER_MSEC) - stat_data["pgm-tard-prop-max"].append(float(pgm_miss.max) / tdata.params.period) - stat_data["pgm-tard-prop-avg"].append(pgm_avg_tard / tdata.params.period) +# stat_data["pgm-tard-max"].append(float(pgm_miss.max)/NSEC_PER_MSEC) +# stat_data["pgm-tard-avg"].append(pgm_avg_tard/NSEC_PER_MSEC) +# stat_data["pgm-tard-prop-max"].append(float(pgm_miss.max) / tdata.params.period) +# stat_data["pgm-tard-prop-avg"].append(pgm_avg_tard / tdata.params.period) - stat_data["pgm-lateness-max"].append(float(pgm_lateness.max)/NSEC_PER_MSEC) - stat_data["pgm-lateness-avg"].append(pgm_lateness.avg/NSEC_PER_MSEC) - stat_data["pgm-lateness-prop-max"].append(float(pgm_lateness.max) / tdata.params.period) - stat_data["pgm-lateness-prop-avg"].append(pgm_lateness.avg / tdata.params.period) +# stat_data["pgm-lateness-max"].append(float(pgm_lateness.max)/NSEC_PER_MSEC) +# stat_data["pgm-lateness-avg"].append(pgm_lateness.avg/NSEC_PER_MSEC) +# stat_data["pgm-lateness-prop-max"].append(float(pgm_lateness.max) / tdata.params.period) +# stat_data["pgm-lateness-prop-avg"].append(pgm_lateness.avg / tdata.params.period) for gid, gdata in graph_dict.iteritems(): if not gdata.params: @@ -471,9 +492,18 @@ def extract_sched_data(result, data_dir, work_dir): continue gstat_data["graph-response-max"].append(float(response.max)/NSEC_PER_MSEC) + gstat_data["graph-response-99p9tile"].append(float(response.percentile(99.9))/NSEC_PER_MSEC) + gstat_data["graph-response-99tile"].append(float(response.percentile(99))/NSEC_PER_MSEC) + gstat_data["graph-response-95tile"].append(float(response.percentile(95))/NSEC_PER_MSEC) gstat_data["graph-response-avg"].append(response.avg/NSEC_PER_MSEC) + gstat_data["graph-response-std"].append(response.stdev()/NSEC_PER_MSEC) + gstat_data["graph-response-prop-max"].append(float(response.max) / gdata.params.etoe) + gstat_data["graph-response-prop-99p9tile"].append(float(response.percentile(99.9))/ gdata.params.etoe) + gstat_data["graph-response-prop-99tile"].append(float(response.percentile(99))/ gdata.params.etoe) + gstat_data["graph-response-prop-95tile"].append(float(response.percentile(95))/ gdata.params.etoe) gstat_data["graph-response-prop-avg"].append(response.avg / gdata.params.etoe) + gstat_data["graph-response-prop-std"].append(response.stdev()/ gdata.params.etoe) # Summarize value groups for name, data in stat_data.iteritems(): -- cgit v1.2.2