Skip to content

Commit

Permalink
bash: disable bash-malloc everywhere, not just on musl
Browse files Browse the repository at this point in the history
TIme to time I bump into pathological behaviour of `bash` memory
allocator. Today's example:

    $ time { ls /nix/store/ > /dev/null; }
    real    0m0,965s user    0m0,876s sys     0m0,087s
    $ time { echo /nix/store/* > /dev/null; }
    real    2m18,287s user    2m17,946s sys     0m0,125s
    $ time { echo /nix/store/* > /dev/null; }
    real    0m1,764s user    0m1,712s sys     0m0,048s

Note how initial `echo` takes alsmot 2 minutes to finish.

Let's rely  on system's allocator instead.

After the change initial run is fast again:

    $ time { echo /nix/store/* > /dev/null; }
    real    0m1,328s user    0m1,264s sys     0m0,063s
  • Loading branch information
trofi committed Aug 19, 2023
1 parent 50a4d63 commit 8708ae0
Showing 1 changed file with 6 additions and 1 deletion.
7 changes: 6 additions & 1 deletion pkgs/shells/bash/5.nix
Expand Up @@ -64,6 +64,12 @@ stdenv.mkDerivation rec {
];

configureFlags = [
# At least on Linux bash memory allocator has pathological performance
# in scenarios involving use of larger memory:
# https://lists.gnu.org/archive/html/bug-bash/2023-08/msg00052.html
# Various distributions default to system allocator. Let's nixpkgs
# do the same.
"--without-bash-malloc"
(if interactive then "--with-installed-readline" else "--disable-readline")
] ++ lib.optionals (stdenv.hostPlatform != stdenv.buildPlatform) [
"bash_cv_job_control_missing=nomissing"
Expand All @@ -77,7 +83,6 @@ stdenv.mkDerivation rec {
"bash_cv_dev_fd=standard"
"bash_cv_termcap_lib=libncurses"
] ++ lib.optionals (stdenv.hostPlatform.libc == "musl") [
"--without-bash-malloc"
"--disable-nls"
];

Expand Down

0 comments on commit 8708ae0

Please sign in to comment.