Welcome! Log In Create A New Profile

Advanced

switch to ms resolution for rate limiting

Jérôme Loyet
November 28, 2022 12:42AM
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
Subject Author Views Posted

switch to ms resolution for rate limiting

Jérôme Loyet 542 November 28, 2022 12:42AM

Re: switch to ms resolution for rate limiting

Maxim Dounin 148 November 29, 2022 10:44PM

Re: switch to ms resolution for rate limiting

Jérôme Loyet 126 February 10, 2023 04:06AM



Sorry, you do not have permission to post/reply in this forum.

Online Users

Guests: 238
Record Number of Users: 8 on April 13, 2023
Record Number of Guests: 421 on December 02, 2018
Powered by nginx      Powered by FreeBSD      PHP Powered      Powered by MariaDB      ipv6 ready