WARNING: THIS SITE IS A MIRROR OF GITHUB.COM / IT CANNOT LOGIN OR REGISTER ACCOUNTS / THE CONTENTS ARE PROVIDED AS-IS / THIS SITE ASSUMES NO RESPONSIBILITY FOR ANY DISPLAYED CONTENT OR LINKS / IF YOU FOUND SOMETHING MAY NOT GOOD FOR EVERYONE, CONTACT ADMIN AT ilovescratch@foxmail.com
Skip to content

Commit cd243e5

Browse files
committed
5.8.1 Improve performance.
1 parent a210426 commit cd243e5

30 files changed

+343
-139
lines changed

code/default/launcher/web_control.py

Lines changed: 0 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -896,47 +896,6 @@ def req_debug_handler(self):
896896
self.send_response("text/plain", dat)
897897

898898
def req_log_files(self):
899-
# collect debug info and save to folders
900-
debug_infos = {
901-
"system_info": "http://localhost:8085/debug",
902-
"xtunnel_info": "http://127.0.0.1:8085/module/x_tunnel/control/debug",
903-
"xtunnel_status": "http://127.0.0.1:8085/module/x_tunnel/control/status",
904-
"cloudflare_info": "http://127.0.0.1:8085/module/x_tunnel/control/cloudflare_front/debug",
905-
"tls_info": "http://127.0.0.1:8085/module/x_tunnel/control/tls_relay_front/debug",
906-
"seley_info": "http://127.0.0.1:8085/module/x_tunnel/control/seley_front/debug",
907-
"cloudflare_log": "http://localhost:8085/module/x_tunnel/control/cloudflare_front/log?cmd=get_new&last_no=1",
908-
"tls_log": "http://localhost:8085/module/x_tunnel/control/tls_relay_front/log?cmd=get_new&last_no=1",
909-
"seley_log": "http://localhost:8085/module/x_tunnel/control/seley_front/log?cmd=get_new&last_no=1",
910-
"xtunnel_log": "http://localhost:8085/module/x_tunnel/control/log?cmd=get_new&last_no=1",
911-
"smartroute_log": "http://localhost:8085/module/smart_router/control/log?cmd=get_new&last_no=1",
912-
"launcher_log": "http://localhost:8085/log?cmd=get_new&last_no=1"
913-
}
914-
915-
download_path = os.path.join(env_info.data_path, "downloads")
916-
if not os.path.isdir(download_path):
917-
os.mkdir(download_path)
918-
919-
for name, url in debug_infos.items():
920-
# xlog.debug("fetch %s %s", name, url)
921-
try:
922-
res = simple_http_client.request("GET", url, timeout=1)
923-
if name.endswith("log"):
924-
dat = json.loads(res.text)
925-
no_line = list(dat.items())
926-
no_line = [[int(line[0]), line[1]] for line in no_line]
927-
no_line = sorted(no_line, key=operator.itemgetter(0))
928-
lines = [line[1] for line in no_line]
929-
data = "".join(lines)
930-
data = utils.to_bytes(data)
931-
else:
932-
data = res.text
933-
934-
fn = os.path.join(download_path, name + ".txt")
935-
with open(fn, "wb") as fd:
936-
fd.write(data)
937-
except Exception as e:
938-
xlog.exception("fetch info %s fail:%r", url, e)
939-
940899
# pack data folder and response
941900
x_tunnel_local = os.path.abspath(os.path.join(default_path, 'x_tunnel', 'local'))
942901
sys.path.append(x_tunnel_local)

code/default/lib/noarch/front_base/config.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@ def set_default(self):
2222
self.set_var("dispather_max_idle_workers", 30)
2323
self.set_var("dispather_worker_max_continue_fail", 8)
2424
self.set_var("dispather_connect_all_workers_on_startup", 0)
25+
self.set_var("dispather_ping_check_speed_interval", 300)
26+
self.set_var("dispather_ping_upload_size", 1024)
27+
self.set_var("dispather_ping_download_size", 10240)
2528

2629
self.set_var("max_task_num", 100)
2730

@@ -30,6 +33,7 @@ def set_default(self):
3033
self.set_var("http1_ping_interval", 300)
3134
self.set_var("http1_idle_time", 360)
3235
self.set_var("http1_max_process_tasks", 99999999)
36+
self.set_var("http1_trace_size", 20)
3337

3438
# http 2 worker
3539
self.set_var("http2_max_concurrent", 60)
@@ -92,6 +96,9 @@ def set_default(self):
9296
self.set_var("long_fail_connect_interval", 180)
9397
self.set_var("short_fail_connect_interval", 10)
9498
self.set_var("shuffle_ip_on_first_load", 0)
99+
self.set_var("ip_speed_history_size", 10)
100+
self.set_var("ip_initial_speed", 1000000)
101+
self.set_var("ip_speed_save_interval", 60)
95102

96103
# ip source
97104
self.set_var("use_ipv6", "auto") #force_ipv4/force_ipv6

code/default/lib/noarch/front_base/connect_manager.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -243,14 +243,18 @@ def _create_more_connection_worker(self):
243243
self.logger.warning("Connect creating process blocked, max connect thread increase to %d",
244244
self.config.https_max_connect_thread)
245245

246-
while self.thread_num < self.config.https_max_connect_thread and self._need_more_ip():
247-
246+
for i in range(self.thread_num, self.config.https_max_connect_thread):
248247
self.thread_num_lock.acquire()
249248
self.thread_num += 1
250249
self.thread_num_lock.release()
250+
251251
p = threading.Thread(target=self._connect_thread, name="%s_conn_manager__connect_th" % self.logger.name)
252252
p.start()
253-
time.sleep(self.config.connect_create_interval)
253+
if self.config.connect_create_interval > 0.1:
254+
time.sleep(self.config.connect_create_interval)
255+
256+
if not self._need_more_ip():
257+
break
254258

255259
with self.thread_num_lock:
256260
self.connecting_more_thread = None

code/default/lib/noarch/front_base/http1.py

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ def __init__(self, logger, ip_manager, config, ssl_sock, close_cb, retry_task_cb
4040

4141
def record_active(self, active=""):
4242
self.trace_time.append([time.time(), active])
43+
if len(self.trace_time) > self.config.http1_trace_size:
44+
self.trace_time.pop(0)
4345
# self.logger.debug("%s stat:%s", self.ip, active)
4446

4547
def get_trace(self):
@@ -141,7 +143,8 @@ def request_task(self, task):
141143

142144
task.headers[b'Host'] = self.get_host(task.host)
143145

144-
task.headers[b"Content-Length"] = len(task.body)
146+
request_len = len(task.body)
147+
task.headers[b"Content-Length"] = request_len
145148
request_data = b'%s %s HTTP/1.1\r\n' % (task.method, task.path)
146149
request_data += pack_headers(task.headers)
147150
request_data += b'\r\n'
@@ -184,7 +187,11 @@ def request_task(self, task):
184187
response.worker = self
185188
task.content_length = response.content_length
186189
task.responsed = True
187-
task.queue.put(response)
190+
if task.queue:
191+
task.queue.put(response)
192+
else:
193+
if self.config.http2_show_debug:
194+
self.logger.debug("got pong for %s status:%d", self.ip_str, response.status)
188195

189196
try:
190197
read_target = int(response.content_length)
@@ -219,9 +226,19 @@ def request_task(self, task):
219226
task.finish()
220227

221228
self.ssl_sock.received_size += data_len
222-
time_cost = (time.time() - start_time)
223-
if time_cost != 0:
224-
speed = data_len / time_cost
229+
230+
time_now = time.time()
231+
time_cost = (time_now - start_time)
232+
xcost = float(response.headers.get(b"X-Cost", 0))
233+
if isinstance(xcost, list):
234+
xcost = float(xcost[0])
235+
236+
total_len = (request_len + data_len)
237+
road_time = time_cost - xcost
238+
if xcost and total_len > 10000 and road_time:
239+
speed = total_len / road_time
240+
self.update_speed(speed)
241+
225242
task.set_state("h1_finish[SP:%d]" % speed)
226243

227244
self.transfered_size += len(request_data) + data_len

code/default/lib/noarch/front_base/http2_connection.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -462,8 +462,8 @@ def receive_frame(self, frame):
462462
# code registry otherwise use the frame's additional data.
463463
error_string = frame._extra_info()
464464
time_cost = time.time() - self.last_recv_time
465-
if frame.additional_data != b"session_timed_out":
466-
self.logger.warn("goaway:%s, t:%d", error_string, time_cost)
465+
# if frame.additional_data != b"session_timed_out":
466+
# self.logger.warn("goaway:%s, t:%d", error_string, time_cost)
467467

468468
self.close("GoAway:%s inactive time:%d" % (error_string, time_cost))
469469

code/default/lib/noarch/front_base/http2_stream.py

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -316,11 +316,13 @@ def receive_frame(self, frame):
316316

317317
time_now = time.time()
318318
whole_cost = time_now - self.start_time
319+
rtt = whole_cost - xcost
319320
receive_cost = time_now - self.get_head_time
320321
bytes_received = self.connection._sock.bytes_received - self.start_connection_point
321-
if receive_cost > 0 and bytes_received > 10000 and not self.task.finished and receive_cost > 0.001 \
322-
and xcost >= 0:
323-
rtt = whole_cost - xcost
322+
if b"ping" in self.task.path and self.config.http2_show_debug:
323+
self.logger.debug("got pong for %s", self.connection.ip_str)
324+
325+
if rtt > 0 and bytes_received >= 10000 and not self.task.finished and xcost >= 0.0:
324326
t_road = rtt
325327
if t_road <= self.connection.handshake:
326328
# adjust handshake
@@ -367,10 +369,13 @@ def send_response(self):
367369
response.ssl_sock = self.connection.ssl_sock
368370
response.worker = self.connection
369371
response.task = self.task
370-
if self.config.http2_show_debug:
371-
self.logger.debug("self.task.queue.put(response)")
372372

373-
self.task.queue.put(response)
373+
if self.task.queue:
374+
self.task.queue.put(response)
375+
else:
376+
if self.config.http2_show_debug:
377+
self.logger.debug("got pong for %s status:%d", self.connection.ip_str, status)
378+
374379
if status in self.config.http2_status_to_close:
375380
self.connection.close("status %d" % status)
376381

code/default/lib/noarch/front_base/http_common.py

Lines changed: 16 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,8 @@ def response_fail(self, reason=""):
177177
res = simple_http_client.BaseResponse(body=err_text)
178178
res.task = self
179179
res.worker = self.worker
180-
self.queue.put(res)
180+
if self.queue:
181+
self.queue.put(res)
181182
self.finish()
182183

183184
def finish(self):
@@ -198,7 +199,6 @@ def __init__(self, logger, ip_manager, config, ssl_sock, close_cb, retry_task_cb
198199
self.ssl_sock = ssl_sock
199200
self.handshake = ssl_sock.handshake_time * 0.001
200201
self.rtt = ssl_sock.handshake_time * 0.001
201-
self.speed = 15000000
202202
self.streams = []
203203
self.ip_str = ssl_sock.ip_str
204204
self.close_cb = close_cb
@@ -213,7 +213,6 @@ def __init__(self, logger, ip_manager, config, ssl_sock, close_cb, retry_task_cb
213213
self.continue_fail_tasks = 0
214214
self.rtt_history = [self.rtt,]
215215
self.adjust_history = []
216-
self.speed_history = [self.speed, self.speed, self.speed]
217216
self.last_recv_time = self.ssl_sock.create_time
218217
self.last_send_time = self.ssl_sock.create_time
219218
self.life_end_time = self.ssl_sock.create_time + \
@@ -228,12 +227,11 @@ def __str__(self):
228227
o += " continue_fail_tasks: %s\r\n" % (self.continue_fail_tasks)
229228
o += " handshake: %f \r\n" % self.handshake
230229
o += " rtt_history: %s\r\n" % (self.rtt_history)
231-
o += " speed_history: %s\r\n" % (self.speed_history)
232230
o += " adjust_history: %s\r\n" % (self.adjust_history)
233231
if self.version != "1.1":
234232
o += "streams: %d\r\n" % len(self.streams)
235233
o += " rtt: %f\r\n" % (self.rtt)
236-
o += " speed: %f\r\n" % (self.speed)
234+
o += " speed: %f\r\n" % (self.ip_manager.get_speed(self.ip_str))
237235
o += " score: %f\r\n" % (self.get_score())
238236
return o
239237

@@ -250,20 +248,9 @@ def update_rtt(self, rtt, predict_rtt=None):
250248
self.adjust_history.pop(0)
251249

252250
def update_speed(self, speed):
253-
self.speed_history.append(speed)
254-
if len(self.speed_history) > 10:
255-
self.speed_history.pop(0)
256-
self.speed = sum(self.speed_history) / len(self.speed_history)
251+
self.ip_manager.update_speed(self.ip_str, speed)
257252

258253
def update_debug_data(self, rtt, sent, received, speed):
259-
# if sent + received > 10000:
260-
# self.speed_history.append(speed)
261-
# if len(self.speed_history) > 10:
262-
# self.speed_history.pop(0)
263-
# self.speed = sum(self.speed_history) / len(self.speed_history)
264-
# else:
265-
# self.rtt = rtt
266-
267254
self.log_debug_data(rtt, sent, received)
268255
return
269256

@@ -296,23 +283,23 @@ def get_score(self):
296283
if self.processed_tasks == 0 and len(self.streams) == 0:
297284
score /= 3
298285

286+
speed = self.ip_manager.get_speed(self.ip_str)
299287
if self.version == "1.1":
300-
score += self.max_payload / self.speed
301-
return score
302-
303-
response_body_len = self.max_payload
304-
for _, stream in self.streams.items():
305-
if stream.response_body_len == 0:
306-
response_body_len += self.max_payload
307-
else:
308-
response_body_len += stream.response_body_len - stream.task.body_len
309-
score += response_body_len / self.speed
288+
score += self.max_payload / speed
289+
else:
290+
response_body_len = self.max_payload
291+
for _, stream in self.streams.items():
292+
if stream.response_body_len == 0:
293+
response_body_len += self.max_payload
294+
else:
295+
response_body_len += stream.response_body_len - stream.task.body_len
296+
score += response_body_len / speed
310297

311-
score += len(self.streams) * 0.06
298+
score += len(self.streams) * 0.06
312299

313300
if self.config.show_state_debug:
314301
self.logger.debug("get_score %s, speed:%f rtt:%d stream_num:%d score:%f", self.ip_str,
315-
self.speed * 0.000001, self.rtt * 1000, len(self.streams), score)
302+
speed * 0.000001, self.rtt * 1000, len(self.streams), score)
316303

317304
return score
318305

0 commit comments

Comments
 (0)