Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: auto-tune stream receive window #1868

Draft
wants to merge 22 commits into
base: main
Choose a base branch
from

Commits on Apr 25, 2024

  1. test(transport): maximum throughput on unlimited bandwidth and 50ms

    This commit adds a basic smoke test using the `test-ficture` simulator,
    asserting that on a connection with unlimited bandwidth and 50ms round-trip-time
    Neqo can eventually achieve > 1 Gbit/s throughput.
    
    Showcases the potential a future stream flow-control auto-tuning algorithm can have.
    
    See mozilla#733.
    mxinden committed Apr 25, 2024
    Configuration menu
    Copy the full SHA
    c0a72ce View commit details
    Browse the repository at this point in the history

Commits on May 2, 2024

  1. feat: auto-tune stream receive window

    Previously the stream send and receive window had a hard limit at 1MB. On high
    latency and/or high bandwidth connections, 1 MB is not enough to exhaust the
    available bandwidth.
    
    Sample scenario:
    
    ```
    delay_s = 0.05
    window_bits = 1 * 1024 * 1024 * 8
    bandwidth_bits_s = window_bits / delay_s
    bandwidth_mbits_s = bandwidth_bits_s / 1024 / 1024 # 160.0
    ```
    
    In other words, on a 50 ms connection a 1 MB window can at most achieve 160
    Mbit/s.
    
    This commit introduces an auto-tuning algorithm for the stream receive window,
    increasing the window towards the bandwidth-delay product of the connection.
    mxinden committed May 2, 2024
    Configuration menu
    Copy the full SHA
    5c2aa4c View commit details
    Browse the repository at this point in the history

Commits on May 7, 2024

  1. clippy

    mxinden committed May 7, 2024
    Configuration menu
    Copy the full SHA
    1bfd2f5 View commit details
    Browse the repository at this point in the history
  2. Configuration menu
    Copy the full SHA
    167d93f View commit details
    Browse the repository at this point in the history
  3. fix tests

    mxinden committed May 7, 2024
    Configuration menu
    Copy the full SHA
    edc4035 View commit details
    Browse the repository at this point in the history

Commits on May 14, 2024

  1. Configuration menu
    Copy the full SHA
    12390c8 View commit details
    Browse the repository at this point in the history
  2. Configuration menu
    Copy the full SHA
    0ad1b77 View commit details
    Browse the repository at this point in the history
  3. add TODO starting below 1MiB

    mxinden committed May 14, 2024
    Configuration menu
    Copy the full SHA
    8e6a5af View commit details
    Browse the repository at this point in the history

Commits on May 15, 2024

  1. Add NonRandomDelay

    mxinden committed May 15, 2024
    Configuration menu
    Copy the full SHA
    716ba20 View commit details
    Browse the repository at this point in the history
  2. Configuration menu
    Copy the full SHA
    3b2a52b View commit details
    Browse the repository at this point in the history
  3. Configuration menu
    Copy the full SHA
    dba8190 View commit details
    Browse the repository at this point in the history

Commits on Nov 1, 2024

  1. Configuration menu
    Copy the full SHA
    9b9524e View commit details
    Browse the repository at this point in the history

Commits on Nov 17, 2024

  1. test(transport): assert maximum bandwidth on gbit link

    This commit adds a basic smoke test using the `test-fixture` simulator,
    asserting the expected bandwidth on a 1 gbit link.
    
    Given mozilla#733, the current expected bandwidth
    is limited by the fixed sized stream receive buffer (1MiB).
    mxinden committed Nov 17, 2024
    Configuration menu
    Copy the full SHA
    1b2a370 View commit details
    Browse the repository at this point in the history

Commits on Nov 19, 2024

  1. debugging

    mxinden committed Nov 19, 2024
    Configuration menu
    Copy the full SHA
    ac5d024 View commit details
    Browse the repository at this point in the history

Commits on Dec 1, 2024

  1. Configuration menu
    Copy the full SHA
    22f1d7e View commit details
    Browse the repository at this point in the history
  2. deduplicate in fc.rs

    mxinden committed Dec 1, 2024
    Configuration menu
    Copy the full SHA
    db3cfe5 View commit details
    Browse the repository at this point in the history

Commits on Dec 2, 2024

  1. Google vs Thomson vs BDP

    mxinden committed Dec 2, 2024
    Configuration menu
    Copy the full SHA
    62dc2ba View commit details
    Browse the repository at this point in the history
  2. More testing

    mxinden committed Dec 2, 2024
    Configuration menu
    Copy the full SHA
    841d086 View commit details
    Browse the repository at this point in the history
  3. Adjust bench

    mxinden committed Dec 2, 2024
    Configuration menu
    Copy the full SHA
    5ec58cb View commit details
    Browse the repository at this point in the history
  4. Move to benchmark

    mxinden committed Dec 2, 2024
    Configuration menu
    Copy the full SHA
    6dd3829 View commit details
    Browse the repository at this point in the history
  5. fix(sim): correct Waiting state comparison in NodeHolder::ready()

    A `Node` (e.g. a `Client`, `Server` or `TailDrop` router) can be in 3 states:
    
    ``` rust
    enum NodeState {
        /// The node just produced a datagram.  It should be activated again as soon as possible.
        Active,
        /// The node is waiting.
        Waiting(Instant),
        /// The node became idle.
        Idle,
    }
    ```
    
    `NodeHolder::ready()` determines whether a `Node` is ready to be processed
    again. When `NodeState::Waiting`, it should only be ready when `t <= now`, i.e.
    the waiting time has passed, not `t >= now`.
    
    ``` rust
    impl NodeHolder {
        fn ready(&self, now: Instant) -> bool {
            match self.state {
                Active => true,
                Waiting(t) => t <= now, // not >=
                Idle => false,
            }
        }
    }
    ```
    
    The previous behavior lead to wastefull non-ready `Node`s being processed and
    thus a large test runtime when e.g. simulating a gbit
    connection (mozilla#2203).
    mxinden committed Dec 2, 2024
    Configuration menu
    Copy the full SHA
    a6fc729 View commit details
    Browse the repository at this point in the history
  6. Configuration menu
    Copy the full SHA
    f9b9a27 View commit details
    Browse the repository at this point in the history