并行 Nix 评估

主要观点:Nix 表达式求值器的速度显著影响 Nix 用户体验,Nixpkgs 和 NixOS 近年来增长迅速,导致一些操作耗时增加,如nix search nixpkgs和评估 NixOS 系统配置。虽有改进,但并行求值这一明显途径未被采用,Determinate Systems 最近实现了并行求值器,已取得显著性能提升,如速度提升 3 - 4 倍。
关键信息

  • Nix 中值由 24 字节结构表示,纯函数语言利于并行求值,但 thunks 是个例外。
  • 使求值器线程安全需满足无“半更新”thunk、thunk 不被多次求值、不影响单线程性能等要求,采取了一系列措施,如将“type”字段设为std::atomic等。
  • 目前只有两个nix子命令可跨多线程工作,如nix flake shownix 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 输出属性评估也应自动利用并行性。
阅读 12
0 条评论