OCaml 多核 - 2022 年 1 月

欢迎来到 2022 年 1 月的 多核 OCaml 月度更新! 此更新以及 之前的更新 由 @avsm、@ctk21、@kayceesrk 和 @shakthimaan 编译。

@xavierleroy 点击了 上游 Multicore OCaml PR#10831 上的“合并”按钮,将其合并到上游 OCaml 中,这同时为新年开启了一个美好的开端,也为我们即将进行的 OCaml 5.00.0 稳定版发布的艰苦工作做好了准备! 自合并以来,我们一直通过主 ocaml 存储库中的错误修复、代码改进和工具支持来继续进行发布工作。 值得注意的是,已经提出了 ARM64 后端支持 的新草案 PR。

OCaml 5.0 主干还 删除了几个已弃用的模块,并将 EffectHandlers 重命名为 Effect 以与标准库的其余部分保持一致。 在生态系统中,几个关键支持库,例如 uringmulticore-opamdomainslib 已经进行了更新以支持 5.0.0+trunk。 基于效果的直接风格并行 I/O Eio 为 OCaml 带来了重大改进,现在也支持 OCaml 5.00.0+trunk。 Sandmark 基准测试套件现在提供 5.00.0+stable5.00.0+trunk OCaml 变体,用于构建主干基准测试。

OCaml 5.00 发布规划

核心开发团队目前正在确定将构成 OCaml 5.00 版本的具体内容,包括支持的功能。 将成为 OCaml 5.00 部分,但当前尚不支持的任何内容都必须在此列表中,以便我们对其实现进行规划。 如果您发现列表中没有但应该包含的内容,请与我们联系或回复。 如以往一样,此列表会随着核心开发团队的规划和实现而不断变化。

运行时

  • 标记堆栈溢出
    • 目前允许标记堆栈增长到无界大小。 mc#466 中有一个多核标记堆栈溢出实现。 此设计很复杂,会并发地影响主要 GC 逻辑,以确定何时标记完成。 人们感觉,一个更好的设计是使用停止世界部分来处理标记堆栈溢出,但尚未尝试过。
  • Statmemprof
  • 使运行时内存模型安全
    • 确保 caml_modify 的实现是正确的。
    • 修复测试套件上线程安全分析器报告的警告。
  • 标记预取优化
  • 减少虚拟内存使用量的次要堆设计
    • #10955 提出在程序启动时确定次要区域的大小,而不是现在固定的 256GB 预留。 修复了 Valgrind 和 AFL(使用默认的有限虚拟内存)。
    • 探索替代次要堆组织(DLAB、BiBoP)的设计
      1. 由于代码变更,现在风险太大
      2. 好处不明确。 请参阅 mc#508 中的实验。
  • 使运行时对异步回调安全
    • 请参阅 #10915 中的异步回调处理元问题
    • 可能需要更改停止世界机制和主要 GC 逻辑
    • 目前没有提出的计划或实现。 实现将需要大量测试和基准测试
    • 在 statmemprof 工作的一部分完成时可能很有意义,因为两者都可能遇到类似的实现问题
  • Eventring 运行时跟踪事件日志替换
    • 监控和优化多核程序中的 GC 很困难,当前的多核事件日志是一个临时解决方案
    • #10964 中的 PR 将 eventring 支持添加到主干中
  • 运行时是否能够为 32 位平台运行仅字节码?
    • 顺序或多个域?
  • 删除对 Caml_state 使用 mmap 的情况(请参阅 mc#796

Stdlib

  • 完成 Stdlib 审核 (#10960)
  • 4.14 中的域、互斥锁、信号量、条件
    • 支持基于 systhread 的域和相关模块的实现。 互斥锁、信号量和条件按原样工作。
    • 4.14 已经基本冻结了; 所以可以通过单独的兼容性库来模拟域。
  • API 文档
    • 为效果处理程序和域编写 API 文档
  • 手册章节
    • 为效果处理程序、域和内存模型添加新的手册章节
  • OCamldoc 线程安全注释
    • 为线程安全引入 OCamldoc 标签 (#10983)。
    • domain-safesysthread-safefiber-safe 之间的偏序。 not-concurrency-safe 作为那些未经线程安全审核的 API 函数、模块的默认占位符。
  • 原子数组
  • 原子可变记录字段
  • 并发安全的惰性
    • 对域、systhread 和 fiber 安全的惰性

后端/中间端

  • Flambda 支持
  • Arm64 支持
    • 当前正在主干中进行开发。
    • 目标是 Mac M1 和 AWS Graviton
  • 32 位支持(
    • 仅顺序的本地后端在 x86 上可以实现。 32 位 ARM 可能支持多个域。 是时候将 x86-32 降级到仅字节码了吗?
    • Wasm 目前仅支持 32 位。
  • RISC-V、Power 等。
  • OpenBSD、FreeBSD 已合并。
    • #10875 添加了 OpenBSD 支持
  • Windows 上的 MSVC 支持。
  • 帧指针支持
    • 对基于 perf 的性能基准测试很有用。
    • x86 和/或 arm64?

工具

  • 恢复 ocamldebug

2021 年 1 月更新

与往常一样,首先列出 Multicore OCaml 更新,然后是生态系统工具更新。 最后,列出 Sandmark 基准测试任务以供参考。

多核 OCaml

正在进行

讨论

  • ocaml-multicore/ocaml-multicore#750 讨论多核下的 Lazy 设计

    关于多核 OCaml 下 Lazy 的设计讨论,涉及顺序 Lazy、并发问题、重复计算和内存安全。

  • ocaml-multicore/ocaml-multicore#795Minor_heap_maxMax_domains 设为 OCAMLRUNPARAM 选项

    Minor_heap_maxruntime/caml/config.h 中定义为 2GB,Max_domains 定义为 128,在使用 AFL 和 Valgrind 等工具运行 Multicore OCaml 时,存在 OOM 问题。 OCAMLRUNPARAM 选项可用于将这些参数作为参数传递。 已在 ocaml/ocaml#10971 中启动了上游讨论。

  • ocaml-multicore/ocaml-multicore#806 统一 GC 中断和信号触发机制

    需要重新设计信号和 GC 中断之间的交互,因为它们是两个独立的机制。 在主干中,异步操作的进展与多核实现并行。

  • ocaml/ocaml#10861 OCaml Multicore PR 中的未解决评论

    一个跟踪问题,用于记录和记录 Multicore PR 中针对 5.00 里程碑的未解决评论。

  • ocaml/ocaml#10915 关于多核中异步操作处理的元问题

    关于统一 GC 中断和信号触发机制以及来自 Multicore OCaml PR#10831 的评论的讨论。

  • ocaml/ocaml#10930 针对已删除的 StreamPervasives 库 PR#10896 的下游补丁更改

    对用于运行 5.00.0+trunk 的并行基准测试的 Sandmark 依赖项的推荐补丁更改的审查。

  • ocaml/ocaml#10960 审核 stdlib 以查找可变状态

    OCaml 5.00 stdlib 实现应该同时具有内存安全性和线程安全,为此创建了此问题跟踪器来审核 stdlib 的可变状态。

上游

  • ocaml/ocaml#10876 使 Format 缓冲区对多核更有效

    需要使 Format 缓冲区实现更有效。 特别是,当生成第二个域时,Format 会切换到 stdout/stderr 的缓冲实现,其中写入仅在刷新时发生。

  • ocaml/ocaml#10953 ocamltest/summarize.awk 未在测试套件运行时正确报告中止失败

    如果日志格式不正确,summarize.awkocamltest 可能跳过报告失败,需要解决这个问题。

  • ocaml/ocaml#10971 限制运行时保留多少内存的方法,以便可以使用 Valgrind 和 AFL

    可以限制 OCaml 运行时中要保留的虚拟内存量,需要将其设置为运行时参数。

  • ocaml/ocaml#10974 domain.c:对域唯一 ID 使用原子计数器

    需要删除对固定 Max_domains 设置的依赖,以便在程序执行期间动态配置。

改进

  • ocaml-multicore/ocaml-multicore#796 域的 Caml_state 不应使用 mmap

    Caml_state 不再位于次要堆区域的相邻位置,该区域使用 mmap 进行分配。 针对此问题的 PR 正在积极开发中。

  • ocaml/ocaml#10908 修复 Windows 上 caml_mem_map 中的潜在竞争条件

    runtime/platform.c 已更新以修复 caml_mem_map 中的潜在竞争条件,并且已删除调试 printf 语句。

  • ocaml/ocaml#10925Caml_state 的符号重命名为 caml_state

    Caml_state 是 Mac OS 中的宏,因此将其重命名为 caml_state 以避免命名冲突。

  • ocaml/ocaml#10950 使用 malloc 而不是 mmap 为域状态分配内存

    此 PR 使用 malloc 替换了不必要的 mmap 使用,从而简化了 Caml_state 管理。

  • ocaml/ocaml#10965 所有运行时钩子的线程安全性

    此 PR 实施了钩子的线程安全性,并在多核中恢复了 GC 定时钩子。

  • ocaml/ocaml#10966 多核审查的简化/清理/澄清

    信号/操作的 API 已简化,caml_modify 已文档化,并已删除死代码。

  • ocaml/ocaml#10969 切换到 strerror_t 用于可重入的错误字符串转换

    此 PR 使用 strerror_t 进行字符串转换,因为运行时中的 strerror 在存在多个线程的情况下不可重入。

ARM64

  • ocaml/ocaml#10943 在 Cmm 和 Mach IR 中引入原子加载

    需要增强 Patomic_load 原语以简化对其他体系结构的支持。这是 ARM64 支持所必需的。

  • ocaml/ocaml#10972 ARM64 多核支持

    一个实现汇编器、proc 和 emit 更改以使 ARM64 工作的草案 PR 已被提出。这些更改已在 MacOS/M1 和 Linux/Graviton2 上进行了测试。

指标

  • ocaml/ocaml#10961 处理 GC 统计信息的孤立

    domain_state 的分配使用多核实现中的 malloc 会阻止在域终止时释放 Caml_state,这个问题需要解决。

  • ocaml/ocaml#10964 基于环形缓冲区的运行时跟踪 (eventring)

    Eventring 是一个运行时跟踪系统,专为连续监控 OCaml 应用程序而设计。以下说明展示了如何使用 eventring 使用 Chrome 的跟踪查看器记录运行时数据。

OCaml-PR-10964-graph |690x149

已完成

上游

  • ocaml-multicore/ocaml-multicore#822array.c 还原为主干。引入字大小 memmove

    仅当运行多个域时才使用字大小的 memmove,并且 array.c 已更新为更接近主干实现。

  • ocaml-multicore/ocaml-multicore/826 解决 ocaml/ocaml#10831 不必要的差异审查意见

    此 PR 基于对 ocaml/ocaml#10831 的审查,更新了多核 OCaml 和主干之间的差异。

  • ocaml-multicore/ocaml-multicore#827 重新引入来自主干的 sigpending 更改

    otherlibs/unix/signals.c 文件已更新,以从主干引入 sigpending 代码。

  • ocaml-multicore/ocaml-multicore#833 解决 ocaml/ocaml#10831 的审查意见

    runtime/ 代码已更新,以解决来自 ocaml/ocaml#10831 的代码审查意见和建议。

  • ocaml-multicore/ocaml-multicore#834 针对 ocaml-10831 的审查意见进行更多更改

    此 PR 中已包含来自 ocaml/ocaml#10831 的附加反馈。

  • ocaml/ocaml#10831 多核 OCaml

    将多核 OCaml 合并到 ocaml/ocaml 的 PR 已合并!它支持通过域进行共享内存并行,并通过效果处理程序进行并发。

  • ocaml/ocaml#10872 更改域线程名称设置以更具可移植性,并且尽力而为

    caml_thread_setname 已更改为尽力而为,并且已添加用于处理 BSD 函数排列的情况。

  • ocaml/ocaml#10879EffectHandlers 模块重命名为 Effect

    EffectHandlers 模块已重命名为 Effect,以与 stdlib 的其余部分保持一致。

  • ocaml/ocaml#10975 添加来自 #10136 的丢失更改,这些更改可能在变基期间丢失

    runtime/io.c 代码已使用 PR#10831 审查中的更改更新。

改进

  • ocaml-multicore/ocaml-multicore#830 删除 Int/Long/Bool_field

    现在仅 Long_val(Field()) 使用就足够了,因为不再需要 IntLongBool_field 宏。

  • ocaml-multicore/ocaml-multicore#831 还原对 ocaml_floatarray_blit 的更改

    runtime/array.c 中的 ocaml_floatarray_blit 更改将保留,以免破坏 32 位编译。

  • ocaml-multicore/ocaml-multicore#836 将仅字节码启动代码移动到 startup_byt.c

    startup_byt.c 文件已更新,以包含来自 startup_aux.c 的仅字节码启动代码。

  • ocaml-multicore/ocaml-multicore#837 mingw-w64 向后移植到 4.12

    ocaml-multicore/ocaml-multicore#351mingw-w64 向后移植,其中更改已变基到 4.12+domains+effects。

  • ocaml/ocaml#10742 使用 LXM 伪随机数生成器重新实现 Random

    使用 L64X128 变体(LXM 家族)的全新 PRNG 实现已被实现,以测试已合并的多核 OCaml PR。64 位的性能提升以及 32 位平台上不太好的下降在下面显示(时间以秒为单位)

     x86 64 bits
    
     4.13  LXM
    
     0.30  0.21  bit
     0.28  0.20  bits
     0.42  0.31  int 0xFFEE
     0.71  0.40  int32 0xFFEEDD
     0.97  0.32  int64 0xFFEEDDCCAA
     0.72  0.31  float 1.0
    11.35  0.02  full_init 3 (/100)
    
     ARMv7 32 bits
    
     4.13  LXM
    
     1.75  4.84  bit
     1.53  2.78  bits
     4.63  6.16  int 0xFFEE
     5.12  6.89  int32 0xFFEEDD
    30.92 20.51  int64 0xFFEEDDCCAA
     3.36  8.30  float 1.0
    47.40  0.13  full_init 3 (/100)
    
  • ocaml/ocaml#10880 使用位向量记录挂起的信号

    此 PR 使用一组位而不是一组 NSIG 原子 0 或 1 整数来存储挂起信号的存在。当前主干的测试套件性能如下

  real	14m8.349s
  user	20m52.485s
  sys	0m46.666s

  Event count (approx.): 5024892760014
  Overhead  Command          Shared Object                       Symbol
    16.43%  Domain0          ocamlrun                            [.] caml_check_for_pending_signals
    14.16%  Domain0          ocamlrun                            [.] caml_interprete
     6.67%  Domain1          ocamlrun                            [.] caml_check_for_pending_signals
...

使用此 PR 的测试套件输出如下

  real	8m32.072s
  user	10m16.386s
  sys	0m45.736s

  Event count (approx.): 2483613262503
  Overhead  Command          Shared Object                       Symbol
    22.67%  Domain0          ocamlrun                            [.] caml_interprete
     4.21%  Domain1          ocamlrun                            [.] caml_interprete
     3.20%  Domain3          ocamlrun                            [.] caml_interprete
  • ocaml/ocaml#10887Domain.DLS 接口泛化,以将 PRNG 状态拆分为子域

    此 PR 为当生成一个域拆分 PRNG 状态的情况实现了“适当的”PRNG+域语义。

  • ocaml/ocaml#10890 从代码和手册中删除未使用的 OCAMLRUNPARAM 参数

    在对 OCAMLRUNPARAM 选项进行审核后,未使用的参数现在已从代码和手册中删除。

    backtrace_enabled: in use
    cleanup_on_exit: in use
    eventlog_enabled: in use
    init_fiber_wsz: in use
    init_heap_wsz: UNUSED
    init_heap_chunk_sz: UNUSED
    init_max_stack_wsz: in use
    init_custom_major_ratio: in use
    init_custom_minor_ratio: in use
    init_custom_minor_max_bsz: in use
    init_percent_free: in use
    init_max_percent_free: UNUSED
    parser_trace: in use
    init_minor_heap_wsz: in use
    trace_level: in use
    verb_gc: in use
    verify_heap: in use
    caml_runtime_warnings: in use
    
  • ocaml/ocaml#10935 使用异常重新实现 Thread.exit

    此 PR 通过简单地引发专门的 Thread.Exit 异常来重新实现 Thread.exit,以实现更好的资源管理,而不是停止当前线程。

修复

  • ocaml-multicore/ocaml-multicore#823 小修复

    runtime/middle_endotherlibs 代码中的其他修复,以使其与主干更加一致。

  • ocaml-multicore/ocaml-multicore#828 在 extern stat 初始化时将 extern_flags 初始化为 0

    extern_flags 需要初始化为零。否则,它在 reachable_words 中的后续使用将返回垃圾值,导致内存损坏。

  • ocaml-multicore/ocaml-multicore#829 修复 FreeBSD/OpenBSD/NetBSD 上的 pthread 名称设置

    针对 pthread 命名进行的可移植性更改,以便为 FreeBSD、OpenBSD 和 NetBSD 构建。

  • ocaml/ocaml#10853 修复 Obj.reachable_words 中的崩溃

    此 PR 中已修复 Obj.reachable_words 中的段错误。编组操作可能会将 extern_flags 遗留为已设置 NO_SHARING 位,因此现在在调用 extern_init_position_table 之前对其进行了初始化。

  • ocaml/ocaml#10873 修复 Filename.check_suffix;删除重复的 , 修复 OCAMLRUNPARAM

    此 PR 包括针对 OCAMLRUNPARAM 中的空 ,caml_parse_ocamlrunparam 重复修复,以及来自多核 OCaml PR#10831 审查的 Filename.check_suffix 更新。

  • ocaml/ocaml#10881 修复 Jenkins 上的 mingw-w64 构建

    需要 winpthread-1.dll 文件,因为它为构建设置了所需的 PATH。

  • ocaml-multicore/ocaml-multicore#832 修复可达的单词,第二部分

    Obj.reachable_words 已更新,以不再导致段错误。此外,这些更改已与 4.14 分支同步。

测试

  • ocaml/ocaml#10888 重新启用 afl-instrumentation 测试,在没有虚拟内存限制的情况下运行

    作为子进程运行的 afl-fuzz 测试程序需要超过 50MB 的虚拟内存才能进行多核操作。因此,提供了一个修复程序以删除内存限制,并且已启用 OCaml 5.00.0+trunk 的 afl-instrumentation 测试。

  • ocaml/ocaml#10918 添加显式的 afl-fuzz 测试

    已添加一个没有超时且基于手册中的 readline 示例的 afl-fuzz 测试。

清理

  • ocaml-multicore/ocaml-multicore#835 删除 get_bucketget_credithuge_fallback_count

    get_bucketget_credithuge_fallback_count 函数已从 stdlib 中删除。

  • ocaml/ocaml#10863 摆脱 <caml/compatibility.h>

    作为已合并的多核 OCaml PR#10831 的后续工作,caml/compatibility.h 头文件已被删除。

  • ocaml/ocaml#10973 删除 domain_state 中未使用的 gc_regs_slot

    gc_regs_slot 未使用,并且在域状态结构中不需要。它已从 otherlibs/systhreads/st_stubs.c 文件中删除。

杂项

  • ocaml-multicore/ocaml-multicore#793 基于环形缓冲区的运行时跟踪 (eventring)

    Eventring 是一个低开销的运行时跟踪系统,用于持续监控 OCaml 应用程序。此问题已关闭以在 ocaml/ocaml 上创建 PR。

  • ocaml-multicore/ocaml-multicore#810 使用多核和自定义块获得段错误/未定义行为

    段错误发生在 C 代码中而不是 OCaml 中,因此此问题已关闭。

  • ocaml-multicore/ocaml-multicore#816 过滤器树用于将提交者的电子邮件地址规范化

    多核 OCaml 中提交者之间的名称和电子邮件地址不一致的问题已使用过滤器树修复并合并。

生态系统

正在进行

Eio

  • ocaml-multicore/eio#124 决定如何表示路径名

    Eio 中的路径是字符串,但是,我们需要考虑如何为 Windows 路径提供支持。

  • ocaml-multicore/eio#125 在 Windows 上进行测试

    Eio 需要在 Windows 上得到支持,并且必须为此环境设置 CI。

  • ocaml-multicore/eio#126 用于生成子进程的 API

    Eio 中需要一种类似于 Lwt_process 的机制来创建和管理子进程。这必须使用多个域,允许传递管道,检查或报告进程的退出状态等。

  • ocaml-multicore/eio#138 将 Eio 的 CTF 跟踪与 OCaml 的跟踪集成

    提议的 eventring 替换基于 OCaml CTF 的 eventlog 系统,可以允许用户添加需要存储的自定义事件。

  • ocaml-multicore/eio#140 决定使用 cstruct 还是 bytes

    与内核的 IO 操作需要 GC 不移动缓冲区的地址,这可以通过使用 Cstruct.t 实现。如果 OCaml 5.00 保证普通字符串不会被移动,那么使用 bytes 可能是一个选择。需要进行性能测量来比较 cstructbytes

  • ocaml-multicore/eio#146 lib_eio: 添加 take_all 函数

    take_all 函数已添加到 lib_eio/stream.ml 中。

  • ocaml-multicore/eio#155 添加 Eio_unix.FD

    已将 FD 模块添加到 lib_eio/unix/eio_unix.ml 中,用于与 Luv.0.5.11 异步 I/O 库一起使用。

杂项

已完成

Eio

已添加
  • ocaml-multicore/eio#120 添加 Fibre.fork_on_acceptNet.accept

    此 PR 更新了 fork_on_accept 以在新的 switch 中使用 accept 函数,并将成功结果传递给新 fibre 中的处理函数,该 PR 已合并。

  • ocaml-multicore/eio#130 添加 Luv 轮询函数

    已将 Eio 中的 Luv 轮询函数添加到 lib_eio_luv/eio_luv.ml 中,用于 Lwt 集成。

  • ocaml-multicore/eio#133 添加 Switch.dumpCancel.dump 用于调试

    已添加 Switch.dumpCancel.dump 函数,用于调试目的。下面显示了一个示例输出。

    Switch 6 (1 extra fibres):
      on [4]
        cancelling(Failure("Background switch turned off")) []
          cancelling(Failure("Background switch turned off")) []
          on (protected) [7]
    
  • ocaml-multicore/eio#135 添加 ~close_unix 标志到 FD.of_unix

    用户现在可以使用 close_unix 标志处理 FD 的关闭,以更好地与 API 集成。

  • ocaml-multicore/eio#139 添加 eio.unix 模块以进行 Unix 集成

    新的 eio.unix 模块提供 await_readableawait_writable 函数,并允许 Lwt_eio 使用任一后端。Eio 需要在浏览器和 unikernel 上工作,因此它不能直接依赖于 Unix

  • ocaml-multicore/eio#141 lib_eio: 实现 Stream.is_empty

    已在 lib_eio/stream.ml 源代码中实现了 lengthis_empty 函数。

  • ocaml-multicore/eio#159 添加 Eio.Buf_read

    Eio 中添加 Buf_read 提供了一个低级 API 来查看内部缓冲区并将字节标记为已使用。此外,它现在具有一个高级 API 来读取字符、字符串和多行文本。

  • ocaml-multicore/eio#161Buf_read 添加更多函数

    已将 peek_charskippairmapbind*><* 函数添加到 lib_eio/buf_read.ml 中,以匹配 Angstrom API。还包括使用 crowbar 进行的额外模糊测试。

  • ocaml-multicore/eio#163 添加 Buf_read.{seq,lines}Dir.{load,save} 方便函数

    已添加 at_end_of_input 函数,并且 eof 已重命名为 end_of_input 以匹配 Angstrom API。已添加 Buf.read.{seq,lines}Dir.{load.save} 方便函数,以便于加载和保存文件,并逐行读取文件。

构建
  • ocaml-multicore/eio#128 依赖于 base-domains

    opam 存储库现在提供了一个 base-domains 包,它将被用于代替硬编码对 ocaml.4.12.0+domains 的显式依赖关系。

  • ocaml-multicore/eio#137eunix 重命名为 eio.utils

    用于构建 Eio 后端的实用程序模块集合已从 enix 重命名为 eio.utils,因为不需要单独的 OPAM 包。

  • ocaml-multicore/eio#147 删除未使用的 bigstringaf 依赖关系

    不再需要 bigstringaf 依赖关系,并且已将其删除。

  • ocaml-multicore/eio#149 删除对 ppxlib 的依赖关系

    lib_ctf/ctf.ml 文件正在使用 ppxlib,并且已将相关代码内联。因此,已删除对 ppxlib 的依赖关系,以便为 5.00.0 构建。

  • ocaml-multicore/eio#151 添加对 OCaml 5.00+trunk 的支持

    PR 更新了 eio 以便为 OCaml 5.00.0+trunk 构建,并保持与 4.12+domains 的兼容性。

  • ocaml-multicore/eio#157 从 Eio 中删除 Unix 依赖关系

    为了在 unikernel 或浏览器中使用 Eio,已从 Eio 中删除了对 Unix 的依赖关系。Eio.Unix_perm.t 替换了 Unix.file_perm,而 Eio.Net.Ipaddr.t 替换了 Unix.inet_addr

改进
  • ocaml-multicore/eio#156 [eio_linux] 允许在轮询模式下运行 uring

    已添加 polling_timeout 选项,以便在轮询模式下运行 uring。这更快,因为 Linux 可以开始处理请求,而无需等待我们提交请求。

  • ocaml-multicore/eio#158eio.ml 拆分为单独的模块

    一项代码重构,将 lib_eio/eio.ml 拆分为单独的模块。

修复
  • ocaml-multicore/eio#134 简化并改进错误报告

    现在已修复在取消操作时引发的丢失的错误。取消上下文现在由开关处理。

  • ocaml-multicore/eio#160 修复 Buf_read.take_all

    lib_eio/buf_read.ml 中的修复,以读取流中的所有内容,而不仅仅是缓冲区中存在的内容。

测试
  • ocaml-multicore/eio#153 允许使用 Stdenv.fs 读取绝对路径

    Stdenv.fs 可用于访问绝对路径。PR 中还添加了一个测试用例。

  • ocaml-multicore/eio#154 [eio_linux] 在 read_into 中避免复制

    readv 实现现在可以直接读取到用户缓冲区中,以避免使用 read_into 进行复制。

文档
  • ocaml-multicore/eio#123 在 README.md 中添加缺失的单词

    已更新 README.md 文档以提供 Switch.run 的上下文。

  • ocaml-multicore/eio#136 添加 README 中使用 Promise 的缓存示例

    README 中已包含一个并发缓存示例,演示了 Promise 的使用。

  • ocaml-multicore/eio#144 对 README 进行少量更新

    README 已更新,其中包含有关 Lwt_eio 的信息,并对 Switch 行为进行了少量更改以澄清。

  • ocaml-multicore/eio#145 添加解释新内存模型的多核指南

    已添加一个新的 doc/multicore.md 文件,它解释了内存模型,其中包括以下主题。

    1. Introduction
    2. Problems with Multicore Programming
       a. Optimisation 1: Caching
       b. Optimisation 2: Out-of-Order Execution
       c. Optimisation 3: Compiler Optimisations
       d. Optimisation 4: Multiple COres
    3. The OCaml Memory Model.
    4. Guidelines
    5. Further reading
    
  • ocaml-multicore/eio#152 修复文档中的小错误

    已针对 doc/rationale.mdlib_ctf/unix/ctf_unix.mlilib_eio_linux/eio_linux.mlilib_eio_luv/eio_luv.mli 文件修复了 dune build @doc 警告。

  • ocaml-multicore/eio#162 使用 MDX 测试多核指南

    已更新 dune 文件以使用 MDX 测试 multicore.md 文档。

  • ocaml-multicore/eio#164 文档中记录了新的加载和保存函数

    README.md 文件已更新,其中包含有关 Dir.saveDir.open_outDir.open_inDir.with_lines 的文档。

多核并行编程

OCaml Uring

  • ocaml-multicore/ocaml-uring#43 删除 bigstringaf 依赖关系

    已删除 bigstringaf 依赖关系,我们现在使用 cstruct 提供的相同函数。

  • ocaml-multicore/ocaml-uring#44 允许在轮询模式下运行

    已更新 lib/uring/uring.ml,现在可以使用 polling_timeout 参数在轮询模式下运行。

  • ocaml-multicore/ocaml-uring#45 Cmdliner 仅在测试中需要

    cmdliner 依赖关系仅在测试中需要,并且已在 dune-projecturing.opam 文件中进行了更新。

Domainslib

多核 OPAM

  • ocaml-multicore/retro-httpaf-bench#18 切换 Eio 基准测试以使用更快的轮询模式

    retro-httpaf 基准测试现在使用最新的 Eio,该 Eio 添加了对轮询模式的支持,使其成为性能最快的基准测试。

Retro-httpaf-bench-PR-18-graph|411x264

  • ocaml-multicore/multicore-opam#61 删除 omake

    PR 删除了 omake,omake 仅在 +effects 中需要,并且还删除了 caml_modify_field,它在 trunk 中不存在。

  • ocaml-multicore/multicore-opam#62 删除 domainslib

    Domainslib.0.3.0 已从该存储库中删除,因为它已上游到 opam-repository。

  • ocaml-multicore/multicore-opam#63 base-domains 很久以前就已上游到 opam-repository

    base-domains 依赖关系已从 multicore-opam 中删除,因为它已上游到 opam 存储库。

基准测试

Sandmark

正在进行

  • ocaml-bench/sandmark#272 如果机器处于活动状态,则延迟基准测试运行

    在触发新的基准测试运行之前,需要进行负载平均值检查,以确保机器上没有执行任何活动的基准测试作业。

  • ocaml-bench/sandmark#273 仅使用 5.00+trunk 版本构建 OCaml 变体

    Sandmark 中的 OCaml 变体需要更新,以便仅包含 5.00.0+trunk 版本的构建。

  • ocaml-bench/sandmark#274 自定义变体支持

    需要允许 Sandmark 对编译器开发人员分支进行基准测试运行。配置应允许一个 URL 指向特定分支,并包含配置选项、运行时参数、变体名称以及 Sandmark 夜间运行应持续到期的日期。例如

     [ { "url" : "https://github.com/ocaml-multicore/ocaml-multicore/archive/parallel_minor_gc.tar.gz",
      "configure" : "-q",
      "runparams" : "v=0x400",
      "name": "5.00+trunk+kc+pr23423",
      "expiry": "YYYY-MM-DD"},
    ...]  
    
  • ocaml-bench/sandmark#275 从 drone CI 迁移到 GitHub Actions

    当前的 .drone.yml CI 需要替换为使用 GitHub Actions 的构建。

已完成

  • ocaml-bench/sandmark#268 将 README CI 构建状态更新为 main 分支

    Sandmark 中 main 分支的 CI Build Status 已更新为指向 main 分支。

  • ocaml-bench/sandmark#270 更新到 5.00.0+domains

    运行 5.00.0+domains 变体的依赖项和基准测试已更新,以便在 Sandmark master 分支中构建。

  • ocaml-bench/sandmark#271 将 ocaml-variants 信息参数化为 Docker 环境变量

    Sandmark Makefile 中的以下变量已参数化为环境变量,以支持 Custom Variant Support 功能请求

    SANDMARK_DUNE_VERSION
    SANDMARK_URL
    SANDMARK_REMOVE_PACKAGES
    SANDMARK_OVERRIDE_PACKAGES
    
  • ocaml-bench/sandmark#276 重新添加 5.00.0+trunk,并使用 CI 失败:忽略选项

    .drone.yml CI 已更新为忽略 5.00.0+trunk 的构建失败,以便只要 5.00.0+stable Sandmark 构建正常,我们就可以继续合并更改。

  • ocaml-bench/sandmark#277 从 master 分支同步和更新 README

    Sandmark master 分支中的 README 更改已与 main 分支同步,因为我们很快将切换到使用 main 分支作为 Sandmark 中的默认分支。

Sandmark-nightly

正在进行

Sandmark-nightly-issue-27-graph|690x278

  • ocaml-bench/sandmark-nightly#32 支持来自私有 GitHub 仓库的自定义变体

    Sandmark 夜间运行应允许从 GitHub 仓库构建自定义开发人员分支变体。

  • ocaml-bench/sandmark-nightly#33 图表永久链接

    仪表板 UI 上所选选项和图表中的永久链接将有助于在用户之间共享。

  • ocaml-bench/sandmark-nightly#34 并行基准测试应在 ocaml/ocaml#trunk 上运行

    并行基准测试运行也应在 ocaml/ocaml#trunk 上运行,因为 Multicore OCaml PR 现在已合并。

  • ocaml-bench/sandmark-nightly#36 在 Sandmark nightly 中添加自定义运行

    需要在 Sandmark nightly 中添加一个使用配置选项 --enable-mmap-stack--disable-mmap-stack 的自定义变体运行。

  • ocaml-bench/sandmark-nightly#37 顺序结果比较已损坏

    在 UI 中选择顺序结果比较时,会显示 TypeError,这需要修复。

  • ocaml-bench/sandmark-nightly#38 标准化图表的基线缺少条目

    所有变体及其提交都应显示在标准化图表的下拉菜单中。

  • ocaml-bench/sandmark-nightly#40 着陆页中的信息已过时

    Sandmark nightly 着陆页中变体列表的信息需要与最新结果同步。

已完成

  • ocaml-bench/sandmark-nightly#24 使用 ocurrent-deployer 中的 git clone

    Dockerfile 已更新为使用 ocurrent-deployer 中的 git clone,而不是 ocaml-bench/sandmark-nightly

  • ocaml-bench/sandmark-nightly#28 将并行基准测试中的默认变体数量设为 1

    并行基准测试的默认变体数量已从两个更改为一个。

  • ocaml-bench/sandmark-nightly#30 在 Sandmark Nightly 中添加一个着陆页

    已为 Sandmark Nightly 创建了一个 index.py 着陆页,其中包含有关基准测试执行方式以及机器详细信息的信息。

  • ocaml-bench/sandmark-nightly#31 为已测基准测试添加存档消息

    一条消息用于通知最终用户,已测暂停时间基准测试没有针对最新的 5.00.0 OCaml 变体进行更新。

  • ocaml-bench/sandmark-nightly#35 更新图标和标题

    标题和图标默认使用 Streamlit 徽标,现在已更新为 Sandmark Nightly

  • ocaml-bench/sandmark-nightly#39 并行结果在 sandmark.ocamllabs.io 上不可见

    UI 中的修补程序用于正确显示映射到单个提交的多个变体,并在 UI 中正确显示并行基准测试。

current-bench

正在进行

  • ocurrent/current-bench#282 用于堆栈部署的 Docker compose

    已添加一个 docker-compose.yaml 文件来部署后端管道和前端堆栈。

  • ocurrent/current-bench#292 为 API 请求返回更好的 HTTP 错误代码

    PR 添加了异常,以便为客户端 API 请求返回正确的 HTTP 错误代码。

  • ocurrent/current-bench#293 通过从链接文本中删除日志 ID 来使日志链接更显眼

    执行日志中的日志 UUID 现在已替换为链接,以提高清晰度。

已完成

修复
  • ocurrent/current-bench#272 计算平均值时忽略 NaN

    计算平均值时不应包括 NaN 条目,这已在 LineGraph.res 中更新。

  • ocurrent/current-bench#276 生产修复:验证 graphql URL 的环境

    scripts/validate-env.sh 脚本已更新为验证路径 /_hasura/v1/graphql

  • ocurrent/current-bench#278 生产修复

    将端口 8082 替换为端口 80,用于在 Docker 中运行的前端 Nginx。

  • ocurrent/current-bench#284 处理多个基准测试数据时的一些修复

    处理多个基准测试数据时,现在支持命名基准测试列表。基准测试菜单现在仅对未命名基准测试隐藏。

  • ocurrent/current-bench#289 修复缺少拉取请求号的 URL

    发出添加工作程序或 Docker 映像的重定向时,PR 编号会丢失,这已修复。

前端
  • ocurrent/current-bench#268 修复前端:将工作程序和 Docker 映像添加到 URL

    工作程序和 Docker 映像以前未反映在 URL 中,现在已包含在内。

  • ocurrent/current-bench#273 支持使用度量名称来指定层次结构的覆盖图表

    前端现在支持覆盖图表,以便更好地比较,如下所示

Current-bench-PR-273-graph|690x232

  • ocurrent/current-bench#275 前端修复:显示警告和旧度量,而不是空页面

    如果最新的执行仍在运行,或已失败完成,或已取消,现在将显示橙色显示和以前的基准测试度量结果。

  • ocurrent/current-bench#277 使用彩色图例显示覆盖图表的最后一个值

    覆盖图表的最新值现在使用彩色图例显示,如下所示

Current-bench-PR-277-graph|690x150

  • ocurrent/current-bench#288 Nginx 前端:修复包含斜杠的 URL

    在生产部署中进行修复,其中 / 会导致 404 未找到错误。

监控
  • ocurrent/current-bench#270 基本的 Prometheus 和 Alertmanager 配置

    已创建用于与 current-bench 部署一起使用的 Prometheus 集成设置和配置。

  • ocurrent/current-bench#271 当主机磁盘空间不足时添加 Prometheus 警报

    已添加一个警报,当 current-bench 主机机器的磁盘容量达到 90% 时触发。

  • ocurrent/current-bench#274 修复 alertmanager 警报 URL

    alertmanager URL 现在已更新为指向 autumn.ocamllabs.io。

  • ocurrent/current-bench#283 从管道服务器抓取度量

    Prometheus 配置已更新,以获取 OCaml GC 度量、GitHub webhook 和缓存统计信息。

杂项
  • ocurrent/current-bench#281 文档如何添加新工作程序

    HACKING.md 已更新,其中包含有关向集群添加新工作程序的文档。

  • ocurrent/current-bench#287 用于捕获基准测试结果的 HTTP API 终结点

    可以使用新的 HTTP API 终结点将基准测试结果添加到数据库,而无需实际使用 current-bench 前端。例如

    curl -X POST -H 'Authorization: Bearer <token>' <scheme>://<host>/benchmarks/metrics --data-raw '
    {
      "repo_owner": "ocurrent",
      "repo_name": "current-bench",
      "commit": "c66a02ea54430d99b3fefbeba4941921501796ef",
      "pull_number": 286,
      "run_at": "2022-01-28 12:42:02+05:30",
      "duration": "12.45",
      "benchmarks": [
        {
          "name": "benchmark-1",
          "results": [
            {
              "name": "test-1",
              "metrics": [
                {
                  "name": "time", "value": 18, "units": "sec"
                }
              ]
            }
          ]
        },
        {
          "name": "benchmark-2",
          "results": [
            {
              "name": "test-1",
              "metrics": [
                {
                  "name": "space", "value": 18, "units": "mb"
                }
              ]
            }
          ]
        }
      ]
    }
    '
    

我们要感谢社区中所有 OCaml 用户、开发人员和贡献者对项目的持续支持。保持安全!

缩略语

  • AFL: American Fuzzy Lop
  • API: 应用程序编程接口
  • ARM: 高级精简指令集机器
  • AWK: Aho Weinberger Kernighan
  • BSD: 伯克利软件分发
  • CI: 持续集成
  • CTF: 通用跟踪格式
  • DLS: 域本地存储
  • FD: 文件描述符
  • GB: 千兆字节
  • GC: 垃圾收集器
  • HTTP: 超文本传输协议
  • IO: 输入/输出
  • IR: 中间表示
  • MD: Markdown
  • OOM: 内存不足
  • OPAM: OCaml 包管理器
  • OS: 操作系统
  • PR: 拉取请求
  • PRNG 伪随机数生成器
  • UI: 用户界面
  • URL: 统一资源定位符