28
28
import os
29
29
import time
30
30
import re
31
+ import signal
31
32
import sys
32
33
import getopt
33
34
import Gnuplot
@@ -78,11 +79,12 @@ def print_help():
78
79
print (' Or' )
79
80
print (' ./intel_pstate_tracer.py [--cpu cpus] ---trace_file <trace_file> --name <test_name>' )
80
81
print (' To generate trace file, parse and plot, use (sudo required):' )
81
- print (' sudo ./intel_pstate_tracer.py [-c cpus] -i <interval> -n <test_name>' )
82
+ print (' sudo ./intel_pstate_tracer.py [-c cpus] -i <interval> -n <test_name> -m <kbytes> ' )
82
83
print (' Or' )
83
- print (' sudo ./intel_pstate_tracer.py [--cpu cpus] --interval <interval> --name <test_name>' )
84
+ print (' sudo ./intel_pstate_tracer.py [--cpu cpus] --interval <interval> --name <test_name> --memory <kbytes> ' )
84
85
print (' Optional argument:' )
85
- print (' cpus: comma separated list of CPUs' )
86
+ print (' cpus: comma separated list of CPUs' )
87
+ print (' kbytes: Kilo bytes of memory per CPU to allocate to the trace buffer. Default: 10240' )
86
88
print (' Output:' )
87
89
print (' If not already present, creates a "results/test_name" folder in the current working directory with:' )
88
90
print (' cpu.csv - comma seperated values file with trace contents and some additional calculations.' )
@@ -379,7 +381,7 @@ def clear_trace_file():
379
381
f_handle .close ()
380
382
except :
381
383
print ('IO error clearing trace file ' )
382
- quit ( )
384
+ sys . exit ( 2 )
383
385
384
386
def enable_trace ():
385
387
""" Enable trace """
@@ -389,7 +391,7 @@ def enable_trace():
389
391
, 'w' ).write ("1" )
390
392
except :
391
393
print ('IO error enabling trace ' )
392
- quit ( )
394
+ sys . exit ( 2 )
393
395
394
396
def disable_trace ():
395
397
""" Disable trace """
@@ -399,17 +401,17 @@ def disable_trace():
399
401
, 'w' ).write ("0" )
400
402
except :
401
403
print ('IO error disabling trace ' )
402
- quit ( )
404
+ sys . exit ( 2 )
403
405
404
406
def set_trace_buffer_size ():
405
407
""" Set trace buffer size """
406
408
407
409
try :
408
- open ('/sys/kernel/debug/tracing/buffer_size_kb'
409
- , 'w' ) .write ("10240" )
410
+ with open ('/sys/kernel/debug/tracing/buffer_size_kb' , 'w' ) as fp :
411
+ fp .write (memory )
410
412
except :
411
- print ('IO error setting trace buffer size ' )
412
- quit ( )
413
+ print ('IO error setting trace buffer size ' )
414
+ sys . exit ( 2 )
413
415
414
416
def free_trace_buffer ():
415
417
""" Free the trace buffer memory """
@@ -418,8 +420,8 @@ def free_trace_buffer():
418
420
open ('/sys/kernel/debug/tracing/buffer_size_kb'
419
421
, 'w' ).write ("1" )
420
422
except :
421
- print ('IO error setting trace buffer size ' )
422
- quit ( )
423
+ print ('IO error freeing trace buffer ' )
424
+ sys . exit ( 2 )
423
425
424
426
def read_trace_data (filename ):
425
427
""" Read and parse trace data """
@@ -431,7 +433,7 @@ def read_trace_data(filename):
431
433
data = open (filename , 'r' ).read ()
432
434
except :
433
435
print ('Error opening ' , filename )
434
- quit ( )
436
+ sys . exit ( 2 )
435
437
436
438
for line in data .splitlines ():
437
439
search_obj = \
@@ -489,10 +491,22 @@ def read_trace_data(filename):
489
491
# Now seperate the main overall csv file into per CPU csv files.
490
492
split_csv ()
491
493
494
+ def signal_handler (signal , frame ):
495
+ print (' SIGINT: Forcing cleanup before exit.' )
496
+ if interval :
497
+ disable_trace ()
498
+ clear_trace_file ()
499
+ # Free the memory
500
+ free_trace_buffer ()
501
+ sys .exit (0 )
502
+
503
+ signal .signal (signal .SIGINT , signal_handler )
504
+
492
505
interval = ""
493
506
filename = ""
494
507
cpu_list = ""
495
508
testname = ""
509
+ memory = "10240"
496
510
graph_data_present = False ;
497
511
498
512
valid1 = False
@@ -501,7 +515,7 @@ def read_trace_data(filename):
501
515
cpu_mask = zeros ((MAX_CPUS ,), dtype = int )
502
516
503
517
try :
504
- opts , args = getopt .getopt (sys .argv [1 :],"ht:i:c:n:" ,["help" ,"trace_file=" ,"interval=" ,"cpu=" ,"name=" ])
518
+ opts , args = getopt .getopt (sys .argv [1 :],"ht:i:c:n:m: " ,["help" ,"trace_file=" ,"interval=" ,"cpu=" ,"name=" , "memory =" ])
505
519
except getopt .GetoptError :
506
520
print_help ()
507
521
sys .exit (2 )
@@ -521,6 +535,8 @@ def read_trace_data(filename):
521
535
elif opt in ("-n" , "--name" ):
522
536
valid2 = True
523
537
testname = arg
538
+ elif opt in ("-m" , "--memory" ):
539
+ memory = arg
524
540
525
541
if not (valid1 and valid2 ):
526
542
print_help ()
@@ -569,6 +585,11 @@ def read_trace_data(filename):
569
585
570
586
read_trace_data (filename )
571
587
588
+ clear_trace_file ()
589
+ # Free the memory
590
+ if interval :
591
+ free_trace_buffer ()
592
+
572
593
if graph_data_present == False :
573
594
print ('No valid data to plot' )
574
595
sys .exit (2 )
@@ -593,9 +614,4 @@ def read_trace_data(filename):
593
614
for f in files :
594
615
fix_ownership (f )
595
616
596
- clear_trace_file ()
597
- # Free the memory
598
- if interval :
599
- free_trace_buffer ()
600
-
601
617
os .chdir ('../../' )
0 commit comments