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