<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><style>body { line-height: 1.5; }blockquote { margin-top: 0px; margin-bottom: 0px; margin-left: 0.5em; }p { margin-top: 0px; margin-bottom: 0px; }body { font-size: 10.5pt; font-family: 'Microsoft YaHei UI'; color: rgb(0, 0, 0); line-height: 1.5; }</style></head><body>
<div><span></span>Hi <span style="font-size: 10.5pt; line-height: 1.5; background-color: window;">Francis,</span></div><div><span style="font-size: 10.5pt; line-height: 1.5; background-color: window;"><br></span></div><div>Thanks for help.</div><div><span style="font-size: 10.5pt; line-height: 1.5; background-color: window;">I might have misunderstood some concepts and </span><span style="font-family: Arial, sans-serif; font-size: 13px;">rectify them</span><span style="font-family: Arial, sans-serif; font-size: 13px; orphans: 2; widows: 2; line-height: 1.5; background-color: window;"> here</span><span style="font-size: 10.5pt; line-height: 1.5; background-color: window;">:</span></div><div><b>burst</b>--bucket size;</div><div><b>rate</b>--water leaks speed (not requests sent speed)</div><div><br></div><div>right?</div>
<div><br></div><hr style="width: 210px; height: 1px;" color="#b5c4df" size="1" align="left">
<div><span style="font-size: 12px;"><div style="margin: 10px;"><p style="margin: 3.75pt 0cm; orphans: 2; widows: 2; line-height: 21px;"><font face="微软雅黑, sans-serif">Tong</font></p></div></span></div>
<blockquote style="margin-Top: 0px; margin-Bottom: 0px; margin-Left: 0.5em"><div> </div><div style="border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0cm 0cm 0cm"><div style="PADDING-RIGHT: 8px; PADDING-LEFT: 8px; FONT-SIZE: 12px;FONT-FAMILY:tahoma;COLOR:#000000; BACKGROUND: #efefef; PADDING-BOTTOM: 8px; PADDING-TOP: 8px"><div><b>From:</b> <a href="mailto:francis@daoine.org">Francis Daly</a></div><div><b>Date:</b> 2017-12-02 19:02</div><div><b>To:</b> <a href="mailto:nginx@nginx.org">nginx</a></div><div><b>Subject:</b> Re: Re: How to control the total requests in Ngnix</div></div></div><div><div>On Fri, Dec 01, 2017 at 11:18:06AM +0800, tongshushan@migu.cn wrote:</div>
<div> </div>
<div>Hi there,</div>
<div> </div>
<div>Others have already given some details, so I'll try to put everything</div>
<div>together.</div>
<div> </div>
<div>> limit_req_zone "all" zone=all:100m rate=2000r/s;</div>
<div> </div>
<div>The size of the zone (100m, above) relates to the number of individual</div>
<div>key values that the zone can store -- if you have too many values for</div>
<div>the size, then things can break.</div>
<div> </div>
<div>In your case, you want just one key; so you can have a much smaller</div>
<div>zone size.</div>
<div> </div>
<div>Using 100m won't break things, but it will be wasteful.</div>
<div> </div>
<div> </div>
<div>The way that nginx uses the "rate" value is not "start of second, allow</div>
<div>that number, block the rest until the start of the next second". It is</div>
<div>"turn that number into time-between-requests, and block the second</div>
<div>request if it is within that time of the first".</div>
<div> </div>
<div>> limit_req zone=all burst=100 nodelay;</div>
<div> </div>
<div>"block" can be "return error immediately", or can be "delay until the</div>
<div>right time", depending on what you configure. "nodelay" above means</div>
<div>"return error immediately".</div>
<div> </div>
<div>Rather than strictly requiring a fixed time between requests always, it</div>
<div>can be useful to enforce an average rate; in this case, you configure</div>
<div>"burst" to allow that many requests as quickly as they arrive, before</div>
<div>delaying-or-erroring on the next ones. That is, to use different numbers:</div>
<div> </div>
<div>  rate=1r/s  with  burst=10</div>
<div> </div>
<div>would mean that it would accept 10 requests all at once, but would not</div>
<div>accept the 11th until 10s later (in order to bring the average rate down</div>
<div>to 1r/s).</div>
<div> </div>
<div>Note: that is not exactly what happens -- for that, read the fine source</div>
<div>-- but it is hopefully a clear high-level description of the intent.</div>
<div> </div>
<div> </div>
<div>And one other thing is relevant here: nginx counts in milliseconds. So</div>
<div>I think that you are unlikely to get useful rate limiting once you</div>
<div>approach 1000r/s.</div>
<div> </div>
<div>> but when testing,I use tool to send the request at: Qps:486.1(not reach 2000)  I got the many many 503 error,and the error info as below:</div>
<div>> </div>
<div>>  2017/12/01 11:08:29 [error] 26592#37196: *15466 limiting requests, excess: 101.000 by zone "all", client: 127.0.0.1, server: localhost, request: "GET /private/rush2purchase/inventory/aquire?productId=product1 HTTP/1.1", host: "localhost"</div>
<div>> </div>
<div>> Why excess: 101.000? I set it as 2000r/s ?</div>
<div> </div>
<div>If your tool sends all requests at once, nginx will handle "burst" before</div>
<div>trying to enforce your rate, and your "nodelay" means that nginx should</div>
<div>error immediately then.</div>
<div> </div>
<div>If you remove "nodelay", then nginx should slow down processing without</div>
<div>sending the 503 errors.</div>
<div> </div>
<div>If your tool sends one request every 0.5 ms, then nginx would have a</div>
<div>chance to process them all without exceeding the declared limit rate. (But</div>
<div>the server cannot rely on the client to behave, so the server has to be</div>
<div>told what to do when there is a flood of requests.)</div>
<div> </div>
<div> </div>
<div> </div>
<div>As a way of learning how to limit requests into nginx, this is useful. As</div>
<div>a way of solving a specific problem that you have right now, it may or</div>
<div>may not be useful -- that depends on what the problem is.</div>
<div> </div>
<div>Good luck with it,</div>
<div> </div>
<div>     f</div>
<div>-- </div>
<div>Francis Daly        francis@daoine.org</div>
<div>_______________________________________________</div>
<div>nginx mailing list</div>
<div>nginx@nginx.org</div>
<div>http://mailman.nginx.org/mailman/listinfo/nginx</div>
</div></blockquote>
</body></html>