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