#!/usr/bin/env python3 ''' This Python script interprets various sched stats values. Validates cpu consolidation for given sched_mc_power_saving value ''' import os import sys import time from optparse import OptionParser from pm_sched_mc import * __author__ = "Poornima Nayak <mpnayak@linux.vnet.ibm.com>" class Usage(Exception): def __init__(self, msg): self.msg = msg def main(argv=None): if argv is None: argv = sys.argv usage = "-w" parser = OptionParser(usage) parser.add_option("-v", "--variation_test", dest="vary_mc_smt", default=False, action="store_true", help="Vary sched_mc & sched_smt. \ -c and -t inputs are initial value of sched_mc & sched_smt") parser.add_option("-c", "--mc_value", dest="mc_value", default=0, help="Sched mc power saving value 0/1/2") parser.add_option("-t", "--smt_value", dest="smt_value", default=0, help="Sched smt power saving value 0/1/2") parser.add_option("-w", "--workload", dest="work_ld", default="ebizzy", help="Workload can be ebizzy/kernbench") parser.add_option("-s", "--stress", dest="stress", default="partial", help="Load on system is full/partial [i.e 50%]/thread") parser.add_option("-p", "--performance", dest="perf_test", default=False, action="store_true", help="Enable performance test") (options, args) = parser.parse_args() try: count_num_cpu() count_num_sockets() if is_hyper_threaded(): generate_sibling_list() # User should set option -v to test cpu consolidation # resets when sched_mc &(/) sched_smt is disabled when # workload is already running in the system if options.vary_mc_smt: # Since same code is used for testing package consolidation and core # consolidation is_multi_socket & is_hyper_threaded check is done if is_multi_socket() and is_multi_core() and options.mc_value: set_sched_mc_power(options.mc_value) if is_hyper_threaded() and options.smt_value: set_sched_smt_power(options.smt_value) #Generate arguments for trigger workload, run workload in background map_cpuid_pkgid() background="yes" duration=360 pinned="no" if int(options.mc_value) < 2 and int(options.smt_value) < 2: trigger_ebizzy (options.smt_value, "partial", duration, background, pinned) work_ld="ebizzy" #Wait for 120 seconds and then validate cpu consolidation works #When sched_mc & sched_smt is set import time time.sleep(120) else: #Wait for 120 seconds and then validate cpu consolidation works #When sched_mc & sched_smt is set trigger_kernbench (options.smt_value, "partial", background, pinned, "no") work_ld="kernbench" import time time.sleep(300) generate_report() status = validate_cpu_consolidation("partial", work_ld, options.mc_value, options.smt_value) if status == 0: print("INFO: Consolidation worked sched_smt &(/) sched_mc is set") #Disable sched_smt & sched_mc interface values if options.vary_mc_smt and options.mc_value > 0: set_sched_mc_power(0) mc_value = options.mc_value else: mc_value = 0 if options.vary_mc_smt and options.smt_value > 0 and is_hyper_threaded(): set_sched_smt_power(0) smt_value = options.smt_value else: smt_value = 0 if work_ld == "kernbench": time.sleep(240) else: time.sleep(120) generate_report() status = validate_cpu_consolidation("partial", work_ld, mc_value, smt_value) if background == "yes": stop_wkld(work_ld) #CPU consolidation should fail as sched_mc &(/) sched_smt is disabled if status == 1: return(0) else: return(1) else: print("INFO: CPU consolidation failed when sched_mc &(/) \ sched_smt was enabled. This is pre-requisite to proceed") return(status) else: #The else part of the code validates behaviour of sched_mc # and sched_smt set to 0, 1 & 2 if is_multi_socket(): set_sched_mc_power(options.mc_value) if is_hyper_threaded(): set_sched_smt_power(options.smt_value) map_cpuid_pkgid() print("INFO: Created table mapping cpu to package") background="no" duration=60 pinned ="no" if options.perf_test: perf_test="yes" else: perf_test="no" trigger_workld( options.smt_value, options.work_ld, options.stress, duration, background, pinned, perf_test) generate_report() status = validate_cpu_consolidation(options.stress, options.work_ld,options.mc_value, options.smt_value) reset_schedmc() if is_hyper_threaded(): reset_schedsmt() return(status) except Exception as details: print("INFO: CPU consolidation failed", details) return(1) if __name__ == "__main__": sys.exit(main())