CMS 3D CMS Logo

cmsIgProf_Analysis.py
Go to the documentation of this file.
1 #! /usr/bin/env python
2 
3 # Import statements. An '''Analogue''' of the include c++ statement,
4 # but really really not the same!
5 # In python everything is an object, even if we don't know.
6 # os and time will become 2 objects for us.
7 
8 from __future__ import print_function
9 import os,sys
10 import time
11 
12 IgProfProfile={'PERF_TICKS':'IgProfPerf',
13  'MEM_TOTAL':'IgProfMem',
14  'MEM_LIVE':'IgProfMem',
15  'MEM_MAX':'IgProfMem'
16  }
17 
18 def execute(command):
19  print('[IgAnalysis] %s ...' %command)
20  sys.stdout.flush()
21  exitstate=os.system(command)
22  return exitstate
23 
24 def simple_igprof_analysis(profile_name,AnalysisType,output_type):
25 
26  """This function takes as arguments:
27  -a compressed (.gz) igprof output profile
28  -the output directory where to store the output
29  -the type of output wanted
30  Based on this information it automatically selects the igprof counter
31  (PERF_TICKS, MEM_TOTAL or MEM_LIVE) to use with igprof-analyse and it
32  performs the analysis.
33  If ASCII output_type is given, it keeps only the first seven lines of
34  the output file (the report) allowing quick access to the totals for
35  the counters in order to put together summary tables.
36  If SQLite3 output_type is given, it simply dumps the full reports in
37  sqlite3 format, ready to be browsed by igprof-navigator GUI (standalone
38  or cgi-bin).
39  """
40  #Use profile input file to determine the name of the output file adding the counter to it:
41  #outfile=profile_name[:-3]+"___"+AnalysisType+".res"
42  outfile=profile_name.split(".")[0].replace(IgProfProfile[AnalysisType],AnalysisType)+".res"
43  #Launch the 1 command:
44 
45  #command='igprof-analyse -d -v -g -r %s %s|tee -a \%s'%(AnalysisType,profile_name,outfile)
46  #Replacing tee: it is polluting the log files...
47 
48  #igprof-analyse command depends on the output type desired:
49  if output_type =="SQLite3":
50  #Case of dumping the igprof-analyse report in sqlite format to be igprof-navigator browseable
51  outfile= outfile[:-3]+"sql3" #NEED TO USE sql3 to be compatible with CGI-BIN igprof-navigator
52  command='igprof-analyse --sqlite -d -v -g -r %s %s |sqlite3 %s'%(AnalysisType,profile_name,outfile)
53  #Execute the igprof-analyse command
54  exit=execute(command)
55  elif output_type =="ASCII":
56  #We can keep this part of the igprof-analysis, to create the html table with the totals at each dump
57  command='igprof-analyse -d -v -g -r %s %s > %s'%(AnalysisType,profile_name,outfile)
58  #Execute the igprof-analyse command
59  exit=execute(command)
60  #Let's manipulate the ASCII output to only keep the top 7 lines:
61  # we open and read the txt ascii file
62  print("Reading the res file")
63  txt_file=open(outfile,'r')
64  txt_file_content=txt_file.readlines()#again:everything is an object
65  print("res file has %s lines!"%len(txt_file_content))
66  txt_file.close()
67  #overwrite the file to only save the first 7 lines:
68  print("Overwriting the res file, to reduce it to 7 lines")
69  out_file=open(outfile,'w')
70  line_num=0
71  for line in txt_file_content:
72  out_file.write(line)
73  line_num+=1
74  if line_num == 7:
75  break
76  out_file.close()
77 
78  return exit
79 
80 def diff_igprof_analysis(profile_name,regression_profile_name,AnalysisType):
81 
82  """
83  This function takes as arguments:
84  -a compressed (.gz) igprof output profile
85  -a second compressed (.gz) igprof output profile against which a regression analysis is intended to be done
86  -the output directory where to store the output of the regression analysis
87  Based on this information it automatically selects the igprof counter (PERF_TICKS, MEM_TOTAL or MEM_LIVE) to use
88  with igprof-analyse and it performs the regression analysis with SQLite3 output.
89  """
90  #Following Giulio's filename convention:
91  outfile=profile_name.split(".")[0].replace(IgProfProfile[AnalysisType],AnalysisType)+"_diff_"+regression_profile_name.split(".")[0].split("___")[-1]+".sql3"
92  command='igprof-analyse --sqlite -d -v -g --diff-mode -b %s -r %s %s |sqlite3 %s'%(regression_profile_name, AnalysisType,profile_name,outfile)
93  exit=execute(command)
94 
95  return exit
96 def library_igprof_analysis(profile_name,AnalysisType):
97 
98  """
99  This function takes as arguments:
100  -a compressed (.gz) igprof output profile
101  -the output directory where to store the output of the igprof-analysis merging the results by library
102  Based on this information it automatically selects the igprof counter (PERF_TICKS, MEM_TOTAL or MEM_LIVE) to use
103  with igprof-analyse and it performs the igprof-analyse analysis merging the results by library and saving the results
104  in the usual igprof-navigator browseable SQLite3 format.
105  """
106  #Following Giulio's filename convention:
107  outfile=profile_name.split(".")[0].replace(IgProfProfile[AnalysisType],AnalysisType)+"_merged"+".sql3"
108  #Regular Expression supplied by Giulio:
109  command="igprof-analyse --sqlite -d -v -g -r %s -ml -mr 's|.*/(.*)$|\\1|' %s |sqlite3 %s"%(AnalysisType,profile_name,outfile)
110  exit=execute(command)
111 
112  return exit
113 #-------------------------------------------------------------------------------
114 
115 # A procedure used for importing the function above with the import statement
116 # or to run it if the script is called: power python..
117 if __name__ == '__main__':
118 
119  import optparse
120 
121  # Here we define an option parser to handle commandline options..
122  usage='IgProf_Analysis.py <options>'
123  parser = optparse.OptionParser(usage)
124  parser.add_option('-i', '--in_ profile',
125  help='The profile to manipulate' ,
126  default='',
127  dest='profile')
128 
129  parser.add_option('-c', '--counter',
130  help='The IgProf counter for the analysis (PERF_TICKS,MEM_TOTAL,MEM_LIVE,MEM_MAX)' ,
131  default='UNKNOWN_COUNTER',
132  dest='counter')
133  parser.add_option('-t', '--output_type',
134  help='The type of the output file (ASCII or sqlite3)' ,
135  default='',
136  dest='output_type')
137  parser.add_option('-r', '--regression',
138  help='The IgProf output file to make a regression analysis against' ,
139  default='',
140  dest='regressionprofile')
141  parser.add_option('-l','--library',
142  help='Perform igprof-analyse merging the results by library',
143  action='store_true',
144  default=False,
145  dest='library')
146  (options,args) = parser.parse_args()
147 
148  # Now some fault control..If an error is found we raise an exception
149  if options.profile=='':
150  raise('Please select a profile, an output dir AND a type of output (ASCII or SQLITE3)!')
151 
152  if not os.path.exists(options.profile):
153  raise ('Input profile not present!')
154 
155  AnalysisType=options.counter
156 
157  print("Input file is %s and AnalysisType is %s"%(options.profile,AnalysisType))
158 
159  #launch the function!
160  if options.regressionprofile:
161  diff_igprof_analysis(options.profile,options.regressionprofile,AnalysisType)
162  elif options.library:
163  library_igprof_analysis(options.profile,AnalysisType)
164  else:
165  simple_igprof_analysis(options.profile,AnalysisType,options.output_type)
166 
def library_igprof_analysis(profile_name, AnalysisType)
def replace(string, replacements)
S & print(S &os, JobReport::InputFile const &f)
Definition: JobReport.cc:66
def simple_igprof_analysis(profile_name, AnalysisType, output_type)
def diff_igprof_analysis(profile_name, regression_profile_name, AnalysisType)
double split
Definition: MVATrainer.cc:139