[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