musl
几个 rust 实用程序包括带有和后缀的 Linux 二进制文件gnu
,让我想知道我应该使用哪一个,以及为什么?
例子:
- https://github.com/chmln/sd/releases为 Linux 提供 musl 和 gnu
- https://github.com/BurntSushi/ripgrep/releases为 Linux 提供 musl,为 Windows 提供 gnu 和 msvc
答案1
选择 Musl 的最令人信服的原因是它简单、小巧,并且是容器空间或静态链接可执行文件(如 Rust 和 Go)的首选。造成这种情况的技术原因
GNU C 库往往更复杂,主要是围绕平台的汇编优化和向后兼容性。这是大多数 Linux 发行版使用的解决方案。
至于你给出的例子,sd
关于尺寸,
- GNU 版本是
979 KB
- Musl 版本是
1020 KB
- GNU 版本是
连锁,
- 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
- GNU:如果您看
因此,只需 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 链接的二进制文件的选项都应该是首选。)