在 `kline_stream.py` 中新增缓存清理机制,限制缓存总大小并定期清理过期条目,防止内存无限增长。更新 `backend/诊断负载.sh` 脚本,优化系统负载检查逻辑,提供更详细的进程与日志信息,提升用户对交易服务状态的监控能力。此改动增强了系统的稳定性与性能。
94 lines
3.2 KiB
Bash
Executable File
94 lines
3.2 KiB
Bash
Executable File
#!/bin/bash
|
||
# 检查交易服务内存问题
|
||
|
||
echo "=== 交易服务内存问题诊断 ==="
|
||
echo ""
|
||
|
||
# 1. 查看交易服务进程的详细内存信息
|
||
echo "📊 交易服务进程内存详情:"
|
||
TRADING_PID=$(ps aux | grep "trading_system.main" | grep -v grep | awk '{print $2}')
|
||
if [ -z "$TRADING_PID" ]; then
|
||
echo " ⚠️ 未找到交易服务进程"
|
||
exit 1
|
||
fi
|
||
|
||
echo "进程 PID: $TRADING_PID"
|
||
ps -p $TRADING_PID -o pid,vsz,rss,%mem,cmd
|
||
echo ""
|
||
|
||
# 2. 查看进程的内存映射(找出占用大的区域)
|
||
echo "📈 进程内存映射(前 20 行,按大小排序):"
|
||
if [ -f "/proc/$TRADING_PID/smaps" ]; then
|
||
cat /proc/$TRADING_PID/smaps 2>/dev/null | awk '/^Size:/ {size=$2} /^Rss:/ {rss=$2} /^Pss:/ {pss=$2} /^Name:/ {if (rss > 1024) print size" KB (RSS: "rss" KB) - " $2}' | sort -rn | head -20 || echo " 无法读取内存映射(需要 root 权限)"
|
||
else
|
||
echo " 无法访问 /proc/$TRADING_PID/smaps"
|
||
fi
|
||
echo ""
|
||
|
||
# 3. 查看交易服务日志中的内存相关错误
|
||
echo "🔍 检查交易服务日志:"
|
||
LOG_DIRS=(
|
||
"../trading_system/logs"
|
||
"logs"
|
||
"/www/wwwroot/autosys_new/trading_system/logs"
|
||
)
|
||
|
||
for LOG_DIR in "${LOG_DIRS[@]}"; do
|
||
if [ -d "$LOG_DIR" ]; then
|
||
echo "检查目录: $LOG_DIR"
|
||
# 查找内存相关错误
|
||
find "$LOG_DIR" -name "*.log" -type f -mtime -1 2>/dev/null | while read logfile; do
|
||
echo " 文件: $logfile"
|
||
# 查找内存错误
|
||
grep -i "memory\|oom\|out of memory\|memoryerror\|memory leak" "$logfile" 2>/dev/null | tail -5 || echo " 未找到内存相关错误"
|
||
# 查找最近的错误
|
||
tail -50 "$logfile" 2>/dev/null | grep -i "error\|exception\|failed" | tail -5 || echo " 未找到错误"
|
||
done
|
||
break
|
||
fi
|
||
done
|
||
echo ""
|
||
|
||
# 4. 查看系统内存压力
|
||
echo "💾 系统内存压力:"
|
||
free -h
|
||
echo ""
|
||
echo "内存使用率:"
|
||
free | awk 'NR==2{printf "已用: %.1f%%\n", $3*100/$2}'
|
||
echo ""
|
||
|
||
# 5. 检查是否有 swap 使用(如果有说明内存不足)
|
||
echo "🔄 Swap 使用情况:"
|
||
free | awk 'NR==3{if ($3 > 0) print "⚠️ Swap 正在使用: " $3 " KB (内存不足)"; else print "✓ Swap 未使用"}'
|
||
echo ""
|
||
|
||
# 6. 查看最近的交易服务输出
|
||
echo "📝 最近的交易服务输出(最后 30 行):"
|
||
for LOG_DIR in "${LOG_DIRS[@]}"; do
|
||
if [ -d "$LOG_DIR" ]; then
|
||
find "$LOG_DIR" -name "trading_*.log" -o -name "*.out.log" -type f 2>/dev/null | head -1 | while read logfile; do
|
||
if [ -f "$logfile" ]; then
|
||
tail -30 "$logfile" 2>/dev/null
|
||
break
|
||
fi
|
||
done
|
||
break
|
||
fi
|
||
done
|
||
echo ""
|
||
|
||
echo "=== 诊断完成 ==="
|
||
echo ""
|
||
echo "💡 可能的原因:"
|
||
echo " 1. K线数据缓存过大(market_scanner 加载了太多历史K线)"
|
||
echo " 2. 持仓数据或订单数据在内存中累积"
|
||
echo " 3. WebSocket 连接或消息队列占用过多内存"
|
||
echo " 4. 数据库查询结果集太大(未使用 LIMIT)"
|
||
echo " 5. 内存泄漏(某个数据结构不断增长)"
|
||
echo ""
|
||
echo "💡 临时解决方案:"
|
||
echo " 1. 重启交易服务(释放内存)"
|
||
echo " 2. 检查配置中的缓存大小限制"
|
||
echo " 3. 减少扫描的交易对数量"
|
||
echo " 4. 检查是否有大量未关闭的数据库连接"
|