8
8
9
9
"""
10
10
11
+ import json
11
12
import logging
12
13
import os
13
14
import random
20
21
import sys
21
22
22
23
import requests
23
- from splash .benchmark .file_server import serve_files
24
- from splash .tests .utils import SplashServer
25
24
26
25
27
26
def make_render_png_req (splash , params ):
28
- """Prepare request for render.png endpoint."""
27
+ """Make PNG render request via render.png endpoint."""
29
28
return {'url' : splash .url ('render.png' ),
30
29
'params' : params }
31
30
32
31
33
32
def make_render_json_req (splash , params ):
34
- """Prepare request for render.json endpoint."""
33
+ """Make PNG render request via JSON endpoint."""
35
34
json_params = params .copy ()
36
35
json_params ['png' ] = 1
37
36
return {'url' : splash .url ('render.json' ),
38
37
'params' : json_params }
39
38
40
39
41
40
def make_render_png_lua_req (splash , params ):
42
- """Prepare request for execute endpoint."""
41
+ """Make PNG render request via Lua execute endpoint."""
43
42
lua_params = params .copy ()
44
43
lua_params ['lua_source' ] = """
45
44
function main(splash)
@@ -57,11 +56,51 @@ def make_render_png_lua_req(splash, params):
57
56
'params' : lua_params }
58
57
59
58
60
- REQ_FACTORIES = [
61
- make_render_png_req ,
62
- make_render_json_req ,
63
- make_render_png_lua_req ,
64
- ]
59
+ def make_render_html_req (splash , params ):
60
+ """Make HTML render request via render.html endpoint."""
61
+ return {'url' : splash .url ('render.html' ),
62
+ 'params' : params }
63
+
64
+
65
+ def make_render_html_json_req (splash , params ):
66
+ """Make HTML render request via JSON endpoint."""
67
+ json_params = params .copy ()
68
+ json_params ['html' ] = 1
69
+ return {'url' : splash .url ('render.json' ),
70
+ 'params' : json_params }
71
+
72
+
73
+ def make_render_html_lua_req (splash , params ):
74
+ """Make HTML render request via Lua execute endpoint."""
75
+ lua_params = params .copy ()
76
+ lua_params ['lua_source' ] = """
77
+ function main(splash)
78
+ assert(splash:go(splash.args.url))
79
+ if splash.args.wait then
80
+ assert(splash:wait(splash.args.wait))
81
+ end
82
+ splash:set_result_content_type("text/html; charset=UTF-8")
83
+ return splash:html{}
84
+ end
85
+ """
86
+ return {'url' : splash .url ('execute' ),
87
+ 'params' : lua_params }
88
+
89
+
90
+ #: Same resource may be rendered by various endpoints with slightly varying
91
+ #: parameter combinations. Request factories set those combinations up.
92
+ REQ_FACTORIES = {
93
+ 'png' : [
94
+ make_render_png_req ,
95
+ make_render_json_req ,
96
+ make_render_png_lua_req ,
97
+ ],
98
+ 'html' : [
99
+ make_render_html_req ,
100
+ make_render_html_json_req ,
101
+ make_render_html_lua_req ,
102
+ ],
103
+ }
65
104
66
105
67
106
#: Port at which static pages will be served.
@@ -86,15 +125,20 @@ def make_render_png_lua_req(splash, params):
86
125
help = 'Request thread count' )
87
126
parser .add_argument ('--request-count' , type = int , default = 10 ,
88
127
help = 'Benchmark request count' )
89
- parser .add_argument ('--sites-dir' , type = str , default = 'sites' ,
128
+ parser .add_argument ('--sites-dir' , type = str , default = 'sites' , required = True ,
90
129
help = 'Directory with downloaded sites' )
130
+ parser .add_argument ('--file-server' , metavar = 'HOST:PORT' ,
131
+ help = 'Use existing file server instance available at HOST:PORT' )
91
132
parser .add_argument ('--splash-server' , metavar = 'HOST:PORT' ,
92
133
help = 'Use existing Splash instance available at HOST:PORT' )
93
134
parser .add_argument ('--out-file' , type = FileType (mode = 'w' ), default = sys .stdout ,
94
135
help = 'Write detailed request information in this file' )
136
+ parser .add_argument ('--render-type' , choices = ('html' , 'png' ), default = 'png' ,
137
+ help = ('Type of rendering to benchmark'
138
+ ' (either "html" or "png")' ))
95
139
96
140
97
- def generate_requests (splash , args ):
141
+ def generate_requests (splash , file_server , args ):
98
142
log = logging .getLogger ('generate_requests' )
99
143
log .info ("Using pRNG seed: %s" , args .seed )
100
144
@@ -106,12 +150,14 @@ def generate_requests(splash, args):
106
150
for p in pages :
107
151
log .info ("Using page for benchmark: %s" , p )
108
152
153
+ request_factories = REQ_FACTORIES [args .render_type ]
154
+
109
155
rng = random .Random (args .seed )
110
156
for i in xrange (args .request_count ):
111
157
page = rng .choice (pages )
112
158
width , height = rng .choice (WIDTH_HEIGHT )
113
- req_factory = rng .choice (REQ_FACTORIES )
114
- url = 'http://localhost:%d/%s' % ( PORT , page )
159
+ req_factory = rng .choice (request_factories )
160
+ url = file_server . url ( page )
115
161
params = {'url' : url , 'render_all' : 1 , 'wait' : 0.1 ,
116
162
'width' : width , 'height' : height }
117
163
log .debug ("Req factory: %s, params: %s" , req_factory , params )
@@ -145,7 +191,7 @@ def invoke_request(invoke_args):
145
191
'height' : kwargs ['params' ]['height' ]}
146
192
147
193
148
- class ExistingSplashWrapper (object ):
194
+ class ExistingServerWrapper (object ):
149
195
"""Wrapper for pre-existing Splash instance."""
150
196
def __init__ (self , server ):
151
197
self .server = server
@@ -165,37 +211,49 @@ def __exit__(self, *args):
165
211
def main ():
166
212
log = logging .getLogger ("benchmark" )
167
213
args = parser .parse_args ()
168
- logging .getLogger ('requests.packages.urllib3.connectionpool' ).setLevel (logging .WARNING )
214
+ (logging .getLogger ('requests.packages.urllib3.connectionpool' )
215
+ .setLevel (logging .WARNING ))
169
216
logging .basicConfig (level = logging .DEBUG )
170
217
171
218
if args .splash_server :
172
- splash = ExistingSplashWrapper (args .splash_server )
219
+ splash = ExistingServerWrapper (args .splash_server )
173
220
else :
221
+ from splash .tests .utils import SplashServer
174
222
splash = SplashServer (
175
223
logfile = SPLASH_LOG ,
176
224
extra_args = ['--disable-lua-sandbox' ,
177
225
'--disable-xvfb' ,
178
226
'--max-timeout=600' ])
179
227
180
- with splash , serve_files (port = PORT , directory = args .sites_dir , logfile = FILESERVER_LOG ):
228
+ if args .file_server :
229
+ file_server = ExistingServerWrapper (args .file_server )
230
+ else :
231
+ from splash .benchmark .file_server import FileServerSubprocess
232
+ file_server = FileServerSubprocess (port = PORT ,
233
+ path = args .sites_dir ,
234
+ logfile = FILESERVER_LOG )
235
+
236
+ with splash , file_server :
181
237
log .info ("Servers are up, starting benchmark..." )
182
238
start_res = requests .get (
183
239
splash .url ('execute' ),
184
240
params = {'lua_source' : GET_PERF_STATS_SCRIPT }).json ()
185
241
start_time = time ()
186
- results = parallel_map (invoke_request , generate_requests (splash , args ),
242
+ results = parallel_map (invoke_request ,
243
+ generate_requests (splash , file_server , args ),
187
244
args .thread_count )
188
245
end_time = time ()
189
246
end_res = requests .get (
190
247
splash .url ('execute' ),
191
248
params = {'lua_source' : GET_PERF_STATS_SCRIPT }).json ()
192
249
193
250
log .info ("Writing stats to %s" , args .out_file .name )
194
- args .out_file .write (pformat ({
195
- 'maxrss' : end_res ['maxrss' ],
196
- 'cputime' : end_res ['cputime' ] - start_res ['cputime' ],
197
- 'walltime' : end_time - start_time ,
198
- 'requests' : results }))
251
+ args .out_file .write (json .dumps (
252
+ {'maxrss' : end_res ['maxrss' ],
253
+ 'cputime' : end_res ['cputime' ] - start_res ['cputime' ],
254
+ 'walltime' : end_time - start_time ,
255
+ 'requests' : results },
256
+ indent = 2 ))
199
257
log .info ("Splash max RSS: %s B" , end_res ['maxrss' ])
200
258
log .info ("Splash CPU time elapsed: %.2f sec" ,
201
259
end_res ['cputime' ] - start_res ['cputime' ])
0 commit comments