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

Add an env var to artificially limit the stack size #941

Merged
merged 3 commits into from
Jan 19, 2024

Commits on Jan 19, 2024

  1. Configuration menu
    Copy the full SHA
    1dd47b9 View commit details
    Browse the repository at this point in the history
  2. Reduce stack usage by boxing File in Dist, CachePolicy and larg…

    …e futures (#947)
    
    Windows has a default stack size of 1MB, which makes puffin often fail
    with stack overflows. The PR reduces stack size by three changes:
    
    * Boxing `File` in `Dist`, reducing the size from 496 to 240.
    * Boxing the largest futures.
    * Boxing `CachePolicy`
    
    ## Method
    
    Debugging happened on linux using
    #941 to limit the stack size to
    1MB. Used ran the command below.
    
    ```
    RUSTFLAGS=-Zprint-type-sizes cargo +nightly build -p puffin-cli -j 1 > type-sizes.txt && top-type-sizes -w -s -h 10 < type-sizes.txt > sizes.txt
    ```
    
    The main drawback is top-type-sizes not saying what the `__awaitee` is,
    so it requires manually looking up with a future with matching size.
    
    When the `brotli` features on `reqwest` is active, a lot of brotli types
    show up. Toggling this feature however seems to have no effect. I assume
    they are false positives since the `brotli` crate has elaborate control
    about allocation. The sizes are therefore shown with the feature off.
    
    ## Results
    
    The largest future goes from 12208B to 6416B, the largest type
    (`PrioritizedDistribution`, see also #948) from 17448B to 9264B. Full
    diff: https://gist.github.com/konstin/62635c0d12110a616a1b2bfcde21304f
    
    For the second commit, i iteratively boxed the largest file until the
    tests passed, then with an 800KB stack limit looked through the
    backtrace of a failing test and added some more boxing.
    
    Quick benchmarking showed no difference:
    
    ```console
    $ hyperfine --warmup 2 "target/profiling/main-dev resolve meine_stadt_transparent" "target/profiling/puffin-dev resolve meine_stadt_transparent" 
    Benchmark 1: target/profiling/main-dev resolve meine_stadt_transparent
      Time (mean ± σ):      49.2 ms ±   3.0 ms    [User: 39.8 ms, System: 24.0 ms]
      Range (min … max):    46.6 ms …  63.0 ms    55 runs
     
      Warning: Statistical outliers were detected. Consider re-running this benchmark on a quiet system without any interferences from other programs. It might help to use the '--warmup' or '--prepare' options.
     
    Benchmark 2: target/profiling/puffin-dev resolve meine_stadt_transparent
      Time (mean ± σ):      47.4 ms ±   3.2 ms    [User: 41.3 ms, System: 20.6 ms]
      Range (min … max):    44.6 ms …  60.5 ms    62 runs
     
      Warning: Statistical outliers were detected. Consider re-running this benchmark on a quiet system without any interferences from other programs. It might help to use the '--warmup' or '--prepare' options.
     
    Summary
      target/profiling/puffin-dev resolve meine_stadt_transparent ran
        1.04 ± 0.09 times faster than target/profiling/main-dev resolve meine_stadt_transparent
    ```
    konstin authored Jan 19, 2024
    Configuration menu
    Copy the full SHA
    6748cf8 View commit details
    Browse the repository at this point in the history
  3. Revert "Reduce stack usage by boxing File in Dist, CachePolicy

    …and large futures" (#1003)
    
    Reverts #947
    konstin authored Jan 19, 2024
    Configuration menu
    Copy the full SHA
    692ab5b View commit details
    Browse the repository at this point in the history