Add "WebRTC-BurstyPacer/burst:20ms" field trial.

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 <hbos@webrtc.org>
Reviewed-by: Erik Språng <sprang@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#37845}
This commit is contained in:
Henrik Boström 2022-08-19 14:53:59 +02:00 committed by WebRTC LUCI CQ
parent 0cd0dd3b07
commit d34605b0a4
2 changed files with 28 additions and 2 deletions

View File

@ -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<TimeDelta> 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());
}
}

View File

@ -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<TimeDelta> burst;
};
const BurstyPacerFlags bursty_pacer_flags_;
struct SlackedPacerFlags {
// Parses `kSlackedTaskQueuePacedSenderFieldTrial`. Example:
// --force-fieldtrials=WebRTC-SlackedTaskQueuePacedSender/Enabled,max_queue_time:75ms/