Hello,
I'm using rate limiting within the stream module. While it works great
for long connections it does not work on request smaller than the rate
limite size for 1 second. I set up a 1gbps rate limit (limit_rate
125m) and request smaller than 125M or not limited. This is a normal
behavioir as the rate limiting is done with a second precision. This
patch change second precision to millisecond precision. From my first
tests (still on going) it seems to works better.
What guys do you think about this patch ?
Thanks
++ Jerome
# HG changeset patch
# User Jerome Loyet <jerome@loyet.net>
# Date 1669612614 -3600
# Mon Nov 28 06:16:54 2022 +0100
# Node ID a474ad7ca3408d2b09cd7bfbc827c8df84e3bd0c
# Parent 0b360747c74e3fa7e439e0684a8cf1da2d14d8f6
switch to ms resolution for rate limiting
rate limiting use a second resolution which can be bypassed on
requests/response smaller than the configured rate for 1 second.
This patch switches to millisecond resolution to ensure
better precision of the rate limiting.
diff -r 0b360747c74e -r a474ad7ca340 src/event/ngx_event_pipe.c
--- a/src/event/ngx_event_pipe.c Thu Nov 24 23:08:30 2022 +0400
+++ b/src/event/ngx_event_pipe.c Mon Nov 28 06:16:54 2022 +0100
@@ -203,8 +203,8 @@
break;
}
- limit = (off_t) p->limit_rate * (ngx_time() - p->start_sec + 1)
- - p->read_length;
+ limit = (off_t) p->limit_rate * (ngx_current_msec -
p->start_msec + 1)
+ / 1000 - p->read_length;
if (limit <= 0) {
p->upstream->read->delayed = 1;
diff -r 0b360747c74e -r a474ad7ca340 src/event/ngx_event_pipe.h
--- a/src/event/ngx_event_pipe.h Thu Nov 24 23:08:30 2022 +0400
+++ b/src/event/ngx_event_pipe.h Mon Nov 28 06:16:54 2022 +0100
@@ -91,7 +91,7 @@
ngx_buf_t *buf_to_file;
size_t limit_rate;
- time_t start_sec;
+ ngx_msec_t start_msec;
ngx_temp_file_t *temp_file;
diff -r 0b360747c74e -r a474ad7ca340 src/http/ngx_http_upstream.c
--- a/src/http/ngx_http_upstream.c Thu Nov 24 23:08:30 2022 +0400
+++ b/src/http/ngx_http_upstream.c Mon Nov 28 06:16:54 2022 +0100
@@ -3217,7 +3217,7 @@
p->pool = r->pool;
p->log = c->log;
p->limit_rate = u->conf->limit_rate;
- p->start_sec = ngx_time();
+ p->start_msec = ngx_current_msec;
p->cacheable = u->cacheable || u->store;
diff -r 0b360747c74e -r a474ad7ca340 src/stream/ngx_stream_proxy_module.c
--- a/src/stream/ngx_stream_proxy_module.c Thu Nov 24 23:08:30 2022 +0400
+++ b/src/stream/ngx_stream_proxy_module.c Mon Nov 28 06:16:54 2022 +0100
@@ -435,7 +435,7 @@
}
u->peer.type = c->type;
- u->start_sec = ngx_time();
+ u->start_msec = ngx_current_msec;
c->write->handler = ngx_stream_proxy_downstream_handler;
c->read->handler = ngx_stream_proxy_downstream_handler;
@@ -1679,8 +1679,8 @@
&& !src->read->error)
{
if (limit_rate) {
- limit = (off_t) limit_rate * (ngx_time() - u->start_sec + 1)
- - *received;
+ limit = (off_t) limit_rate * (ngx_current_msec -
u->start_msec + 1)
+ / 1000 - *received;
if (limit <= 0) {
src->read->delayed = 1;
diff -r 0b360747c74e -r a474ad7ca340 src/stream/ngx_stream_upstream.h
--- a/src/stream/ngx_stream_upstream.h Thu Nov 24 23:08:30 2022 +0400
+++ b/src/stream/ngx_stream_upstream.h Mon Nov 28 06:16:54 2022 +0100
@@ -127,7 +127,7 @@
ngx_chain_t *downstream_busy;
off_t received;
- time_t start_sec;
+ ngx_msec_t start_msec;
ngx_uint_t requests;
ngx_uint_t responses;
ngx_msec_t start_time;
_______________________________________________
nginx-devel mailing list -- nginx-devel@nginx.org
To unsubscribe send an email to nginx-devel-leave@nginx.org