并发上限设多少?静态值太小吃不满,太大排队;AIMD 和 gradient 这样的自适应算法能不能自己找到?容量突然变化时呢?这篇用本机的小服务和手写的两种自适应限流器量出来。
上限 | 第 2 到 10 秒到达的请求 | 被客户端拒绝 | 成功 | 成功的速率 | 放行请求延迟中位数 | p99 | 平均上限 --------------------------+-----------------+--------+------+-------+-----------+---------+----- 静态 4 | 2400 | 1863 | 537 | 67/s | 57 ms | 62 ms | 4 静态 8 | 2400 | 1339 | 1061 | 133/s | 57 ms | 62 ms | 8 静态 16 | 2400 | 1264 | 1136 | 142/s | 109 ms | 137 ms | 16 静态 64 | 2400 | 1264 | 1122 | 140/s | 446 ms | 823 ms | 64 静态 256 | 2400 | 1267 | 19 | 2/s | 1804 ms | 3532 ms | 256 AIMD(参照最近 200 个样本的最小 rtt) | 2400 | 1266 | 1134 | 142/s | 72 ms | 96 ms | 10 AIMD(参照最近 2 秒的最小 rtt) | 2400 | 1262 | 1138 | 142/s | 74 ms | 94 ms | 10 gradient | 2400 | 1263 | 1137 | 142/s | 132 ms | 201 ms | 19 (连接类错误 0 次;不是超时,应为 0)
上限太小吃不满容量,太大请求在服务端排队、延迟爆炸;自适应不用事先知道容量。
上限 | 变化之前:成功速率 · p99 | 平均上限 | 变化之后:成功速率 · p99 | 平均上限 -----------------+--------------------+------+-------------------+----- 静态 8 | 132/s · p99 62 ms | 8 | 73/s · p99 113 ms | 8 静态 64 | 124/s · p99 811 ms | 64 | 1/s · p99 1046 ms | 64 AIMD(最近 200 个样本) | 141/s · p99 94 ms | 10 | 10/s · p99 113 ms | 1 AIMD(最近 2 秒) | 140/s · p99 101 ms | 10 | 71/s · p99 182 ms | 8 gradient | 142/s · p99 216 ms | 19 | 75/s · p99 204 ms | 12 (连接类错误 0 次;不是超时,应为 0)
静态上限为变化前调的,变化后服务端排队;自适应能跟着降,但基准 rtt 的取法会让 AIMD 卡死在 1。