Skip to content

Commit c578375

Browse files
committed
5.16.4 improve performance
1 parent b2599c3 commit c578375

39 files changed

+703
-468
lines changed

code/default/launcher/start.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,12 @@ def main():
120120
ports_resolve_solution = win_compat_suggest.Win10PortReserveSolution()
121121
if not ports_resolve_solution.check_and_resolve():
122122
return
123+
elif sys.platform == "darwin":
124+
import resource
125+
new_soft_limit = 4096
126+
new_hard_limit = 4096
127+
resource.setrlimit(resource.RLIMIT_NOFILE, (new_soft_limit, new_hard_limit))
128+
xlog.info(f"New open file limits set to: Soft={new_soft_limit}, Hard={new_hard_limit}")
123129

124130
web_control.confirm_xxnet_not_running()
125131

code/default/launcher/web_control.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1082,7 +1082,7 @@ def start(allow_remote=0):
10821082

10831083
xlog.info("begin to start web control:%s", addresses)
10841084

1085-
server = simple_http_server.HTTPServer(addresses, Http_Handler, logger=xlog)
1085+
server = simple_http_server.HTTPServer(addresses, Http_Handler, logger=xlog, max_thread=2048)
10861086
server.start()
10871087

10881088
xlog.info("launcher web control started.")

code/default/launcher/win_compat_suggest.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ def check_and_resolve(self):
3232
"The service ports was reserved by system, Do you want to change the served port?")
3333

3434
if res == 1: # Clicked "Yes"
35+
xlog.info("User click Yes, start change reserve port range")
3536
self.change_reserved_port_range()
3637

3738
if language == "zh_CN":
@@ -40,6 +41,8 @@ def check_and_resolve(self):
4041
self.notify("Computer Restart Required",
4142
"System port reserve range changed, please restart your computer to make chage.")
4243
return False
44+
else:
45+
xlog.info("User click No")
4346

4447
return True
4548

@@ -97,6 +100,7 @@ def is_port_reserve_conflict(self):
97100
# xlog.debug("range:%d - %d", p0, p1)
98101
for port in self.service_ports:
99102
if p0 < port < p1:
103+
xlog.info("found port reserved range:%d - %d, expect %d", p0, p1, port)
100104
return True
101105

102106
return False

code/default/lib/noarch/env_info.py

Lines changed: 69 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66

77
import utils
88

9-
109
current_path = os.path.dirname(os.path.abspath(__file__))
1110
default_path = os.path.abspath(os.path.join(current_path, os.path.pardir, os.path.pardir))
1211
data_path = os.path.abspath(os.path.join(default_path, os.path.pardir, os.path.pardir, 'data'))
@@ -122,6 +121,59 @@ def get_system_date_path():
122121
else:
123122
return os.path.join(home, ".local", "share")
124123

124+
def get_user_data_path():
125+
"""
126+
获取用户数据目录路径
127+
128+
Returns:
129+
Path: 用户数据目录的 Path 对象
130+
131+
Raises:
132+
OSError: 当无法确定用户目录时
133+
"""
134+
try:
135+
home = Path.home()
136+
except RuntimeError:
137+
raise OSError("无法确定用户主目录")
138+
139+
if sys.platform == "win32":
140+
# Windows: %APPDATA%
141+
appdata = os.environ.get("APPDATA")
142+
if appdata and Path(appdata).exists():
143+
return Path(appdata)
144+
# Fallback
145+
fallback = home / "AppData" / "Roaming"
146+
fallback.mkdir(parents=True, exist_ok=True)
147+
return fallback
148+
149+
elif sys.platform == "darwin":
150+
# macOS: ~/Library/Application Support
151+
app_support = home / "Library" / "Application Support"
152+
app_support.mkdir(parents=True, exist_ok=True)
153+
return app_support
154+
155+
else:
156+
# Linux/Unix: 遵循 XDG Base Directory Specification
157+
xdg_data_home = os.environ.get("XDG_DATA_HOME")
158+
if xdg_data_home:
159+
data_dir = Path(xdg_data_home)
160+
else:
161+
data_dir = home / ".local" / "share"
162+
163+
data_dir.mkdir(parents=True, exist_ok=True)
164+
return data_dir
165+
166+
167+
def is_in_system_application_path(p):
168+
if sys.platform == "win32":
169+
if "Program Files" in p:
170+
return True
171+
elif sys.platform == "darwin":
172+
if "Contents" in p:
173+
return True
174+
else:
175+
return False
176+
125177

126178
def get_app_name():
127179
app_info_file = os.path.join(default_path, os.path.pardir, "app_info.json")
@@ -131,16 +183,25 @@ def get_app_name():
131183
return dat["app_name"]
132184
except Exception as e:
133185
print("get app name fail:%r", e)
134-
return "XX-Net"
186+
return "Dashboard"
135187

136188

137-
app_name = get_app_name()
189+
def use_default_data_path():
190+
if os.path.isdir(data_path):
191+
return True
138192

139-
# check and update data path
140-
if not os.path.isdir(data_path):
141193
try:
142194
os.mkdir(data_path)
195+
return True
143196
except Exception as e:
144-
data_path = os.path.join(get_system_date_path(), app_name)
145-
if not os.path.isdir(data_path):
146-
os.mkdir(data_path)
197+
return False
198+
199+
200+
app_name = get_app_name()
201+
202+
# check and update data path
203+
if not os.path.isdir(data_path) and \
204+
(is_in_system_application_path(data_path) or not use_default_data_path() or app_name not in ["XX-Net"]):
205+
data_path = os.path.join(get_user_data_path(), app_name)
206+
if not os.path.isdir(data_path):
207+
os.mkdir(data_path)

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ def __init__(self, context, sock, ip_str=None, sni=None, on_close=None):
2020
self._sock = sock
2121
self._fileno = self._sock.fileno()
2222
# self._context.logger.debug("sock %s init fd:%d", ip_str, self._fileno)
23-
self.ip_str = utils.to_bytes(ip_str)
23+
self.ip_str = ip_str
2424
self.sni = sni
2525
self._makefile_refs = 0
2626
self._on_close = on_close

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

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,17 +14,19 @@ def set_default(self):
1414

1515
# http_dispatcher
1616
self.set_var("dispather_min_idle_workers", 0)
17+
self.set_var("dispather_worker_idle_time", 300)
1718
self.set_var("dispather_work_min_idle_time", 0)
18-
self.set_var("dispather_work_max_score", 20000)
19+
self.set_var("dispather_work_max_score", 1)
1920
self.set_var("dispather_min_workers", 0)
2021
self.set_var("dispather_max_workers", 60)
2122
self.set_var("dispather_score_factor", 1)
2223
self.set_var("dispather_max_idle_workers", 30)
2324
self.set_var("dispather_worker_max_continue_fail", 8)
2425
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_check_speed_interval", 60 * 5)
2627
self.set_var("dispather_ping_upload_size", 1024)
27-
self.set_var("dispather_ping_download_size", 10240)
28+
self.set_var("dispather_ping_rtt_download_size", 512)
29+
self.set_var("dispather_ping_speed_download_size", 1024 * 100)
2830

2931
self.set_var("max_task_num", 100)
3032

@@ -48,6 +50,7 @@ def set_default(self):
4850

4951
# worker_base
5052
self.set_var("show_state_debug", 0)
53+
self.set_var("http_query_history_size", 30) # for calculating rtt and speed.
5154

5255
# connect manager
5356
self.set_var("https_max_connect_thread", 1)
@@ -70,7 +73,7 @@ def set_default(self):
7073
self.set_var("check_ip_content", "OK")
7174

7275
# connect_creator
73-
self.set_var("socket_timeout", 5)
76+
self.set_var("socket_timeout", 1)
7477
self.set_var("connect_receive_buffer", 1024 * 512)
7578
self.set_var("connect_send_buffer", 1024 * 512)
7679
self.set_var("connect_force_http1", 0)
@@ -96,8 +99,13 @@ def set_default(self):
9699
self.set_var("long_fail_connect_interval", 180)
97100
self.set_var("short_fail_connect_interval", 10)
98101
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)
102+
self.set_var("ip_speed_history_size", 30)
103+
self.set_var("ip_initial_rtt", 0.03)
104+
self.set_var("ip_initial_speed", 129000)
105+
self.set_var("ip_initial_score", 0.1)
106+
self.set_var("ip_cal_rtt_max_package_size", 10000)
107+
self.set_var("ip_cal_speed_min_package_size", 100000)
108+
self.set_var("ip_cal_expect_time_package_size", 40000)
101109
self.set_var("ip_speed_save_interval", 60)
102110

103111
# ip source

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

Lines changed: 32 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,8 @@ def keep_connection_daemon(self):
221221
time.sleep(5)
222222
continue
223223

224+
if self.config.show_state_debug:
225+
self.logger.debug("call _connect_process from keep_connection_daemon")
224226
self._connect_process()
225227

226228
def _need_more_ip(self):
@@ -230,13 +232,17 @@ def _need_more_ip(self):
230232
return False
231233

232234
def _create_more_connection(self):
235+
if self.config.show_state_debug:
236+
self.logger.debug("_create_more_connection")
233237
if not self.connecting_more_thread:
234238
with self.thread_num_lock:
235239
self.connecting_more_thread = threading.Thread(target=self._create_more_connection_worker,
236240
name="%s_conn_manager__create_more_conn" % self.logger.name)
237241
self.connecting_more_thread.start()
238242

239243
def _create_more_connection_worker(self):
244+
if self.config.show_state_debug:
245+
self.logger.debug("_create_more_connection_worker")
240246
if self.start_connect_time and self.start_connect_time + 30 < time.time():
241247
self.start_connect_time = 0
242248
self.config.https_max_connect_thread += 1
@@ -260,14 +266,20 @@ def _create_more_connection_worker(self):
260266
self.connecting_more_thread = None
261267

262268
def _connect_thread(self, sleep_time=0):
269+
if self.config.show_state_debug:
270+
self.logger.debug("_connect_thread")
271+
263272
if sleep_time > 0.1:
273+
self.logger.debug("_connect_thread sleep %f", sleep_time)
264274
time.sleep(sleep_time)
265275

266276
try:
267277
while self.running and self._need_more_ip() and time.time() - self.no_ip_time > 10:
268278
if self.new_conn_pool.qsize() > self.config.https_connection_pool_max:
269279
break
270280

281+
if self.config.show_state_debug:
282+
self.logger.debug("call _connect_process from _connect_thread")
271283
self.start_connect_time = time.time()
272284
self._connect_process()
273285
self.start_connect_time = 0
@@ -277,19 +289,20 @@ def _connect_thread(self, sleep_time=0):
277289
self.thread_num_lock.release()
278290

279291
def _connect_process(self):
292+
if self.config.show_state_debug:
293+
self.logger.debug("_connect_process")
280294
try:
281295
host_info = self.ip_manager.get_ip_sni_host()
282296
if not host_info:
283297
self.no_ip_time = time.time()
284298
with self.no_ip_lock:
285-
# self.logger.warning("not enough ip")
286-
time.sleep(10)
299+
self.logger.warning("not enough ip")
300+
time.sleep(1)
287301
return None
288302

289303
# self.logger.debug("create ssl conn %s", ip_str)
290304
ssl_sock = self._create_ssl_connection(host_info)
291305
if not ssl_sock:
292-
time.sleep(1)
293306
return None
294307

295308
self.new_conn_pool.put((ssl_sock.handshake_time, ssl_sock))
@@ -303,6 +316,9 @@ def _connect_process(self):
303316
self.logger.exception("connect_process except:%r", e)
304317

305318
def _connect_ssl(self, ip_str, sni, host, close_cb, queue):
319+
if self.config.show_state_debug:
320+
self.logger.debug("_connect_ssl")
321+
306322
try:
307323
ssl_sock = self.connect_creator.connect_ssl(ip_str, sni, host, close_cb=close_cb)
308324
queue.put(ssl_sock)
@@ -311,6 +327,9 @@ def _connect_ssl(self, ip_str, sni, host, close_cb, queue):
311327
queue.put(e)
312328

313329
def _create_ssl_connection(self, host_info):
330+
if self.config.show_state_debug:
331+
self.logger.debug("_create_ssl_connection")
332+
314333
ip_str = host_info["ip_str"]
315334
sni = host_info["sni"]
316335
host = host_info["host"]
@@ -337,7 +356,7 @@ def _create_ssl_connection(self, host_info):
337356
return ssl_sock
338357
except socket.error as e:
339358
if str(e) in ["no host", "timeout"]:
340-
time.sleep(3)
359+
pass
341360
elif not self.check_local_network.is_ok(ip_str):
342361
self.logger.debug("connect %s network fail, %r", ip_str, e)
343362
time.sleep(1)
@@ -364,15 +383,20 @@ def get_ssl_connection(self, timeout=30):
364383
end_time = time.time() + timeout
365384
try:
366385
while self.running:
367-
ret = self.new_conn_pool.get(block=True, timeout=1)
386+
ret = self.new_conn_pool.get(block=False)
387+
if not ret:
388+
self._create_more_connection()
389+
ret = self.new_conn_pool.get(block=True, timeout=1)
390+
368391
if ret:
369392
handshake_time, ssl_sock = ret
370393
if time.time() - ssl_sock.last_use_time < self.config.https_keep_alive - 1:
371-
# self.logger.debug("new_conn_pool.get:%s handshake:%d", ssl_sock.ip, handshake_time)
394+
if self.config.show_state_debug:
395+
self.logger.debug("new_conn_pool.get:%s handshake:%d", ssl_sock.ip, handshake_time)
372396
return ssl_sock
373397
else:
374-
# self.logger.debug("new_conn_pool.get:%s handshake:%d timeout.", ssl_sock.ip, handshake_time)
375-
self.ip_manager.report_connect_closed(ssl_sock.ip_str, ssl_sock.sni, "get_timeout")
398+
self.logger.warn("new_conn_pool.get:%s handshake:%d timeout.", ssl_sock.ip, handshake_time)
399+
self.ip_manager.report_connect_closed(ssl_sock.ip_str, ssl_sock.sni, "get_ssl_timeout")
376400
ssl_sock.close()
377401
else:
378402
if time.time() > end_time:

0 commit comments

Comments
 (0)