Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 

120 строки
3.9 KiB

  1. #!/bin/bash
  2. # 并发 RPM 限流测试脚本
  3. # 使用 Redis 令牌桶,测试 RPM=2 的并发安全性
  4. BASE_URL="http://172.22.48.1:3000"
  5. API_KEY="sk-1-ShkCnu0B4FTDiggowWiVZWFf349QFRt6rpdNBKQ1AZBpsD33"
  6. MODEL="deepseek-r1"
  7. CONCURRENT=20
  8. echo "======================================"
  9. echo " 用户模型 RPM 限流 - Redis 并发测试"
  10. echo "======================================"
  11. echo "RPM=2, 并发=$CONCURRENT, 模型=$MODEL"
  12. echo "令牌桶参数: Capacity=120, Rate=2, Requested=60"
  13. echo ""
  14. # 先清理旧的 Redis key
  15. echo "[0] 清理旧限流 key..."
  16. redis-cli -p 36379 DEL "rateLimit:UMRL:1:deepseek-r1" 2>/dev/null
  17. redis-cli -p 36379 DEL "user_model_rate_limit:1" 2>/dev/null
  18. sleep 1
  19. echo ""
  20. echo "[1] 测试并发 $CONCURRENT 个请求..."
  21. success=0
  22. rejected=0
  23. pids=()
  24. results_dir=$(mktemp -d)
  25. for i in $(seq 1 $CONCURRENT); do
  26. (
  27. status_code=$(curl -s -o /dev/null -w "%{http_code}" \
  28. "$BASE_URL/v1/chat/completions" \
  29. -H "Authorization: Bearer $API_KEY" \
  30. -H "Content-Type: application/json" \
  31. -d "{\"model\":\"$MODEL\",\"messages\":[{\"role\":\"user\",\"content\":\"hi\"}],\"max_tokens\":5}" \
  32. --connect-timeout 5 \
  33. --max-time 30)
  34. echo "$status_code" > "$results_dir/req_$i"
  35. ) &
  36. pids+=($!)
  37. done
  38. # 等待所有请求完成
  39. for pid in "${pids[@]}"; do
  40. wait $pid 2>/dev/null
  41. done
  42. # 统计结果
  43. echo ""
  44. echo "--- 结果 ---"
  45. for i in $(seq 1 $CONCURRENT); do
  46. code=$(cat "$results_dir/req_$i" 2>/dev/null || echo "000")
  47. if [ "$code" = "200" ]; then
  48. success=$((success + 1))
  49. echo " 请求 $i: $code ✓"
  50. elif [ "$code" = "429" ]; then
  51. rejected=$((rejected + 1))
  52. echo " 请求 $i: $code (限流)"
  53. else
  54. echo " 请求 $i: $code (其他)"
  55. fi
  56. done
  57. echo ""
  58. echo "======================================"
  59. echo " 统计"
  60. echo "======================================"
  61. echo "成功 (200): $success"
  62. echo "限流 (429): $rejected"
  63. echo "预期: 成功 <= 2, 限流 >= $((CONCURRENT - 2))"
  64. echo ""
  65. if [ "$success" -le 2 ]; then
  66. echo "✅ 测试通过!并发安全,最多 2 个请求成功"
  67. else
  68. echo "❌ 测试失败!预期最多 2 个成功,实际 $success 个"
  69. fi
  70. # 检查 Redis 中的令牌桶状态
  71. echo ""
  72. echo "--- Redis 令牌桶状态 ---"
  73. redis-cli -p 36379 HGETALL "rateLimit:UMRL:1:deepseek-r1" 2>/dev/null || echo "(无法连接 Redis)"
  74. # 清理
  75. rm -rf "$results_dir"
  76. echo ""
  77. echo "[2] 测试顺序请求(3 次连续,第 3 次 429)..."
  78. redis-cli -p 36379 DEL "rateLimit:UMRL:1:deepseek-r1" 2>/dev/null
  79. sleep 1
  80. code1=$(curl -s -o /dev/null -w "%{http_code}" "$BASE_URL/v1/chat/completions" \
  81. -H "Authorization: Bearer $API_KEY" -H "Content-Type: application/json" \
  82. -d "{\"model\":\"$MODEL\",\"messages\":[{\"role\":\"user\",\"content\":\"test1\"}],\"max_tokens\":5}" \
  83. --connect-timeout 5 --max-time 30)
  84. echo " 请求 1: $code1"
  85. code2=$(curl -s -o /dev/null -w "%{http_code}" "$BASE_URL/v1/chat/completions" \
  86. -H "Authorization: Bearer $API_KEY" -H "Content-Type: application/json" \
  87. -d "{\"model\":\"$MODEL\",\"messages\":[{\"role\":\"user\",\"content\":\"test2\"}],\"max_tokens\":5}" \
  88. --connect-timeout 5 --max-time 30)
  89. echo " 请求 2: $code2"
  90. code3=$(curl -s -o /dev/null -w "%{http_code}" "$BASE_URL/v1/chat/completions" \
  91. -H "Authorization: Bearer $API_KEY" -H "Content-Type: application/json" \
  92. -d "{\"model\":\"$MODEL\",\"messages\":[{\"role\":\"user\",\"content\":\"test3\"}],\"max_tokens\":5}" \
  93. --connect-timeout 5 --max-time 30)
  94. echo " 请求 3: $code3"
  95. if [ "$code1" = "200" ] && [ "$code2" = "200" ] && [ "$code3" = "429" ]; then
  96. echo "✅ 顺序测试通过!前 2 次 200,第 3 次 429"
  97. else
  98. echo "❌ 顺序测试失败!预期 200/200/429,实际 $code1/$code2/$code3"
  99. fi
  100. echo ""
  101. echo "--- Redis 令牌桶最终状态 ---"
  102. redis-cli -p 36379 HGETALL "rateLimit:UMRL:1:deepseek-r1" 2>/dev/null || echo "(无法连接 Redis)"