主要观点:Nix 表达式求值器的速度显著影响 Nix 用户体验,Nixpkgs 和 NixOS 近年来增长迅速,导致一些操作耗时增加,如nix search nixpkgs
和评估 NixOS 系统配置。虽有改进,但并行求值这一明显途径未被采用,Determinate Systems 最近实现了并行求值器,已取得显著性能提升,如速度提升 3 - 4 倍。
关键信息:
- Nix 中值由 24 字节结构表示,纯函数语言利于并行求值,但 thunks 是个例外。
- 使求值器线程安全需满足无“半更新”thunk、thunk 不被多次求值、不影响单线程性能等要求,采取了一系列措施,如将“type”字段设为
std::atomic
等。 - 目前只有两个
nix
子命令可跨多线程工作,如nix flake show
和nix search
,并行求值器能大幅提升速度。
重要细节: - Nixpkgs 16.03 中列出所有包需不到 3 秒,24.05 中需超 15 秒;16.03 中评估小 NixOS 配置需不到半秒,现在需超 3 秒。
- 并行求值器在 Ryzen 5900X(12 核)上,单线程求值需 23.70s,多线程(12 线程)降至 5.77s,速度提升 4.1 倍;
nix search
从 11.82s 降至 3.88s(16 线程),速度提升 3.0 倍,因有更多共享依赖。 - 若要尝试并行求值器,可运行
nix shell github:DeterminateSystems/nix-src/multithreaded-eval
,并设置NR_CORES
环境变量指定线程数,如NR_CORES=8 nix search --no-eval-cache nixpkgs hello
。未来将使更多nix
子命令支持多线程,如nix flake check
,单 flakes 输出属性评估也应自动利用并行性。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。