# 内存问题排查与优化指南

## 问题症状

- **交易服务启动后卡死**
- **内存占用过高**：交易服务进程占用 55%+ 内存（2.1GB+）
- **系统可用内存不足**：只剩 1GB 左右

## 快速诊断

运行内存诊断脚本：
```bash
cd backend
./检查内存问题.sh
```

## 已做的优化（本次）

### 1. K 线缓存清理机制

**问题**：`_kline_cache` 全局字典会无限增长，每个 symbol 的 K 线数据一直保留在内存中。

**优化**：
- 添加缓存大小限制：最多保留 **200 个** (symbol, interval) 的缓存
- 定期清理：每 **5 分钟**清理一次过期缓存（超过 10 分钟未更新的）
- 自动触发：当缓存达到 80% 容量时立即清理
- 优先清理：按更新时间排序，保留最新的，清理最旧的

**效果**：防止 K 线缓存无限增长，减少内存占用。

## 临时解决方案

### 方法 1：重启交易服务（立即生效）

```bash
# 通过 supervisor
supervisorctl restart auto_sys_*

# 或手动
pkill -f "python.*trading_system.main"
# 然后重新启动
```

**注意**：重启会释放内存，但问题可能再次出现。

### 方法 2：减少扫描的交易对数量

在配置中设置：
```json
{
  "SCAN_MAX_SYMBOLS": 20
}
```

限制每次扫描最多分析 20 个交易对，减少 K 线缓存占用。

### 方法 3：降低扫描频率

```json
{
  "SCAN_INTERVAL_SEC": 600
}
```

将扫描间隔从默认值增加到 10 分钟，减少缓存更新频率。

### 方法 4：禁用 K 线 WebSocket（使用 REST）

如果内存问题持续，可以禁用 K 线 WebSocket，改用 REST API（但会增加 API 调用频率）：

在配置中设置：
```json
{
  "USE_SHARED_MARKET_WS": false
}
```

## 长期优化建议

### 1. 监控内存使用

定期检查交易服务进程的内存占用：
```bash
ps aux | grep "trading_system.main" | awk '{print "PID:", $2, "MEM:", $4"%", "RSS:", $6/1024"MB"}'
```

### 2. 限制订阅数量

确保 `SCAN_MAX_SYMBOLS` 不要太大（建议 ≤ 30），避免订阅过多 symbol。

### 3. 检查其他内存占用源

除了 K 线缓存，还要检查：
- **持仓数据缓存**：`_position_updates_cache`
- **余额缓存**：`_balance_updates_cache`
- **数据库连接池**：确保连接及时释放
- **WebSocket 消息队列**：避免消息堆积

### 4. 考虑升级服务器

如果内存问题持续且无法通过优化解决，考虑：
- 升级到 **4 CPU / 8GB** 服务器
- 或使用 **Redis** 存储 K 线缓存（而不是进程内存）

## 正常内存范围

对于 **2 CPU 4GB** 服务器：

- **Backend 服务**：100-200MB（正常）
- **交易服务（空闲）**：300-500MB（正常）
- **交易服务（扫描中）**：500-800MB（可接受）
- **交易服务（内存泄漏）**：> 1.5GB（异常，需要排查）

当前 **2.1GB** 明显异常，需要排查。

## 排查步骤

1. **运行内存诊断脚本**：`./检查内存问题.sh`
2. **查看交易服务日志**：查找内存相关错误
3. **检查缓存大小**：确认 K 线缓存是否过多
4. **检查订阅数量**：确认是否订阅了过多 symbol
5. **检查数据库查询**：确认是否有大量未释放的连接

## 预防措施

1. **定期重启**：每天或每周重启一次交易服务，释放内存
2. **监控告警**：设置内存使用率告警（> 80%）
3. **限制配置**：确保 `SCAN_MAX_SYMBOLS` 和 `SCAN_CONCURRENT_SYMBOLS` 合理
4. **定期检查**：每周运行一次内存诊断脚本
