Skip to content

Commit fedb4ed

Browse files
committed
5.4.2, improve performance.
1 parent 5b46995 commit fedb4ed

File tree

9 files changed

+87
-25
lines changed

9 files changed

+87
-25
lines changed

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

+32-5
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,8 @@ def __init__(self,
7070
self.task = task
7171
self.state = STATE_IDLE
7272
self.get_head_time = None
73+
self.start_connection_point = self.connection._sock.bytes_received
74+
self.get_head_stream_num = 0
7375

7476
# There are two flow control windows: one for data we're sending,
7577
# one for data being sent to us.
@@ -292,6 +294,7 @@ def receive_frame(self, frame):
292294
self.response_header_datas = None
293295

294296
self.get_head_time = time.time()
297+
self.get_head_stream_num = len(self.connection.streams)
295298

296299
length = self.response_headers.get("Content-Length", None)
297300
if isinstance(length, list):
@@ -305,14 +308,38 @@ def receive_frame(self, frame):
305308
if self.config.http2_show_debug:
306309
self.logger.debug("%s Closing remote side of stream:%d", self.connection.ssl_sock.ip_str, self.stream_id)
307310

311+
xcost = self.response_headers.get("X-Cost", -1)
312+
if isinstance(xcost, list):
313+
xcost = float(xcost[0])
314+
rcost = self.response_headers.get("R-Cost", -1)
315+
if isinstance(rcost, list):
316+
rcost = float(rcost[0])
317+
308318
time_now = time.time()
309-
time_cost = time_now - self.get_head_time
310-
if time_cost > 0 and \
311-
isinstance(self.task.content_length, int) and \
312-
not self.task.finished:
313-
speed = self.task.content_length / time_cost
319+
whole_cost = time_now - self.start_time
320+
receive_cost = time_now - self.get_head_time
321+
bytes_received = self.connection._sock.bytes_received - self.start_connection_point
322+
if receive_cost > 0 and bytes_received > 10000 and not self.task.finished and receive_cost > 0.001:
323+
# speed = bytes_received / receive_cost
324+
speed = (len(self.request_body) + bytes_received) / (whole_cost - xcost)
325+
self.connection.update_speed(speed)
314326
self.task.set_state("h2_finish[SP:%d]" % speed)
315327

328+
send_cost = len(self.request_body) / speed
329+
streams_cost = ((self.connection.max_payload /2) * self.get_head_stream_num) / speed
330+
331+
if xcost >= 0:
332+
rtt = whole_cost - xcost - send_cost - receive_cost # - streams_cost
333+
if self.config.http2_show_debug:
334+
self.logger.debug("%s RTT:%f rtt:%f send_len:%d recv_len:%d "
335+
"whole_Cost:%f xcost:%f rcost:%f send_cost:%f recv_cost:%f "
336+
"streams_cost:%f Speed: %f",
337+
self.connection.ssl_sock.ip_str,
338+
self.connection.rtt * 1000, rtt * 1000,
339+
len(self.request_body), bytes_received,
340+
whole_cost, xcost, rcost, send_cost, receive_cost, streams_cost, speed)
341+
self.connection.update_rtt(rtt)
342+
316343
self._close_remote()
317344

318345
self.close("end stream")

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

+37-13
Original file line numberDiff line numberDiff line change
@@ -179,13 +179,15 @@ def finish(self):
179179

180180

181181
class HttpWorker(object):
182+
max_payload = 128 * 1024
183+
182184
def __init__(self, logger, ip_manager, config, ssl_sock, close_cb, retry_task_cb, idle_cb, log_debug_data):
183185
self.logger = logger
184186
self.ip_manager = ip_manager
185187
self.config = config
186188
self.ssl_sock = ssl_sock
187-
self.rtt = ssl_sock.handshake_time
188-
self.speed = 200
189+
self.rtt = ssl_sock.handshake_time * 0.001
190+
self.speed = 5000000
189191
self.ip_str = ssl_sock.ip_str
190192
self.close_cb = close_cb
191193
self.retry_task_cb = retry_task_cb
@@ -195,7 +197,8 @@ def __init__(self, logger, ip_manager, config, ssl_sock, close_cb, retry_task_cb
195197
self.keep_running = True
196198
self.processed_tasks = 0
197199
self.continue_fail_tasks = 0
198-
self.speed_history = []
200+
self.rtt_history = [self.rtt,]
201+
self.speed_history = [self.speed, self.speed, self.speed]
199202
self.last_recv_time = self.ssl_sock.create_time
200203
self.last_send_time = self.ssl_sock.create_time
201204
self.life_end_time = self.ssl_sock.create_time + \
@@ -207,6 +210,7 @@ def __str__(self):
207210
o += " running: %s\r\n" % (self.keep_running)
208211
o += " processed_tasks: %d\r\n" % (self.processed_tasks)
209212
o += " continue_fail_tasks: %s\r\n" % (self.continue_fail_tasks)
213+
o += " rtt_history: %s\r\n" % (self.rtt_history)
210214
o += " speed_history: %s\r\n" % (self.speed_history)
211215
if self.version != "1.1":
212216
o += "streams: %d\r\n" % len(self.streams)
@@ -215,13 +219,26 @@ def __str__(self):
215219
o += " score: %f\r\n" % (self.get_score())
216220
return o
217221

222+
def update_rtt(self, rtt):
223+
self.rtt_history.append(rtt)
224+
if len(self.rtt_history) > 10:
225+
self.rtt_history.pop(0)
226+
# self.rtt = sum(self.rtt_history) / len(self.rtt_history)
227+
228+
def update_speed(self, speed):
229+
self.speed_history.append(speed)
230+
if len(self.speed_history) > 10:
231+
self.speed_history.pop(0)
232+
self.speed = sum(self.speed_history) / len(self.speed_history)
233+
218234
def update_debug_data(self, rtt, sent, received, speed):
219-
self.rtt = rtt
220-
if sent + received > 10000:
221-
self.speed_history.append(speed)
222-
if len(self.speed_history) > 10:
223-
self.speed_history.pop(0)
224-
self.speed = sum(self.speed_history) / len(self.speed_history)
235+
# if sent + received > 10000:
236+
# self.speed_history.append(speed)
237+
# if len(self.speed_history) > 10:
238+
# self.speed_history.pop(0)
239+
# self.speed = sum(self.speed_history) / len(self.speed_history)
240+
# else:
241+
# self.rtt = rtt
225242

226243
self.log_debug_data(rtt, sent, received)
227244

@@ -243,13 +260,20 @@ def close(self, reason):
243260

244261
def get_score(self):
245262
# The smaller, the better
246-
score = (50 - (self.speed/6.0)) + (self.rtt/20.0)
263+
264+
score = self.rtt
247265
if self.version != "1.1":
248-
score += len(self.streams) * 3
266+
response_body_len = self.max_payload
267+
for _, stream in self.streams.items():
268+
if stream.response_body_len == 0:
269+
response_body_len += self.max_payload
270+
else:
271+
response_body_len += stream.response_body_len - stream.task.body_len
272+
score += response_body_len / self.speed
249273

250274
if self.config.show_state_debug:
251-
self.logger.debug("get_score %s, speed:%d rtt:%d stream_num:%d score:%d", self.ip_str,
252-
self.speed, self.rtt, len(self.streams), score)
275+
self.logger.debug("get_score %s, speed:%f rtt:%d stream_num:%d score:%f", self.ip_str,
276+
self.speed * 0.000001, self.rtt * 1000, len(self.streams), score)
253277

254278
return score
255279

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ def create_worker_thread(self):
154154
self.connect_all_workers = True
155155

156156
try:
157-
ssl_sock = self.connection_manager.get_ssl_connection(timeout=10)
157+
ssl_sock = self.connection_manager.get_ssl_connection(timeout=60)
158158
except Exception as e:
159159
self._debug_log("create_worker_thread get_ssl_connection fail:%r", e)
160160
ssl_sock = None

code/default/lib/noarch/hyper/common/bufsocket.py

+4
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,9 @@ def __init__(self, sck, buffer_size=1000):
104104
# The number of bytes in the buffer.
105105
self._bytes_in_buffer = 0
106106

107+
# record all bytes received from beginning
108+
self.bytes_received = 0
109+
107110
# following is define for send buffer
108111
# all send will be cache and send when flush called,
109112
# combine data to reduce the api call
@@ -247,6 +250,7 @@ def recv(self, amt):
247250
if not count and amt > self._bytes_in_buffer:
248251
raise ConnectionResetError()
249252
self._bytes_in_buffer += count
253+
self.bytes_received += count
250254

251255
# Read out the bytes and update the index.
252256
amt = min(amt, self._bytes_in_buffer)

code/default/version.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
5.4.0
1+
5.4.2

code/default/x_tunnel/local/direct_front.py

+4
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,10 @@ def request(method, host, schema="http", path="/", headers={}, data="", timeout=
9494
return response.text, response.status, response
9595

9696

97+
def start():
98+
pass
99+
100+
97101
def stop():
98102
pass
99103

code/default/x_tunnel/local/proxy_session.py

+4-3
Original file line numberDiff line numberDiff line change
@@ -613,7 +613,7 @@ def normal_round_trip_worker(self, work_id):
613613

614614
request_session_id = self.session_id
615615
upload_data_head = struct.pack("<cBB8sIBIH", magic, g.protocol_version, pack_type,
616-
bytes(self.session_id), transfer_no,
616+
utils.to_bytes(self.session_id), transfer_no,
617617
server_timeout, send_data_len, send_ack_len)
618618
upload_post_buf = base_container.WriteBuffer(upload_data_head)
619619
upload_post_buf.append(data)
@@ -727,12 +727,13 @@ def normal_round_trip_worker(self, work_id):
727727
rtt = max(100, rtt)
728728
speed = (send_data_len + len(content) + 400) / rtt
729729
# speed = (send_data_len + len(content)) / (roundtrip_time - (time_cost / 1000.0))
730+
rcost = response.headers.get(b"R-Cost", b"")
730731
xlog.debug(
731732
"worker:%d no:%d "
732-
"cost_time:%f server_time:%f server_timeout:%d "
733+
"cost_time:%f rcost:%s server_time:%f server_timeout:%d "
733734
"snd:%d rcv:%d s_pool:%d on_road:%d target_worker:%d speed:%d",
734735
work_id, transfer_no,
735-
roundtrip_time, time_cost / 1000.0, server_timeout,
736+
roundtrip_time, rcost, time_cost / 1000.0, server_timeout,
736737
send_data_len, len(content), server_send_pool_size,
737738
self.on_road_num,
738739
self.target_on_roads,

code/default/x_tunnel/local/tls_relay_front/config.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,12 @@ def __init__(self, fn):
1919
self.set_var("dispather_connect_all_workers_on_startup", 1)
2020

2121
# connect_manager
22-
self.set_var("https_connection_pool_min", 1)
22+
self.set_var("https_connection_pool_min", 0)
2323
self.set_var("max_links_per_ip", 1)
2424
self.set_var("https_connection_pool_max", 20)
2525

2626
# connect_creator
27+
self.set_var("socket_timeout", 2)
2728
self.set_var("connect_force_http2", 1)
2829

2930
# http 2 worker

code/default/x_tunnel/local/tls_relay_front/ip_manager.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ def get_ip_sni_host(self):
2929
ips = self.host_manager.ips
3030

3131
best_info = None
32-
best_rtt = 2000
32+
best_rtt = 99999
3333

3434
for ip in ips:
3535
info = self._get_ip_info(ip)
@@ -72,6 +72,7 @@ def report_connect_fail(self, ip_str, sni=None, reason="", force_remove=False):
7272
ip = utils.to_str(ip)
7373
info = self._get_ip_info(ip)
7474
info["fail_times"] += 1
75+
info["rtt"] = 2000
7576
self.logger.debug("ip %s connect fail:%s", ip, reason)
7677

7778
def ssl_closed(self, ip_str, sni=None, reason=""):

0 commit comments

Comments
 (0)