1#!/usr/bin/env python3 2''' This Python script interprets various sched stats values. 3 Validates cpu consolidation for given sched_mc_power_saving value 4''' 5 6import os 7import sys 8import time 9from optparse import OptionParser 10from pm_sched_mc import * 11 12__author__ = "Poornima Nayak <mpnayak@linux.vnet.ibm.com>" 13 14class Usage(Exception): 15 def __init__(self, msg): 16 self.msg = msg 17 18def main(argv=None): 19 if argv is None: 20 argv = sys.argv 21 22 usage = "-w" 23 parser = OptionParser(usage) 24 parser.add_option("-v", "--variation_test", dest="vary_mc_smt", 25 default=False, action="store_true", help="Vary sched_mc & sched_smt. \ 26 -c and -t inputs are initial value of sched_mc & sched_smt") 27 parser.add_option("-c", "--mc_value", dest="mc_value", 28 default=0, help="Sched mc power saving value 0/1/2") 29 parser.add_option("-t", "--smt_value", dest="smt_value", 30 default=0, help="Sched smt power saving value 0/1/2") 31 parser.add_option("-w", "--workload", dest="work_ld", 32 default="ebizzy", help="Workload can be ebizzy/kernbench") 33 parser.add_option("-s", "--stress", dest="stress", 34 default="partial", help="Load on system is full/partial [i.e 50%]/thread") 35 parser.add_option("-p", "--performance", dest="perf_test", 36 default=False, action="store_true", help="Enable performance test") 37 (options, args) = parser.parse_args() 38 39 try: 40 count_num_cpu() 41 count_num_sockets() 42 if is_hyper_threaded(): 43 generate_sibling_list() 44 45 # User should set option -v to test cpu consolidation 46 # resets when sched_mc &(/) sched_smt is disabled when 47 # workload is already running in the system 48 49 if options.vary_mc_smt: 50 51 # Since same code is used for testing package consolidation and core 52 # consolidation is_multi_socket & is_hyper_threaded check is done 53 if is_multi_socket() and is_multi_core() and options.mc_value: 54 set_sched_mc_power(options.mc_value) 55 56 if is_hyper_threaded() and options.smt_value: 57 set_sched_smt_power(options.smt_value) 58 59 #Generate arguments for trigger workload, run workload in background 60 map_cpuid_pkgid() 61 background="yes" 62 duration=360 63 pinned="no" 64 if int(options.mc_value) < 2 and int(options.smt_value) < 2: 65 trigger_ebizzy (options.smt_value, "partial", duration, background, pinned) 66 work_ld="ebizzy" 67 #Wait for 120 seconds and then validate cpu consolidation works 68 #When sched_mc & sched_smt is set 69 import time 70 time.sleep(120) 71 else: 72 #Wait for 120 seconds and then validate cpu consolidation works 73 #When sched_mc & sched_smt is set 74 trigger_kernbench (options.smt_value, "partial", background, pinned, "no") 75 work_ld="kernbench" 76 import time 77 time.sleep(300) 78 79 generate_report() 80 status = validate_cpu_consolidation("partial", work_ld, options.mc_value, options.smt_value) 81 if status == 0: 82 print("INFO: Consolidation worked sched_smt &(/) sched_mc is set") 83 #Disable sched_smt & sched_mc interface values 84 if options.vary_mc_smt and options.mc_value > 0: 85 set_sched_mc_power(0) 86 mc_value = options.mc_value 87 else: 88 mc_value = 0 89 if options.vary_mc_smt and options.smt_value > 0 and is_hyper_threaded(): 90 set_sched_smt_power(0) 91 smt_value = options.smt_value 92 else: 93 smt_value = 0 94 95 if work_ld == "kernbench": 96 time.sleep(240) 97 else: 98 time.sleep(120) 99 100 generate_report() 101 status = validate_cpu_consolidation("partial", work_ld, mc_value, smt_value) 102 if background == "yes": 103 stop_wkld(work_ld) 104 #CPU consolidation should fail as sched_mc &(/) sched_smt is disabled 105 if status == 1: 106 return(0) 107 else: 108 return(1) 109 else: 110 print("INFO: CPU consolidation failed when sched_mc &(/) \ 111sched_smt was enabled. This is pre-requisite to proceed") 112 return(status) 113 else: 114 #The else part of the code validates behaviour of sched_mc 115 # and sched_smt set to 0, 1 & 2 116 if is_multi_socket(): 117 set_sched_mc_power(options.mc_value) 118 if is_hyper_threaded(): 119 set_sched_smt_power(options.smt_value) 120 map_cpuid_pkgid() 121 print("INFO: Created table mapping cpu to package") 122 background="no" 123 duration=60 124 pinned ="no" 125 126 if options.perf_test: 127 perf_test="yes" 128 else: 129 perf_test="no" 130 131 trigger_workld( options.smt_value, options.work_ld, options.stress, duration, background, pinned, perf_test) 132 generate_report() 133 status = validate_cpu_consolidation(options.stress, options.work_ld,options.mc_value, options.smt_value) 134 reset_schedmc() 135 if is_hyper_threaded(): 136 reset_schedsmt() 137 return(status) 138 except Exception as details: 139 print("INFO: CPU consolidation failed", details) 140 return(1) 141 142if __name__ == "__main__": 143 sys.exit(main()) 144