mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-08-07 07:37:02 +02:00
QUIC pacing was recently implemented to limit burst and improve overall bandwidth. This is used only for MUX STREAM emission. Pacing requires nanosecond resolution. As such, it used now_cpu_time() which relies on clock_gettime() syscall. The usage of clock_gettime() has several drawbacks : * it is a syscall and thus requires a context-switch which may hurt performance * it is not be available on all systems * timestamp is retrieved multiple times during a single task execution, thus yielding different values which may tamper pacing calculation Improve this by using task_mono_time() instead. This returns task call time from the scheduler thread context. It requires the flag TASK_F_WANTS_TIME on QUIC MUX tasklet to force the scheduler to update call time with now_mono_time(). This solves every limitations listed above : * syscall invokation is only performed once before tasklet execution, thus reducing context-switch impact * on non compatible system, a millisecond timer is used as a fallback which should ensure that pacing works decently for them * timer value is now guaranteed to be fixed duing task execution
18 lines
528 B
C
18 lines
528 B
C
#include <haproxy/quic_pacing.h>
|
|
|
|
#include <haproxy/quic_tx.h>
|
|
#include <haproxy/task.h>
|
|
|
|
/* Returns true if <pacer> timer is expired and emission can be retried. */
|
|
int quic_pacing_expired(const struct quic_pacer *pacer)
|
|
{
|
|
return !pacer->next || pacer->next <= task_mono_time();
|
|
}
|
|
|
|
/* Notify <pacer> about an emission of <sent> count of datagrams. */
|
|
void quic_pacing_sent_done(struct quic_pacer *pacer, int sent)
|
|
{
|
|
pacer->next = task_mono_time() + pacer->cc->algo->pacing_rate(pacer->cc) * sent;
|
|
pacer->last_sent = sent;
|
|
}
|