aboutsummaryrefslogtreecommitdiffstats
path: root/parse/sched.py
diff options
context:
space:
mode:
Diffstat (limited to 'parse/sched.py')
-rw-r--r--parse/sched.py74
1 files changed, 52 insertions, 22 deletions
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
4import struct 4import struct
5import subprocess 5import subprocess
6 6
7import scipy.stats as stats
8import numpy as np
9
7from collections import defaultdict,namedtuple 10from collections import defaultdict,namedtuple
8from common import recordtype,log_once 11from common import recordtype,log_once
9from point import Measurement 12from point import Measurement
@@ -16,6 +19,8 @@ class TimeTracker:
16 def __init__(self, is_valid_duration = lambda x: True, delay_buffer_size = 1, max_pending = -1): 19 def __init__(self, is_valid_duration = lambda x: True, delay_buffer_size = 1, max_pending = -1):
17 self.validator = is_valid_duration 20 self.validator = is_valid_duration
18 self.avg = self.max = self.num = 0 21 self.avg = self.max = self.num = 0
22 self.all_measurements = []
23 self.all_measurements_arr = None
19 24
20 self.matches = 0 25 self.matches = 0
21 26
@@ -32,6 +37,18 @@ class TimeTracker:
32 unmatched = len(self.start_records) + len(self.end_records) 37 unmatched = len(self.start_records) + len(self.end_records)
33 return self.discarded + unmatched 38 return self.discarded + unmatched
34 39
40 def stdev(self):
41 if self.all_measurements_arr is None:
42 self.all_measurements_arr = np.asarray(self.all_measurements)
43 self.all_measurements_arr.sort()
44 return np.std(self.all_measurements_arr)
45
46 def percentile(self, which):
47 if self.all_measurements_arr is None:
48 self.all_measurements_arr = np.asarray(self.all_measurements)
49 self.all_measurements_arr.sort()
50 return stats.scoreatpercentile(self.all_measurements_arr, which)
51
35 def process_completed(self): 52 def process_completed(self):
36 completed = self.start_records.viewkeys() & self.end_records.viewkeys() 53 completed = self.start_records.viewkeys() & self.end_records.viewkeys()
37 self.matches += len(completed) 54 self.matches += len(completed)
@@ -47,6 +64,7 @@ class TimeTracker:
47 old_avg = self.avg * self.num 64 old_avg = self.avg * self.num
48 self.num += 1 65 self.num += 1
49 self.avg = (old_avg + dur) / float(self.num) 66 self.avg = (old_avg + dur) / float(self.num)
67 self.all_measurements.append(dur)
50 68
51 # Give up on some jobs if they've been hanging around too long. 69 # Give up on some jobs if they've been hanging around too long.
52 # While not strictly needed, it helps improve performance and 70 # While not strictly needed, it helps improve performance and
@@ -423,38 +441,41 @@ def extract_sched_data(result, data_dir, work_dir):
423 # start with basic task information 441 # start with basic task information
424 stat_data["miss-ratio" ].append(miss_ratio) 442 stat_data["miss-ratio" ].append(miss_ratio)
425 443
426 stat_data["response-max"].append(float(response.max)/NSEC_PER_MSEC) 444# WE DON'T REALLY CARE ABOUT THESE VALUES IN PGM
427 stat_data["response-avg"].append(response.avg/NSEC_PER_MSEC) 445# stat_data["response-max"].append(float(response.max)/NSEC_PER_MSEC)
428 stat_data["response-prop-max"].append(float(response.max) / tdata.params.period) 446# stat_data["response-avg"].append(response.avg/NSEC_PER_MSEC)
429 stat_data["response-prop-avg"].append(response.avg / tdata.params.period) 447# stat_data["response-prop-max"].append(float(response.max) / tdata.params.period)
430 448# stat_data["response-prop-avg"].append(response.avg / tdata.params.period)
431 stat_data["tard-max"].append(float(miss.max)/NSEC_PER_MSEC) 449#
432 stat_data["tard-avg"].append(avg_tard/NSEC_PER_MSEC) 450# stat_data["tard-max"].append(float(miss.max)/NSEC_PER_MSEC)
433 stat_data["tard-prop-max"].append(float(miss.max) / tdata.params.period) 451# stat_data["tard-avg"].append(avg_tard/NSEC_PER_MSEC)
434 stat_data["tard-prop-avg"].append(avg_tard / tdata.params.period) 452# stat_data["tard-prop-max"].append(float(miss.max) / tdata.params.period)
435 453# stat_data["tard-prop-avg"].append(avg_tard / tdata.params.period)
436 stat_data["lateness-max"].append(float(lateness.max)/NSEC_PER_MSEC) 454#
437 stat_data["lateness-avg"].append(lateness.avg/NSEC_PER_MSEC) 455# stat_data["lateness-max"].append(float(lateness.max)/NSEC_PER_MSEC)
438 stat_data["lateness-prop-max"].append(float(lateness.max) / tdata.params.period) 456# stat_data["lateness-avg"].append(lateness.avg/NSEC_PER_MSEC)
439 stat_data["lateness-prop-avg"].append(lateness.avg / tdata.params.period) 457# stat_data["lateness-prop-max"].append(float(lateness.max) / tdata.params.period)
458# stat_data["lateness-prop-avg"].append(lateness.avg / tdata.params.period)
440 459
441 # same data, but with PGM-adjusted release times (shifted deadlines) 460 # same data, but with PGM-adjusted release times (shifted deadlines)
442 stat_data["pgm-miss-ratio" ].append(pgm_miss_ratio) 461 stat_data["pgm-miss-ratio" ].append(pgm_miss_ratio)
443 462
444 stat_data["pgm-response-max"].append(float(pgm_response.max)/NSEC_PER_MSEC) 463 stat_data["pgm-response-max"].append(float(pgm_response.max)/NSEC_PER_MSEC)
445 stat_data["pgm-response-avg"].append(pgm_response.avg/NSEC_PER_MSEC) 464 stat_data["pgm-response-avg"].append(pgm_response.avg/NSEC_PER_MSEC)
465 stat_data["pgm-response-std"].append(pgm_response.stdev()/NSEC_PER_MSEC)
446 stat_data["pgm-response-prop-max"].append(float(pgm_response.max) / tdata.params.period) 466 stat_data["pgm-response-prop-max"].append(float(pgm_response.max) / tdata.params.period)
447 stat_data["pgm-response-prop-avg"].append(pgm_response.avg / tdata.params.period) 467 stat_data["pgm-response-prop-avg"].append(pgm_response.avg / tdata.params.period)
468 stat_data["pgm-response-prop-std"].append(pgm_response.stdev()/ tdata.params.period)
448 469
449 stat_data["pgm-tard-max"].append(float(pgm_miss.max)/NSEC_PER_MSEC) 470# stat_data["pgm-tard-max"].append(float(pgm_miss.max)/NSEC_PER_MSEC)
450 stat_data["pgm-tard-avg"].append(pgm_avg_tard/NSEC_PER_MSEC) 471# stat_data["pgm-tard-avg"].append(pgm_avg_tard/NSEC_PER_MSEC)
451 stat_data["pgm-tard-prop-max"].append(float(pgm_miss.max) / tdata.params.period) 472# stat_data["pgm-tard-prop-max"].append(float(pgm_miss.max) / tdata.params.period)
452 stat_data["pgm-tard-prop-avg"].append(pgm_avg_tard / tdata.params.period) 473# stat_data["pgm-tard-prop-avg"].append(pgm_avg_tard / tdata.params.period)
453 474
454 stat_data["pgm-lateness-max"].append(float(pgm_lateness.max)/NSEC_PER_MSEC) 475# stat_data["pgm-lateness-max"].append(float(pgm_lateness.max)/NSEC_PER_MSEC)
455 stat_data["pgm-lateness-avg"].append(pgm_lateness.avg/NSEC_PER_MSEC) 476# stat_data["pgm-lateness-avg"].append(pgm_lateness.avg/NSEC_PER_MSEC)
456 stat_data["pgm-lateness-prop-max"].append(float(pgm_lateness.max) / tdata.params.period) 477# stat_data["pgm-lateness-prop-max"].append(float(pgm_lateness.max) / tdata.params.period)
457 stat_data["pgm-lateness-prop-avg"].append(pgm_lateness.avg / tdata.params.period) 478# stat_data["pgm-lateness-prop-avg"].append(pgm_lateness.avg / tdata.params.period)
458 479
459 for gid, gdata in graph_dict.iteritems(): 480 for gid, gdata in graph_dict.iteritems():
460 if not gdata.params: 481 if not gdata.params:
@@ -471,9 +492,18 @@ def extract_sched_data(result, data_dir, work_dir):
471 continue 492 continue
472 493
473 gstat_data["graph-response-max"].append(float(response.max)/NSEC_PER_MSEC) 494 gstat_data["graph-response-max"].append(float(response.max)/NSEC_PER_MSEC)
495 gstat_data["graph-response-99p9tile"].append(float(response.percentile(99.9))/NSEC_PER_MSEC)
496 gstat_data["graph-response-99tile"].append(float(response.percentile(99))/NSEC_PER_MSEC)
497 gstat_data["graph-response-95tile"].append(float(response.percentile(95))/NSEC_PER_MSEC)
474 gstat_data["graph-response-avg"].append(response.avg/NSEC_PER_MSEC) 498 gstat_data["graph-response-avg"].append(response.avg/NSEC_PER_MSEC)
499 gstat_data["graph-response-std"].append(response.stdev()/NSEC_PER_MSEC)
500
475 gstat_data["graph-response-prop-max"].append(float(response.max) / gdata.params.etoe) 501 gstat_data["graph-response-prop-max"].append(float(response.max) / gdata.params.etoe)
502 gstat_data["graph-response-prop-99p9tile"].append(float(response.percentile(99.9))/ gdata.params.etoe)
503 gstat_data["graph-response-prop-99tile"].append(float(response.percentile(99))/ gdata.params.etoe)
504 gstat_data["graph-response-prop-95tile"].append(float(response.percentile(95))/ gdata.params.etoe)
476 gstat_data["graph-response-prop-avg"].append(response.avg / gdata.params.etoe) 505 gstat_data["graph-response-prop-avg"].append(response.avg / gdata.params.etoe)
506 gstat_data["graph-response-prop-std"].append(response.stdev()/ gdata.params.etoe)
477 507
478 # Summarize value groups 508 # Summarize value groups
479 for name, data in stat_data.iteritems(): 509 for name, data in stat_data.iteritems():