From d34605b0a4e4f5cac3829425e862610e279b807f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Bostr=C3=B6m?= Date: Fri, 19 Aug 2022 14:53:59 +0200 Subject: [PATCH] Add "WebRTC-BurstyPacer/burst:20ms" field trial. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This experiment will tell if we still see the performance gains that we saw with the "bursty slacked pacer" even if we don't apply slack (since the "slack without burst" showed little impact at Stable). The hope is that without slack all quality regressions will go away but that bursting will still provide the desired performance benefits. Bug: chromium:1354491 Change-Id: I95f05d040713addaaa1856c8e374a01c27311612 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/272366 Commit-Queue: Henrik Boström Reviewed-by: Erik Språng Cr-Commit-Position: refs/heads/main@{#37845} --- modules/pacing/task_queue_paced_sender.cc | 21 +++++++++++++++++++-- modules/pacing/task_queue_paced_sender.h | 9 +++++++++ 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/modules/pacing/task_queue_paced_sender.cc b/modules/pacing/task_queue_paced_sender.cc index fffb371c17..b13bc11546 100644 --- a/modules/pacing/task_queue_paced_sender.cc +++ b/modules/pacing/task_queue_paced_sender.cc @@ -25,6 +25,8 @@ namespace webrtc { namespace { +constexpr const char* kBurstyPacerFieldTrial = "WebRTC-BurstyPacer"; + constexpr const char* kSlackedTaskQueuePacedSenderFieldTrial = "WebRTC-SlackedTaskQueuePacedSender"; @@ -32,6 +34,12 @@ constexpr const char* kSlackedTaskQueuePacedSenderFieldTrial = const int TaskQueuePacedSender::kNoPacketHoldback = -1; +TaskQueuePacedSender::BurstyPacerFlags::BurstyPacerFlags( + const FieldTrialsView& field_trials) + : burst("burst") { + ParseFieldTrial({&burst}, field_trials.Lookup(kBurstyPacerFieldTrial)); +} + TaskQueuePacedSender::SlackedPacerFlags::SlackedPacerFlags( const FieldTrialsView& field_trials) : allow_low_precision("Enabled"), @@ -50,6 +58,7 @@ TaskQueuePacedSender::TaskQueuePacedSender( TimeDelta max_hold_back_window, int max_hold_back_window_in_packets) : clock_(clock), + bursty_pacer_flags_(field_trials), slacked_pacer_flags_(field_trials), max_hold_back_window_(slacked_pacer_flags_.allow_low_precision ? PacingController::kMinSleepTime @@ -67,10 +76,18 @@ TaskQueuePacedSender::TaskQueuePacedSender( "TaskQueuePacedSender", TaskQueueFactory::Priority::NORMAL)) { RTC_DCHECK_GE(max_hold_back_window_, PacingController::kMinSleepTime); + // There are multiple field trials that can affect burst. If multiple bursts + // are specified we pick the largest of the values. + absl::optional burst = bursty_pacer_flags_.burst.GetOptional(); if (slacked_pacer_flags_.allow_low_precision && slacked_pacer_flags_.send_burst_interval) { - pacing_controller_.SetSendBurstInterval( - slacked_pacer_flags_.send_burst_interval.Value()); + TimeDelta slacked_burst = slacked_pacer_flags_.send_burst_interval.Value(); + if (!burst.has_value() || burst.value() < slacked_burst) { + burst = slacked_burst; + } + } + if (burst.has_value()) { + pacing_controller_.SetSendBurstInterval(burst.value()); } } diff --git a/modules/pacing/task_queue_paced_sender.h b/modules/pacing/task_queue_paced_sender.h index 769cedb124..97b0453e0b 100644 --- a/modules/pacing/task_queue_paced_sender.h +++ b/modules/pacing/task_queue_paced_sender.h @@ -131,6 +131,15 @@ class TaskQueuePacedSender : public RtpPacketPacer, public RtpPacketSender { Stats GetStats() const; Clock* const clock_; + struct BurstyPacerFlags { + // Parses `kBurstyPacerFieldTrial`. Example: + // --force-fieldtrials=WebRTC-BurstyPacer/burst:20ms/ + explicit BurstyPacerFlags(const FieldTrialsView& field_trials); + // If set, the pacer is allowed to build up a packet "debt" that correspond + // to approximately the send rate during the specified interval. + FieldTrialOptional burst; + }; + const BurstyPacerFlags bursty_pacer_flags_; struct SlackedPacerFlags { // Parses `kSlackedTaskQueuePacedSenderFieldTrial`. Example: // --force-fieldtrials=WebRTC-SlackedTaskQueuePacedSender/Enabled,max_queue_time:75ms/