88
99"""
1010
11+ import json
1112import logging
1213import os
1314import random
2021import sys
2122
2223import requests
23- from splash .benchmark .file_server import serve_files
24- from splash .tests .utils import SplashServer
2524
2625
2726def make_render_png_req (splash , params ):
28- """Prepare request for render.png endpoint."""
27+ """Make PNG render request via render.png endpoint."""
2928 return {'url' : splash .url ('render.png' ),
3029 'params' : params }
3130
3231
3332def make_render_json_req (splash , params ):
34- """Prepare request for render.json endpoint."""
33+ """Make PNG render request via JSON endpoint."""
3534 json_params = params .copy ()
3635 json_params ['png' ] = 1
3736 return {'url' : splash .url ('render.json' ),
3837 'params' : json_params }
3938
4039
4140def make_render_png_lua_req (splash , params ):
42- """Prepare request for execute endpoint."""
41+ """Make PNG render request via Lua execute endpoint."""
4342 lua_params = params .copy ()
4443 lua_params ['lua_source' ] = """
4544function main(splash)
@@ -57,11 +56,51 @@ def make_render_png_lua_req(splash, params):
5756 'params' : lua_params }
5857
5958
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+ }
65104
66105
67106#: Port at which static pages will be served.
@@ -86,15 +125,20 @@ def make_render_png_lua_req(splash, params):
86125 help = 'Request thread count' )
87126parser .add_argument ('--request-count' , type = int , default = 10 ,
88127 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 ,
90129 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' )
91132parser .add_argument ('--splash-server' , metavar = 'HOST:PORT' ,
92133 help = 'Use existing Splash instance available at HOST:PORT' )
93134parser .add_argument ('--out-file' , type = FileType (mode = 'w' ), default = sys .stdout ,
94135 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")' ))
95139
96140
97- def generate_requests (splash , args ):
141+ def generate_requests (splash , file_server , args ):
98142 log = logging .getLogger ('generate_requests' )
99143 log .info ("Using pRNG seed: %s" , args .seed )
100144
@@ -106,12 +150,14 @@ def generate_requests(splash, args):
106150 for p in pages :
107151 log .info ("Using page for benchmark: %s" , p )
108152
153+ request_factories = REQ_FACTORIES [args .render_type ]
154+
109155 rng = random .Random (args .seed )
110156 for i in xrange (args .request_count ):
111157 page = rng .choice (pages )
112158 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 )
115161 params = {'url' : url , 'render_all' : 1 , 'wait' : 0.1 ,
116162 'width' : width , 'height' : height }
117163 log .debug ("Req factory: %s, params: %s" , req_factory , params )
@@ -145,7 +191,7 @@ def invoke_request(invoke_args):
145191 'height' : kwargs ['params' ]['height' ]}
146192
147193
148- class ExistingSplashWrapper (object ):
194+ class ExistingServerWrapper (object ):
149195 """Wrapper for pre-existing Splash instance."""
150196 def __init__ (self , server ):
151197 self .server = server
@@ -165,37 +211,49 @@ def __exit__(self, *args):
165211def main ():
166212 log = logging .getLogger ("benchmark" )
167213 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 ))
169216 logging .basicConfig (level = logging .DEBUG )
170217
171218 if args .splash_server :
172- splash = ExistingSplashWrapper (args .splash_server )
219+ splash = ExistingServerWrapper (args .splash_server )
173220 else :
221+ from splash .tests .utils import SplashServer
174222 splash = SplashServer (
175223 logfile = SPLASH_LOG ,
176224 extra_args = ['--disable-lua-sandbox' ,
177225 '--disable-xvfb' ,
178226 '--max-timeout=600' ])
179227
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 :
181237 log .info ("Servers are up, starting benchmark..." )
182238 start_res = requests .get (
183239 splash .url ('execute' ),
184240 params = {'lua_source' : GET_PERF_STATS_SCRIPT }).json ()
185241 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 ),
187244 args .thread_count )
188245 end_time = time ()
189246 end_res = requests .get (
190247 splash .url ('execute' ),
191248 params = {'lua_source' : GET_PERF_STATS_SCRIPT }).json ()
192249
193250 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 ))
199257 log .info ("Splash max RSS: %s B" , end_res ['maxrss' ])
200258 log .info ("Splash CPU time elapsed: %.2f sec" ,
201259 end_res ['cputime' ] - start_res ['cputime' ])
0 commit comments