[PATCH 1 of 4] QUIC: optimized ACK delay
Sergey Kandaurov
pluknet at nginx.com
Thu Aug 10 15:48:33 UTC 2023
> On 27 Jul 2023, at 16:42, Roman Arutyunyan <arut at nginx.com> wrote:
>
> # HG changeset patch
> # User Roman Arutyunyan <arut at nginx.com>
> # Date 1690461437 -14400
> # Thu Jul 27 16:37:17 2023 +0400
> # Node ID 2fd16fc76920ef0b8ea2fa64858934e38c4477c5
> # Parent 904c99bede1770d92566b56939c5b6ec85f05b55
> QUIC: optimized ACK delay.
>
> Previously ACK was not generated if max_ack_delay was not yet expired and the
> number of unacknowledged ack-eliciting packets was less than two, as allowed by
> RFC 9000 13.2.1-13.2.2. However this only makes sense to avoid sending ACK-only
> packets, as explained by the RFC:
>
> On the other hand, reducing the frequency of packets that carry only
> acknowledgments reduces packet transmission and processing cost at both
> endpoints.
>
> Now ACK is delayed only if output frame queue is empty. Otherwise ACK is sent
> immediately, which significantly improves QUIC performance with certain tests.
>
> diff --git a/src/event/quic/ngx_event_quic_ack.c b/src/event/quic/ngx_event_quic_ack.c
> --- a/src/event/quic/ngx_event_quic_ack.c
> +++ b/src/event/quic/ngx_event_quic_ack.c
> @@ -1171,7 +1171,8 @@ ngx_quic_generate_ack(ngx_connection_t *
> delay = ngx_current_msec - ctx->ack_delay_start;
> qc = ngx_quic_get_connection(c);
>
> - if (ctx->send_ack < NGX_QUIC_MAX_ACK_GAP
> + if (ngx_queue_empty(&ctx->frames)
> + && ctx->send_ack < NGX_QUIC_MAX_ACK_GAP
> && delay < qc->tp.max_ack_delay)
> {
> if (!qc->push.timer_set && !qc->closing) {
Looks good.
--
Sergey Kandaurov
More information about the nginx-devel
mailing list