在哪个系统上我应该选择“musl”或“gnu”二进制文件?

在哪个系统上我应该选择“musl”或“gnu”二进制文件?

musl几个 rust 实用程序包括带有和后缀的 Linux 二进制文件gnu,让我想知道我应该使用哪一个,以及为什么?

例子:

答案1

选择 Musl 的最令人信服的原因是它简单、小巧,并且是容器空间或静态链接可执行文件(如 Rust 和 Go)的首选。造成这种情况的技术原因

GNU C 库往往更复杂,主要是围绕平台的汇编优化和向后兼容性。这是大多数 Linux 发行版使用的解决方案。

至于你给出的例子,sd

  • 关于尺寸,

    • GNU 版本是979 KB
    • Musl 版本是1020 KB
  • 连锁,

    • GNU:如果您看sd-v1.0.0-x86_64-unknown-linux-gnu.tar.gz 一下,ldd您会发现它动态链接到libc.so.6
      ❯ ldd sd
          linux-vdso.so.1 (0x00007ffc8efcf000)
          libgcc_s.so.1 => /lib/x86_64-linux gnu/libgcc_s.so.1 (0x00007f1cad12b000)
          libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f1cacc1f000)
          /lib64/ld-linux-x86-64.so.2 (0x00007f1cad170000)
      
    • Musl,如果你看sd-v1.0.0-x86_64-unknown-linux-gnu.tar.gz一下,ldd你会看到“静态链接”,这实际上意味着它根本不需要 libc,也不需要动态链接器。
      ❯ ldd ./sd
          statically linked
      

因此,只需 41 KB 的差异,您就可以避免打包共享库/lib/x86_64-linux-gnu/libc.so.6。在我的系统上,该库为 1.9 MB

  • 静态链接的 Musl 发行版共 1020 KB
  • GNU 发行版中为 979 KB + 1922 KB(用于 libc)= 总共 2901 KB

答案2

特别是对于 Rust,我的建议是如果性能很重要,请尽可能使用 gnu/glibc因为 musl 二进制文件的速度可能会慢 10 倍,尤其是当多线程很重要时,因为在这种情况下 musl 的标准分配器非常糟糕。

对于 Rust,有已知 表现 问题使用 musl 二进制文件时。这个问题在 2020 年就已报告,但似乎在 2023 年仍是一个问题。这个问题可能可以通过不使用默认分配器来解决,但总的来说,与 glibc 相比,musl 的多线程等功能似乎受到很大影响。

我报告过一个典型案例这里,musl 版本根本不并行(使用的线程越多,实时速度甚至会变得更慢),而 glibc 版本几乎完美地并行(即 10 倍线程数将挂钟速度降低近 10 倍)。在这种情况下,这意味着 musl 比 glibc 版本慢 30 倍以上!

答案3

GNU C 库 (glibc) 是许多发行版使用的标准库。musl libc (muslc) 是一个新的 C 库,旨在轻量、快速、简单、免费、(令人讨厌的)正确。Musl 在某些发行版(如 Alpine Linux)上使用。

第一个提供与 glibc 和 musl 链接的二进制文件。第二个提供与 musl (Linux) 链接的二进制文件,GNU 版本可能是使用 MinGW 编译的。在 Linux 上使用 muslc 版本。(这是我的观点,因为任何软件都有一个与更新、更好的 libc 链接的二进制文件的选项都应该是首选。)

相关内容