# 多账号与低配服务器负载优化

针对 **2 CPU / 4 GB** 等低配服务器、多账号交易进程同时运行时的 CPU 打满问题，说明主要负载来源与可调参数。

---

## 一、负载从哪里来

### 1. 每个账号 = 一个独立进程

- 每个 `ATS_ACCOUNT_ID` 一个 Python 进程（如 4 个账号 = 4 个进程）。
- 每个进程内：**市场扫描**、**持仓同步**、**User Data Stream**、若为 Leader 还有 **Ticker/K线/BookTicker WS** 及写 Redis。

### 2. CPU 最重的部分：市场扫描

- **扫描阶段**：对「初步筛选」后的几十个交易对，**并发**做「拉 K 线 + 算技术指标（RSI/MACD/布林/ATR/EMA）」。
- 指标是纯 Python 循环，**每个 symbol 算 5+ 个指标**，单次扫描就有大量计算。
- **并发度**：由 `SCAN_CONCURRENT_SYMBOLS` 控制「同时分析几个 symbol」；默认已改为 **2**（原 3）。
- **多进程叠加**：若 4 个进程**同时**开始扫描，相当于 4 × 2 = **8 路**同时在算指标，2 核很容易打满。

因此：**扫描并发**和**多账号是否同时扫**是 CPU 的两大主要来源。

### 3. 其他相对较轻的部分

| 模块 | 说明 | 负载 |
|------|------|------|
| User Data Stream | 每进程 1 个 WS，收订单/持仓/余额 | 低 |
| 市场 WS（Ticker/K线/Book） | 仅 **Leader 进程**建连接并写 Redis，其余进程只从 Redis 读 | Leader 中，其余低 |
| Redis 刷新 | 每 2 秒从 Redis 拉 Ticker/Book 到本地 | 低 |
| 持仓同步 | 每 `POSITION_SYNC_INTERVAL`（如 60s）一次 REST 同步 | 低～中（与持仓数有关） |
| 配置重载 | 每轮扫描前从 Redis 重载配置 | 低 |
| exchange_info / 行情 API | 已优先走 DB/Redis 缓存，未命中才请求 API | 中（主要在未命中时） |

---

## 二、已做的可调项（直接生效）

### 1. 扫描并发：`SCAN_CONCURRENT_SYMBOLS`

- **含义**：单进程内，**同时**分析多少个交易对（K 线 + 指标）。
- **默认**：`2`（适合 2 CPU 4G、多账号）。
- **建议**：
  - 2 CPU 4G、多账号：**2**；
  - 单账号或 4 CPU+：可试 **3～5**。
- **配置**：在 `trading_config` 或 `config.py` 的 `SCAN_CONCURRENT_SYMBOLS` 中设置（数字，1～10）。

### 2. 多账号错峰：`SCAN_STAGGER_BY_ACCOUNT` + `SCAN_STAGGER_SEC`

- **含义**：按 `ATS_ACCOUNT_ID` 延迟**首次**扫描开始时间，避免多进程在同一时刻一起扫。
- **默认**：`SCAN_STAGGER_BY_ACCOUNT=True`，`SCAN_STAGGER_SEC=60`。
- **效果**：例如 4 个账号，则 account 1 立即扫，2 延迟 60s，3 延迟 120s，4 延迟 180s；之后仍按各自 `SCAN_INTERVAL` 循环，自然错开。
- **配置**：
  - `SCAN_STAGGER_BY_ACCOUNT`：`true`/`false`；
  - `SCAN_STAGGER_SEC`：每多一个账号增加的延迟秒数（建议 60～120）。

---

## 三、还可调节的项（按需）

| 配置项 | 说明 | 建议（2 CPU 4G） |
|--------|------|------------------|
| **SCAN_INTERVAL** | 扫描间隔（秒） | 900（15 分钟）或 1800（30 分钟），减少扫描频率 |
| **MAX_SCAN_SYMBOLS** | 参与扫描的最大交易对数 | 200～300，减少进入「详细分析」的 symbol 数 |
| **MIN_CHANGE_PERCENT** / **MIN_VOLUME_24H** | 初步筛选更严 | 略提高可减少 pre_filtered 数量，从而减少指标计算量 |
| **POSITION_SYNC_INTERVAL** | 持仓同步间隔（秒） | 60 或 120，略增可减 REST 调用 |
| **同一台机账号数** | 2 CPU 4G 上跑的进程数 | 建议 ≤ 3～4；若仍卡可先跑 2 个账号 |

---

## 四、推荐组合（2 CPU 4G、多账号）

- `SCAN_CONCURRENT_SYMBOLS` = **2**
- `SCAN_STAGGER_BY_ACCOUNT` = **true**
- `SCAN_STAGGER_SEC` = **60**
- `SCAN_INTERVAL` = **900**（或 1800 若可接受更慢扫描）
- `MAX_SCAN_SYMBOLS` = **200**～**300**（可选）

若仍 CPU 偏高，可再：

- 将 `SCAN_CONCURRENT_SYMBOLS` 降为 **1**，或
- 同一台机器只跑 **2 个**账号，其余账号迁到另一台或扩容后再加。

---

## 五、如何确认是否生效

- 看日志：
  - 多账号错峰：应出现类似「多账号错峰：account_id=2，延迟 60 秒后开始首次扫描」。
  - 扫描并发：无单独日志，可通过「扫描耗时」和 CPU 曲线判断。
- 用 `top`/`htop` 观察：多进程同时扫描时 CPU 应比「错峰 + 并发 2」时明显更低、更平稳。
