19
19
from redisbench_admin .utils .utils import whereis
20
20
21
21
PERF_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 ))
22
25
LINUX_PERF_SETTINGS_MESSAGE = (
23
26
"If running in non-root user please confirm that you have:\n "
24
27
+ " - access to Kernel address maps."
@@ -42,9 +45,8 @@ def __init__(self):
42
45
43
46
self .stack_collapser = os .getenv ("STACKCOLLAPSE_PATH" , STACKCOLLAPSE_PATH )
44
47
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
48
50
49
51
self .output = None
50
52
self .profiler_process = None
@@ -86,9 +88,15 @@ def retrieve_perf_version(self):
86
88
self .version_minor = m .group (2 )
87
89
return m , self .version_major , self .version_minor
88
90
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
+ ):
90
94
self .output = output
91
95
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
92
100
cmd = [
93
101
self .perf ,
94
102
"record" ,
@@ -104,6 +112,8 @@ def generate_record_command(self, pid, output, frequency=None):
104
112
]
105
113
if frequency :
106
114
cmd += ["--freq" , "{}" .format (frequency )]
115
+ if self .default_profile_time :
116
+ cmd += ["--" , "sleep" , "{}" .format (self .default_profile_time )]
107
117
return cmd
108
118
109
119
def generate_report_command (
@@ -134,7 +144,9 @@ def generate_report_command(
134
144
cmd .extend (extra_options )
135
145
return cmd
136
146
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
+ ):
138
150
"""
139
151
@param pid: profile events on specified process id
140
152
@param output: output file name
@@ -157,7 +169,9 @@ def start_profile(self, pid, output, frequency=99):
157
169
"env" : self .environ ,
158
170
}
159
171
160
- args = self .generate_record_command (pid , output , frequency )
172
+ args = self .generate_record_command (
173
+ pid , output , frequency , callgraph_mode , profile_time
174
+ )
161
175
self .logger .info (
162
176
"Starting profile of pid {} with args {}" .format (pid , args )
163
177
)
@@ -193,20 +207,10 @@ def stop_profile(self, **kwargs):
193
207
self .profiler_process_exit_code
194
208
)
195
209
)
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 :
208
211
self .profiler_process .terminate ()
209
212
self .profiler_process .wait ()
213
+ try :
210
214
(
211
215
self .profiler_process_stdout ,
212
216
self .profiler_process_stderr ,
@@ -235,6 +239,12 @@ def stop_profile(self, **kwargs):
235
239
)
236
240
+ LINUX_PERF_SETTINGS_MESSAGE
237
241
)
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
+ )
238
248
239
249
except OSError as e :
240
250
self .logger .error (
0 commit comments