test_concurrent_mining.sh 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. #!/bin/bash
  2. # 测试并发挖矿脚本
  3. # 用于验证多核CPU优化的实现
  4. set -e
  5. echo "=== Nockchain 并发挖矿测试 ==="
  6. # 检查构建是否完成
  7. if [ ! -f "target/release/nockchain" ]; then
  8. echo "错误: nockchain 二进制文件不存在,请先运行 'make build'"
  9. exit 1
  10. fi
  11. # 获取系统CPU核心数
  12. CPU_CORES=$(sysctl -n hw.ncpu 2>/dev/null || nproc 2>/dev/null || echo "4")
  13. echo "检测到 CPU 核心数: $CPU_CORES"
  14. # 测试不同的并发参数
  15. TEST_CASES=(
  16. "1:单线程挖矿"
  17. "2:双线程挖矿"
  18. "4:四线程挖矿"
  19. "$CPU_CORES:全核心挖矿"
  20. "$((CPU_CORES * 2)):超线程测试"
  21. )
  22. MINING_PUBKEY="31pK6dSu7PsQd6H8HKQo79iMXCvBTt4oDR12X7WbE4MsFLCa6YchVDP2B9Wu4rxGn5vNpsA5sppeJizi2UfS117iGERgr2eQELsQJYzChn52oVLTcHvd4sKUiK6GT4QrQG8S"
  23. # 创建测试目录
  24. TEST_DIR="test_mining_$(date +%Y%m%d_%H%M%S)"
  25. mkdir -p "$TEST_DIR"
  26. cd "$TEST_DIR"
  27. echo "测试目录: $(pwd)"
  28. for test_case in "${TEST_CASES[@]}"; do
  29. IFS=':' read -r threads description <<< "$test_case"
  30. echo ""
  31. echo "=== 测试: $description (线程数: $threads) ==="
  32. # 创建子目录
  33. test_subdir="test_${threads}_threads"
  34. mkdir -p "$test_subdir"
  35. cd "$test_subdir"
  36. # 设置日志级别以便看到详细信息
  37. export RUST_LOG="info,nockchain=debug"
  38. export RUST_BACKTRACE=1
  39. echo "开始挖矿测试,线程数: $threads"
  40. echo "如果在30秒内没有成功,将自动停止测试"
  41. # 启动挖矿节点,设置超时
  42. timeout 30s ../../target/release/nockchain \
  43. --npc-socket "nockchain_${threads}.sock" \
  44. --mining-pubkey "$MINING_PUBKEY" \
  45. --max-concurrent-mining-attempts "$threads" \
  46. --mine \
  47. --fakenet \
  48. --genesis-leader \
  49. --genesis-message "测试并发挖矿 - ${threads}线程" \
  50. 2>&1 | tee "mining_${threads}.log" &
  51. mining_pid=$!
  52. # 等待挖矿过程
  53. sleep 5
  54. # 检查进程是否还在运行
  55. if ps -p $mining_pid > /dev/null; then
  56. echo "挖矿进程正在运行 (PID: $mining_pid)"
  57. # 检查日志中是否有并发挖矿的迹象
  58. if grep -q "Starting mining attempt" "mining_${threads}.log"; then
  59. echo "✅ 成功: 检测到挖矿尝试开始"
  60. else
  61. echo "⚠️ 警告: 未检测到挖矿尝试"
  62. fi
  63. if grep -q "max concurrent attempts" "mining_${threads}.log"; then
  64. echo "✅ 成功: 检测到并发参数配置"
  65. else
  66. echo "⚠️ 警告: 未检测到并发参数配置"
  67. fi
  68. # 停止挖矿进程
  69. kill $mining_pid 2>/dev/null || true
  70. wait $mining_pid 2>/dev/null || true
  71. else
  72. echo "❌ 失败: 挖矿进程提前退出"
  73. fi
  74. # 分析日志
  75. echo "分析日志文件..."
  76. if [ -f "mining_${threads}.log" ]; then
  77. echo "日志行数: $(wc -l < mining_${threads}.log)"
  78. # 检查错误
  79. if grep -i "error\|panic\|failed" "mining_${threads}.log" | head -5; then
  80. echo "❌ 发现错误日志"
  81. else
  82. echo "✅ 未发现错误日志"
  83. fi
  84. # 检查性能指标
  85. if grep -o "active attempts: [0-9]*" "mining_${threads}.log" | tail -5; then
  86. echo "✅ 发现活跃挖矿尝试记录"
  87. fi
  88. fi
  89. cd ..
  90. echo "测试 $description 完成"
  91. done
  92. cd ..
  93. echo ""
  94. echo "=== 测试总结 ==="
  95. echo "所有测试已完成。检查 $TEST_DIR 目录中的日志文件以获取详细信息。"
  96. echo ""
  97. echo "要手动测试挖矿,请运行:"
  98. echo " ./target/release/nockchain \\"
  99. echo " --mining-pubkey $MINING_PUBKEY \\"
  100. echo " --max-concurrent-mining-attempts $CPU_CORES \\"
  101. echo " --mine --fakenet --genesis-leader"
  102. echo ""
  103. echo "多核挖矿优化测试完成!"