auto_trade_sys/backend/检查内存问题.sh
薇薇安 80872231a5 feat(kline_stream, diagnostics): 增强 K线缓存管理与系统负载诊断功能
在 `kline_stream.py` 中新增缓存清理机制,限制缓存总大小并定期清理过期条目,防止内存无限增长。更新 `backend/诊断负载.sh` 脚本,优化系统负载检查逻辑,提供更详细的进程与日志信息,提升用户对交易服务状态的监控能力。此改动增强了系统的稳定性与性能。
2026-02-19 00:06:23 +08:00

94 lines
3.2 KiB
Bash
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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. 检查是否有大量未关闭的数据库连接"