summary refs log tree commit diff
path: root/pkgs/shells
diff options
context:
space:
mode:
authorSergei Trofimovich <slyich@gmail.com>2023-08-19 07:53:39 +0100
committerSergei Trofimovich <slyich@gmail.com>2023-08-19 08:39:13 +0100
commit8708ae0e37084d44dfc2d89e5d14731382f82236 (patch)
treeb6bcc4e0b05e72a85266a90b0c24f38acfd18269 /pkgs/shells
parent50a4d6349c0e6a3610608f23bd66b2d0aaa47d2f (diff)
downloadnixpkgs-8708ae0e37084d44dfc2d89e5d14731382f82236.tar
nixpkgs-8708ae0e37084d44dfc2d89e5d14731382f82236.tar.gz
nixpkgs-8708ae0e37084d44dfc2d89e5d14731382f82236.tar.bz2
nixpkgs-8708ae0e37084d44dfc2d89e5d14731382f82236.tar.lz
nixpkgs-8708ae0e37084d44dfc2d89e5d14731382f82236.tar.xz
nixpkgs-8708ae0e37084d44dfc2d89e5d14731382f82236.tar.zst
nixpkgs-8708ae0e37084d44dfc2d89e5d14731382f82236.zip
bash: disable `bash-malloc` everywhere, not just on `musl`
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
Diffstat (limited to 'pkgs/shells')
-rw-r--r--pkgs/shells/bash/5.nix7
1 files changed, 6 insertions, 1 deletions
diff --git a/pkgs/shells/bash/5.nix b/pkgs/shells/bash/5.nix
index 00b4a707ed0..7e815751ef7 100644
--- a/pkgs/shells/bash/5.nix
+++ b/pkgs/shells/bash/5.nix
@@ -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"
@@ -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"
   ];