#!/bin/bash # 快速诊断系统负载问题 echo "=== 系统负载诊断工具 ===" echo "" # 1. 当前负载 echo "📊 当前负载情况:" uptime echo "" # 2. CPU 和内存使用 echo "💻 CPU 和内存使用:" top -bn1 | head -5 echo "" # 3. 查看占用 CPU 最高的进程 echo "🔥 CPU 占用最高的进程(前 10):" ps aux --sort=-%cpu | head -11 | awk '{printf "%-8s %-6s %-6s %-6s %s\n", $1, $2, $3"%", $4"%", $11}' echo "" # 4. 查看 Python 进程(交易服务) echo "🐍 Python 进程(交易服务):" PYTHON_PROCS=$(ps aux | grep -E "python.*trading|python.*main|uvicorn" | grep -v grep) if [ -z "$PYTHON_PROCS" ]; then echo " ⚠️ 未发现交易服务进程(服务可能未运行)" else echo "$PYTHON_PROCS" | awk '{printf "PID: %-6s CPU: %-5s MEM: %-5s CMD: %s\n", $2, $3"%", $4"%", $11" "$12" "$13" "$14}' fi echo "" # 5. 检查是否有同步操作在运行 echo "🔄 检查同步操作:" if [ -f "logs/api.log" ]; then SYNC_LOGS=$(tail -100 logs/api.log | grep -i "同步\|sync.*binance\|sync_trades" | tail -10) if [ -z "$SYNC_LOGS" ]; then echo " 未找到同步日志(可能未执行同步操作)" else echo "最近的同步日志(最后 10 行):" echo "$SYNC_LOGS" fi else echo " ⚠️ 日志文件不存在(backend 服务可能未运行)" fi echo "" # 6. 检查数据库连接数 echo "🗄️ 数据库连接数:" if command -v mysql >/dev/null 2>&1; then DB_HOST="${DB_HOST:-localhost}" DB_USER="${DB_USER:-root}" DB_PASS="${DB_PASS:-}" DB_NAME="${DB_NAME:-auto_trade_sys}" if [ -n "$DB_PASS" ]; then mysql -h"$DB_HOST" -u"$DB_USER" -p"$DB_PASS" -e "SHOW PROCESSLIST;" 2>/dev/null | head -20 || echo " 无法连接数据库" else mysql -h"$DB_HOST" -u"$DB_USER" -e "SHOW PROCESSLIST;" 2>/dev/null | head -20 || echo " 无法连接数据库(需要配置 DB_PASS)" fi else echo " mysql 客户端未安装" fi echo "" # 7. 检查内存使用详情 echo "💾 内存使用详情:" free -h echo "" # 8. 检查是否有大量 I/O 等待 echo "📈 I/O 和系统状态(5秒采样):" vmstat 1 5 echo "" # 9. 检查交易服务日志中的错误 echo "⚠️ 最近的错误日志(最后 5 条):" if [ -f "logs/api.log" ]; then tail -200 logs/api.log | grep -i "error\|exception\|failed\|timeout" | tail -5 || echo " 未找到错误日志" fi if [ -f "../trading_system/logs/trading_*.log" ] 2>/dev/null; then tail -200 ../trading_system/logs/trading_*.log 2>/dev/null | grep -i "error\|exception\|failed" | tail -5 || echo "" fi echo "" echo "=== 诊断完成 ===" echo "" echo "💡 说明:" echo " - 此脚本可以在交易服务未运行时使用,用于检查系统整体负载" echo " - 如果交易服务正在运行,会显示更详细的进程和日志信息" echo "" echo "💡 如果负载高,可能原因:" echo " 1. Python 进程(交易服务)占用高:" echo " - 市场扫描正在运行(计算技术指标)" echo " - 订单同步正在运行(从币安拉取大量订单)" echo " - 数据库查询慢(检查慢查询日志)" echo "" echo " 2. 其他进程占用高:" echo " - 检查 top/htop 查看具体是哪个进程" echo " - 可能是系统更新、备份等后台任务" echo "" echo " 3. 内存占用高:检查是否有内存泄漏" echo "" echo " 4. I/O 等待高:可能是数据库查询慢或磁盘慢" echo "" echo "💡 临时降负载方法:" echo " - 暂停市场扫描(在配置中设置 SCAN_ENABLED=False)" echo " - 等待同步操作完成(不要手动取消)" echo " - 重启交易服务(如果进程异常)" echo " - 降低扫描并发(设置 SCAN_CONCURRENT_SYMBOLS=1)"