基于Hector的测试

1、基于limit-conn的连接限流
image

#限流方法: 10 线程、100 并发连接、持续 10 秒
wrk -t10 -c50 -d10s --latency http://192.168.0.203:10004/zn
Running 10s test @ http://192.168.0.203:10004/zn
  10 threads and 50 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    25.53ms   28.14ms 266.53ms   90.03%
    Req/Sec   257.94     77.79   444.00     64.99%
  Latency Distribution
     50%   15.61ms
     75%   23.08ms
     90%   53.54ms
     99%  129.19ms
  25681 requests in 10.03s, 6.10MB read
  Non-2xx or 3xx responses: 24850
Requests/sec:   2559.95
Transfer/sec:    623.05KB
##结果解读
| 指标             | 数值         | 含义                    |
| -------------- | ---------- | --------------------- |
| 总请求            | 24,268     | 10 秒内发出的请求            |
| Non-2xx or 3xx | **23,367** | 被拒绝的请求(就是你配的 **503**) |
| 成功率            | ~3.7%      | 只有约 901 个请求正常通过       |
##结论
符合预期

2、基于limit-conn的限流计数
image

##规则解读:
同一个 IP 地址,每 60 秒内最多只能访问 /zn 100 次。第 101 次开始,网关直接返回 503,Body 为「歇会吧,再来」。60 秒后计数器重置,又能访问 100 次。
##限流方法:
 for i in {1..105}; do   code=$(curl -s -o /dev/null -w "%{http_code}" http://192.168.0.203:10004/zn);   if [ $i -eq 1 ] || [ $i -eq 100 ] || [ $i -eq 101 ] || [ $i -eq 105 ]; then     echo "Request $i: HTTP $code";   fi; done
Request 1: HTTP 200
Request 100: HTTP 200
Request 101: HTTP 503
Request 105: HTTP 503
##结果解读:
前 100 个全部 200,从第 101 个开始全部 503 
##结论:
符合预期

3、基于limit-conn的请求限流
image

##规则解读:
同一个 IP,请求像水流一样进入漏桶。桶以 50 次/秒 的固定速率出水。如果瞬间来了一大波请求,桶里最多能缓冲 5 个排队等待;第 6 个及以后的请求,桶装不下,直接溢出返回 503
##限流方法:
cat 1.sh
#!/bin/bash
URL="http://192.168.0.203:10004/zn"
TOTAL=60

TMP=$(mktemp)
trap "rm -f $TMP" EXIT

echo "[*] 正在并发发送 $TOTAL 个请求..."
for i in $(seq 1 $TOTAL); do
  (
    ms=$(date +%s%N)
    code=$(curl -s -o /dev/null -w "%{http_code}" --max-time 5 "$URL")
    ms=$(( ($(date +%s%N) - ms) / 1000000 ))
    echo "$code $ms" >> "$TMP"
  ) &
done
wait

echo ""
echo "=================================================="
echo "Total : $TOTAL"
awk '$1==200{ok++} $1==503{rej++} {sum+=$2; count++}
     END{print "200   : "ok; print "503   : "rej;
         if(count) print "Avg ms: "int(sum/count+0.5)}' "$TMP"
echo "=================================================="

echo ""
echo "[200 响应延迟 Top 10](看是否有阶梯状延迟)"
grep "^200 " "$TMP" | awk '{print $2}' | sort -n | head -10 | nl
##结果解读:
[*] 正在并发发送 60 个请求...

==================================================
Total : 60
200   : 9
503   : 51
Avg ms: 68
==================================================

[200 响应延迟 Top 10](看是否有阶梯状延迟)
     1  63
     2  70
     3  86
     4  100
     5  114
     6  128
     7  147
     8  160
     9  189
200   : 9        ← 漏桶放行(1个直接处理 + 8个排队)
503   : 51       ← 桶满溢出,直接拒绝
Avg ms: 68       ← 包含排队延迟的平均值
为什么是 9 个成功,而不是 6 个?
理论上 rate=50/s + burst=5 应该是 1 个直接处理 + 5 个排队 = 6 个成功。
实际是 9 个,原因是:
脚本创建 60 个后台 curl 进程不是绝对同时完成的,这个过程本身花了几十毫秒。
在这几十毫秒内,漏桶一直在以 50/s 的速率"漏水"(处理请求),所以桶里又空出了 3 个位置,导致第 7-9 个请求也能挤进排队队列。

4、

posted @ 2026-08-07 09:07  ZANAN  阅读(6)  评论(0)    收藏  举报