1919from redisbench_admin .utils .utils import whereis
2020
2121PERF_CALLGRAPH_MODE_DEFAULT = "fp"
22+ PERF_CALLGRAPH_MODE = os .getenv ("PERF_CALLGRAPH_MODE" , PERF_CALLGRAPH_MODE_DEFAULT )
23+ PERF_PROFILE_TIME_DEFAULT = "60"
24+ PERF_PROFILE_TIME = int (os .getenv ("PERF_PROFILE_TIME" , PERF_PROFILE_TIME_DEFAULT ))
2225LINUX_PERF_SETTINGS_MESSAGE = (
2326 "If running in non-root user please confirm that you have:\n "
2427 + " - access to Kernel address maps."
@@ -42,9 +45,8 @@ def __init__(self):
4245
4346 self .stack_collapser = os .getenv ("STACKCOLLAPSE_PATH" , STACKCOLLAPSE_PATH )
4447 self .flamegraph_utity = os .getenv ("FLAMEGRAPH_PATH" , FLAMEGRAPH_PATH )
45- self .callgraph_mode = os .getenv (
46- "PERF_CALLGRAPH_MODE" , PERF_CALLGRAPH_MODE_DEFAULT
47- )
48+ self .callgraph_mode = PERF_CALLGRAPH_MODE
49+ self .default_profile_time = PERF_PROFILE_TIME
4850
4951 self .output = None
5052 self .profiler_process = None
@@ -86,9 +88,15 @@ def retrieve_perf_version(self):
8688 self .version_minor = m .group (2 )
8789 return m , self .version_major , self .version_minor
8890
89- def generate_record_command (self , pid , output , frequency = None ):
91+ def generate_record_command (
92+ self , pid , output , frequency = None , callgraph_mode = None , profile_time = None
93+ ):
9094 self .output = output
9195 self .pid = pid
96+ if callgraph_mode is not None :
97+ self .callgraph_mode = callgraph_mode
98+ if profile_time is not None :
99+ self .default_profile_time = profile_time
92100 cmd = [
93101 self .perf ,
94102 "record" ,
@@ -104,6 +112,8 @@ def generate_record_command(self, pid, output, frequency=None):
104112 ]
105113 if frequency :
106114 cmd += ["--freq" , "{}" .format (frequency )]
115+ if self .default_profile_time :
116+ cmd += ["--" , "sleep" , "{}" .format (self .default_profile_time )]
107117 return cmd
108118
109119 def generate_report_command (
@@ -134,7 +144,9 @@ def generate_report_command(
134144 cmd .extend (extra_options )
135145 return cmd
136146
137- def start_profile (self , pid , output , frequency = 99 ):
147+ def start_profile (
148+ self , pid , output , frequency = 99 , callgraph_mode = None , profile_time = None
149+ ):
138150 """
139151 @param pid: profile events on specified process id
140152 @param output: output file name
@@ -157,7 +169,9 @@ def start_profile(self, pid, output, frequency=99):
157169 "env" : self .environ ,
158170 }
159171
160- args = self .generate_record_command (pid , output , frequency )
172+ args = self .generate_record_command (
173+ pid , output , frequency , callgraph_mode , profile_time
174+ )
161175 self .logger .info (
162176 "Starting profile of pid {} with args {}" .format (pid , args )
163177 )
@@ -193,20 +207,10 @@ def stop_profile(self, **kwargs):
193207 self .profiler_process_exit_code
194208 )
195209 )
196- (
197- self .profiler_process_stdout ,
198- self .profiler_process_stderr ,
199- ) = self .profiler_process .communicate ()
200- self .logger .error (
201- "Profiler stderr: {}" .format (self .profiler_process_stderr )
202- )
203- self .logger .error (
204- "Profiler stdout: {}" .format (self .profiler_process_stdout )
205- )
206- return result
207- try :
210+ else :
208211 self .profiler_process .terminate ()
209212 self .profiler_process .wait ()
213+ try :
210214 (
211215 self .profiler_process_stdout ,
212216 self .profiler_process_stderr ,
@@ -235,6 +239,12 @@ def stop_profile(self, **kwargs):
235239 )
236240 + LINUX_PERF_SETTINGS_MESSAGE
237241 )
242+ self .logger .error (
243+ "Profiler stdout: {}" .format (self .profiler_process_stdout )
244+ )
245+ self .logger .error (
246+ "Profiler stderr: {}" .format (self .profiler_process_stderr )
247+ )
238248
239249 except OSError as e :
240250 self .logger .error (
0 commit comments