OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "net/quic/core/congestion_control/bbr_sender.h" | 5 #include "net/quic/core/congestion_control/bbr_sender.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <map> | 8 #include <map> |
9 #include <memory> | 9 #include <memory> |
10 | 10 |
(...skipping 325 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
336 sender_->ExportDebugState().max_bandwidth); | 336 sender_->ExportDebugState().max_bandwidth); |
337 // TODO(ianswett): Expect 0 packets are lost once BBR no longer measures | 337 // TODO(ianswett): Expect 0 packets are lost once BBR no longer measures |
338 // bandwidth higher than the link rate. | 338 // bandwidth higher than the link rate. |
339 EXPECT_FALSE(sender_->ExportDebugState().last_sample_is_app_limited); | 339 EXPECT_FALSE(sender_->ExportDebugState().last_sample_is_app_limited); |
340 // The margin here is high, because the aggregation greatly increases | 340 // The margin here is high, because the aggregation greatly increases |
341 // smoothed rtt. | 341 // smoothed rtt. |
342 EXPECT_GE(kTestRtt * 4, rtt_stats_->smoothed_rtt()); | 342 EXPECT_GE(kTestRtt * 4, rtt_stats_->smoothed_rtt()); |
343 ExpectApproxEq(kTestRtt, rtt_stats_->min_rtt(), 0.1f); | 343 ExpectApproxEq(kTestRtt, rtt_stats_->min_rtt(), 0.1f); |
344 } | 344 } |
345 | 345 |
| 346 TEST_F(BbrSenderTest, SimpleTransfer2RTTAggregationKeepSending) { |
| 347 FLAGS_quic_reloadable_flag_quic_bbr_ack_spacing2 = false; |
| 348 FLAGS_quic_reloadable_flag_quic_bbr_ack_aggregation_bytes = false; |
| 349 FLAGS_quic_reloadable_flag_quic_bbr_add_tso_cwnd = false; |
| 350 FLAGS_quic_reloadable_flag_quic_bbr_keep_sending_at_recent_rate = true; |
| 351 CreateDefaultSetup(); |
| 352 // 2 RTTs of aggregation, with a max of 10kb. |
| 353 EnableAggregation(10 * 1024, 2 * kTestRtt); |
| 354 |
| 355 // Transfer 12MB. |
| 356 DoSimpleTransfer(12 * 1024 * 1024, QuicTime::Delta::FromSeconds(35)); |
| 357 EXPECT_EQ(BbrSender::PROBE_BW, sender_->ExportDebugState().mode); |
| 358 // It's possible to read a bandwidth as much as 50% too high with aggregation. |
| 359 EXPECT_LE(kTestLinkBandwidth * 0.99f, |
| 360 sender_->ExportDebugState().max_bandwidth); |
| 361 // TODO(ianswett): Tighten this bound once we understand why BBR is |
| 362 // overestimating bandwidth with aggregation. b/36022633 |
| 363 EXPECT_GE(kTestLinkBandwidth * 1.5f, |
| 364 sender_->ExportDebugState().max_bandwidth); |
| 365 // TODO(ianswett): Expect 0 packets are lost once BBR no longer measures |
| 366 // bandwidth higher than the link rate. |
| 367 EXPECT_FALSE(sender_->ExportDebugState().last_sample_is_app_limited); |
| 368 // The margin here is high, because the aggregation greatly increases |
| 369 // smoothed rtt. |
| 370 EXPECT_GE(kTestRtt * 4, rtt_stats_->smoothed_rtt()); |
| 371 ExpectApproxEq(kTestRtt, rtt_stats_->min_rtt(), 0.1f); |
| 372 } |
| 373 |
346 // Test a simple long data transfer with 2 rtts of aggregation. | 374 // Test a simple long data transfer with 2 rtts of aggregation. |
347 TEST_F(BbrSenderTest, SimpleTransferAckDecimation) { | 375 TEST_F(BbrSenderTest, SimpleTransferAckDecimation) { |
348 FLAGS_quic_reloadable_flag_quic_bbr_ack_spacing2 = false; | 376 FLAGS_quic_reloadable_flag_quic_bbr_ack_spacing2 = false; |
349 FLAGS_quic_reloadable_flag_quic_bbr_ack_aggregation_bytes = true; | 377 FLAGS_quic_reloadable_flag_quic_bbr_ack_aggregation_bytes = true; |
350 // Decrease the CWND gain so extra CWND is required with stretch acks. | 378 // Decrease the CWND gain so extra CWND is required with stretch acks. |
351 base::SetFlag(&FLAGS_quic_bbr_cwnd_gain, 1.0); | 379 base::SetFlag(&FLAGS_quic_bbr_cwnd_gain, 1.0); |
352 sender_ = new BbrSender( | 380 sender_ = new BbrSender( |
353 rtt_stats_, | 381 rtt_stats_, |
354 QuicSentPacketManagerPeer::GetUnackedPacketMap( | 382 QuicSentPacketManagerPeer::GetUnackedPacketMap( |
355 QuicConnectionPeer::GetSentPacketManager(bbr_sender_.connection())), | 383 QuicConnectionPeer::GetSentPacketManager(bbr_sender_.connection())), |
(...skipping 17 matching lines...) Expand all Loading... |
373 sender_->ExportDebugState().max_bandwidth); | 401 sender_->ExportDebugState().max_bandwidth); |
374 // TODO(ianswett): Expect 0 packets are lost once BBR no longer measures | 402 // TODO(ianswett): Expect 0 packets are lost once BBR no longer measures |
375 // bandwidth higher than the link rate. | 403 // bandwidth higher than the link rate. |
376 EXPECT_FALSE(sender_->ExportDebugState().last_sample_is_app_limited); | 404 EXPECT_FALSE(sender_->ExportDebugState().last_sample_is_app_limited); |
377 // The margin here is high, because the aggregation greatly increases | 405 // The margin here is high, because the aggregation greatly increases |
378 // smoothed rtt. | 406 // smoothed rtt. |
379 EXPECT_GE(kTestRtt * 2, rtt_stats_->smoothed_rtt()); | 407 EXPECT_GE(kTestRtt * 2, rtt_stats_->smoothed_rtt()); |
380 ExpectApproxEq(kTestRtt, rtt_stats_->min_rtt(), 0.1f); | 408 ExpectApproxEq(kTestRtt, rtt_stats_->min_rtt(), 0.1f); |
381 } | 409 } |
382 | 410 |
| 411 TEST_F(BbrSenderTest, SimpleTransferAckDecimationKeepSending) { |
| 412 FLAGS_quic_reloadable_flag_quic_bbr_ack_spacing2 = false; |
| 413 FLAGS_quic_reloadable_flag_quic_bbr_ack_aggregation_bytes = false; |
| 414 FLAGS_quic_reloadable_flag_quic_bbr_keep_sending_at_recent_rate = true; |
| 415 // Decrease the CWND gain so extra CWND is required with stretch acks. |
| 416 base::SetFlag(&FLAGS_quic_bbr_cwnd_gain, 1.0); |
| 417 sender_ = new BbrSender( |
| 418 rtt_stats_, |
| 419 QuicSentPacketManagerPeer::GetUnackedPacketMap( |
| 420 QuicConnectionPeer::GetSentPacketManager(bbr_sender_.connection())), |
| 421 kInitialCongestionWindowPackets, kDefaultMaxCongestionWindowPackets, |
| 422 &random_); |
| 423 QuicConnectionPeer::SetSendAlgorithm(bbr_sender_.connection(), sender_); |
| 424 // Enable Ack Decimation on the receiver. |
| 425 QuicConnectionPeer::SetAckMode(receiver_.connection(), |
| 426 QuicConnection::AckMode::ACK_DECIMATION); |
| 427 CreateDefaultSetup(); |
| 428 |
| 429 // Transfer 12MB. |
| 430 DoSimpleTransfer(12 * 1024 * 1024, QuicTime::Delta::FromSeconds(35)); |
| 431 EXPECT_EQ(BbrSender::PROBE_BW, sender_->ExportDebugState().mode); |
| 432 // It's possible to read a bandwidth as much as 50% too high with aggregation. |
| 433 EXPECT_LE(kTestLinkBandwidth * 0.99f, |
| 434 sender_->ExportDebugState().max_bandwidth); |
| 435 // TODO(ianswett): Tighten this bound once we understand why BBR is |
| 436 // overestimating bandwidth with aggregation. b/36022633 |
| 437 EXPECT_GE(kTestLinkBandwidth * 1.5f, |
| 438 sender_->ExportDebugState().max_bandwidth); |
| 439 // TODO(ianswett): Expect 0 packets are lost once BBR no longer measures |
| 440 // bandwidth higher than the link rate. |
| 441 EXPECT_FALSE(sender_->ExportDebugState().last_sample_is_app_limited); |
| 442 // The margin here is high, because the aggregation greatly increases |
| 443 // smoothed rtt. |
| 444 EXPECT_GE(kTestRtt * 2, rtt_stats_->smoothed_rtt()); |
| 445 ExpectApproxEq(kTestRtt, rtt_stats_->min_rtt(), 0.1f); |
| 446 } |
| 447 |
383 // Test the number of losses incurred by the startup phase in a situation when | 448 // Test the number of losses incurred by the startup phase in a situation when |
384 // the buffer is less than BDP. | 449 // the buffer is less than BDP. |
385 TEST_F(BbrSenderTest, PacketLossOnSmallBufferStartup) { | 450 TEST_F(BbrSenderTest, PacketLossOnSmallBufferStartup) { |
386 CreateSmallBufferSetup(); | 451 CreateSmallBufferSetup(); |
387 | 452 |
388 DriveOutOfStartup(); | 453 DriveOutOfStartup(); |
389 float loss_rate = | 454 float loss_rate = |
390 static_cast<float>(bbr_sender_.connection()->GetStats().packets_lost) / | 455 static_cast<float>(bbr_sender_.connection()->GetStats().packets_lost) / |
391 bbr_sender_.connection()->GetStats().packets_sent; | 456 bbr_sender_.connection()->GetStats().packets_sent; |
392 EXPECT_LE(loss_rate, 0.27); | 457 EXPECT_LE(loss_rate, 0.27); |
(...skipping 331 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
724 sender_->ResumeConnectionState(params, false); | 789 sender_->ResumeConnectionState(params, false); |
725 EXPECT_EQ(kTestLinkBandwidth, sender_->ExportDebugState().max_bandwidth); | 790 EXPECT_EQ(kTestLinkBandwidth, sender_->ExportDebugState().max_bandwidth); |
726 EXPECT_EQ(kTestLinkBandwidth, sender_->BandwidthEstimate()); | 791 EXPECT_EQ(kTestLinkBandwidth, sender_->BandwidthEstimate()); |
727 ExpectApproxEq(kTestRtt, sender_->ExportDebugState().min_rtt, 0.01f); | 792 ExpectApproxEq(kTestRtt, sender_->ExportDebugState().min_rtt, 0.01f); |
728 | 793 |
729 DriveOutOfStartup(); | 794 DriveOutOfStartup(); |
730 } | 795 } |
731 | 796 |
732 } // namespace test | 797 } // namespace test |
733 } // namespace net | 798 } // namespace net |
OLD | NEW |