From 25b2c2af4933086236377ff7bade939da2a2a10e Mon Sep 17 00:00:00 2001 From: zzlgreat Date: Thu, 18 Dec 2025 22:06:22 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0Company=E9=A1=B5=E9=9D=A2?= =?UTF-8?q?=E7=9A=84UI=E4=B8=BAFUI=E9=A3=8E=E6=A0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app.py | 22 ++++++++++++---------- gunicorn_eventlet_config.py | 28 ++++++++++++++++++---------- 2 files changed, 30 insertions(+), 20 deletions(-) diff --git a/app.py b/app.py index 7b360dbb..c8494ba9 100755 --- a/app.py +++ b/app.py @@ -220,11 +220,12 @@ load_trading_days() engine = create_engine( "mysql+pymysql://root:Zzl33818!@127.0.0.1:3306/stock?charset=utf8mb4", echo=False, - pool_size=10, - pool_recycle=3600, - pool_pre_ping=True, - pool_timeout=30, - max_overflow=20 + pool_size=50, # 每个 worker 常驻连接数 + pool_recycle=1800, # 连接回收时间 30 分钟(原 1 小时) + pool_pre_ping=True, # 使用前检测连接是否有效 + pool_timeout=20, # 获取连接超时时间(秒) + max_overflow=100 # 每个 worker 临时溢出连接数 + # 每个 worker 最多 150 个连接,32 workers 总共最多 4800 个连接 ) # Elasticsearch 客户端初始化 @@ -709,11 +710,12 @@ app.config['COMPRESS_MIMETYPES'] = [ app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:Zzl33818!@127.0.0.1:3306/stock?charset=utf8mb4' app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False app.config['SQLALCHEMY_ENGINE_OPTIONS'] = { - 'pool_size': 10, - 'pool_recycle': 3600, - 'pool_pre_ping': True, - 'pool_timeout': 30, - 'max_overflow': 20 + 'pool_size': 50, # 每个 worker 常驻连接数 + 'pool_recycle': 1800, # 连接回收时间 30 分钟(原 1 小时) + 'pool_pre_ping': True, # 使用前检测连接是否有效 + 'pool_timeout': 20, # 获取连接超时时间(秒) + 'max_overflow': 100 # 每个 worker 临时溢出连接数 + # 每个 worker 最多 150 个连接,32 workers 总共最多 4800 个连接 } # Cache directory setup CACHE_DIR = Path('cache') diff --git a/gunicorn_eventlet_config.py b/gunicorn_eventlet_config.py index 3c07fe43..fa31790d 100644 --- a/gunicorn_eventlet_config.py +++ b/gunicorn_eventlet_config.py @@ -1,9 +1,9 @@ # -*- coding: utf-8 -*- """ -Gunicorn 配置文件 - Eventlet 极限高并发配置(110.42.32.207 专用) +Gunicorn 配置文件 - Eventlet 高并发配置(48核128GB 专用) 服务器配置: 48核心 128GB 内存 -目标并发: 160,000+ 并发连接 +目标并发: 5,000-10,000 实际并发(理论 320,000 连接) 使用方式: # 设置环境变量后启动 @@ -14,10 +14,12 @@ Gunicorn 配置文件 - Eventlet 极限高并发配置(110.42.32.207 专用) REDIS_HOST=127.0.0.1 gunicorn -c gunicorn_eventlet_config.py app:app 架构说明: - - 16 个 Eventlet Worker(每个占用 1 核心,预留 32 核给系统/Redis/MySQL) + - 32 个 Eventlet Worker(每个占用 1 核心,预留 16 核给系统/Redis/MySQL) - 每个 Worker 处理 10000+ 并发连接(协程异步 I/O) + - 数据库连接池: 32 workers × 150 = 4800 连接(实际瓶颈) - Redis 消息队列同步跨 Worker 的 WebSocket 消息 - - 总并发能力: 16 × 10000 = 160,000+ 连接 + - 理论并发能力: 32 × 10000 = 320,000 连接 + - 实际并发能力: 5,000-10,000(受数据库连接限制) """ import os @@ -32,9 +34,9 @@ os.environ.setdefault('REDIS_HOST', '127.0.0.1') bind = '0.0.0.0:5001' # Worker 进程数 -# 48 核心机器: 16 Workers(预留资源给 Redis/MySQL/系统) +# 48 核心机器: 32 Workers(目标 5000-10000 并发) # 每个 Eventlet Worker 是单线程但支持协程并发 -workers = 16 +workers = 32 # Worker 类型 - eventlet 异步模式 worker_class = 'eventlet' @@ -97,14 +99,17 @@ def on_starting(server): workers = server.app.cfg.workers connections = server.app.cfg.worker_connections total = workers * connections + db_pool = workers * 150 # pool_size=50 + max_overflow=100 print("=" * 70) - print("🚀 Gunicorn + Eventlet 极限高并发服务器正在启动...") + print("🚀 Gunicorn + Eventlet 高并发服务器正在启动...") print("=" * 70) print(f" 服务器配置: 48核心 128GB 内存") print(f" Workers: {workers} 个 Eventlet 协程进程") print(f" 每 Worker 连接数: {connections:,}") - print(f" 总并发能力: {total:,} 连接") + print(f" 理论并发能力: {total:,} 连接") + print(f" 数据库连接池: {db_pool:,} 连接(实际瓶颈)") + print(f" 目标实际并发: 5,000-10,000") print("-" * 70) print(f" Bind: {server.app.cfg.bind}") print(f" Max Requests: {server.app.cfg.max_requests:,}") @@ -122,18 +127,21 @@ def when_ready(server): workers = server.app.cfg.workers connections = server.app.cfg.worker_connections total = workers * connections + db_pool = workers * 150 print("=" * 70) print(f"✅ Gunicorn + Eventlet 服务准备就绪!") print(f" {workers} 个 Worker 已启动") - print(f" 总并发能力: {total:,} 连接") + print(f" 理论并发能力: {total:,} 连接") + print(f" 数据库连接池: {db_pool:,} 连接") + print(f" 目标实际并发: 5,000-10,000") print(f" WebSocket + HTTP API 混合高并发已启用") print("=" * 70) def post_worker_init(worker): """Worker 初始化完成后调用""" - print(f"✅ Eventlet Worker {worker.pid} 已初始化 (10,000 并发连接就绪)") + print(f"✅ Eventlet Worker {worker.pid} 已初始化 (10,000 并发连接 + 150 数据库连接就绪)") # 触发事件轮询初始化(使用 Redis 锁确保只有一个 Worker 启动调度器) try: