diff options
Diffstat (limited to 'parse/sched.py')
-rw-r--r-- | parse/sched.py | 74 |
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 | |||
4 | import struct | 4 | import struct |
5 | import subprocess | 5 | import subprocess |
6 | 6 | ||
7 | import scipy.stats as stats | ||
8 | import numpy as np | ||
9 | |||
7 | from collections import defaultdict,namedtuple | 10 | from collections import defaultdict,namedtuple |
8 | from common import recordtype,log_once | 11 | from common import recordtype,log_once |
9 | from point import Measurement | 12 | from 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(): |