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
以与标准库的其余部分保持一致。 在生态系统中,几个关键支持库,例如 uring
、multicore-opam
和 domainslib
已经进行了更新以支持 5.0.0+trunk。 基于效果的直接风格并行 I/O Eio 为 OCaml 带来了重大改进,现在也支持 OCaml 5.00.0+trunk。 Sandmark 基准测试套件现在提供 5.00.0+stable
和 5.00.0+trunk
OCaml 变体,用于构建主干基准测试。
OCaml 5.00 发布规划
核心开发团队目前正在确定将构成 OCaml 5.00 版本的具体内容,包括支持的功能。 将成为 OCaml 5.00 部分,但当前尚不支持的任何内容都必须在此列表中,以便我们对其实现进行规划。 如果您发现列表中没有但应该包含的内容,请与我们联系或回复。 如以往一样,此列表会随着核心开发团队的规划和实现而不断变化。
运行时
- 标记堆栈溢出
- 目前允许标记堆栈增长到无界大小。 mc#466 中有一个多核标记堆栈溢出实现。 此设计很复杂,会并发地影响主要 GC 逻辑,以确定何时标记完成。 人们感觉,一个更好的设计是使用停止世界部分来处理标记堆栈溢出,但尚未尝试过。
- Statmemprof
- 使运行时内存模型安全
- 确保
caml_modify
的实现是正确的。 - 修复测试套件上线程安全分析器报告的警告。
- 确保
- 标记预取优化
- 减少虚拟内存使用量的次要堆设计
- 使运行时对异步回调安全
- 请参阅 #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-safe
、systhread-safe
、fiber-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#795 将
Minor_heap_max
和Max_domains
设为OCAMLRUNPARAM
选项Minor_heap_max
在runtime/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 针对已删除的
Stream
和Pervasives
库 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.awk
和ocamltest
可能跳过报告失败,需要解决这个问题。 -
ocaml/ocaml#10971 限制运行时保留多少内存的方法,以便可以使用 Valgrind 和 AFL
可以限制 OCaml 运行时中要保留的虚拟内存量,需要将其设置为运行时参数。
-
ocaml/ocaml#10974
domain.c
:对域唯一 ID 使用原子计数器需要删除对固定
Max_domains
设置的依赖,以便在程序执行期间动态配置。
改进
-
ocaml-multicore/ocaml-multicore#796 域的
Caml_state
不应使用 mmapCaml_state
不再位于次要堆区域的相邻位置,该区域使用 mmap 进行分配。 针对此问题的 PR 正在积极开发中。 -
ocaml/ocaml#10908 修复 Windows 上
caml_mem_map
中的潜在竞争条件runtime/platform.c
已更新以修复caml_mem_map
中的潜在竞争条件,并且已删除调试 printf 语句。 -
ocaml/ocaml#10925 将
Caml_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-multicore/ocaml-multicore#822 将
array.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#10879 将
EffectHandlers
模块重命名为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())
使用就足够了,因为不再需要Int
、Long
和Bool_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.12ocaml-multicore/ocaml-multicore#351 的
mingw-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#10887 将
Domain.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_end
和otherlibs
代码中的其他修复,以使其与主干更加一致。 -
ocaml-multicore/ocaml-multicore#828 在 extern stat 初始化时将
extern_flags
初始化为 0extern_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_bucket
、get_credit
和huge_fallback_count
get_bucket
、get_credit
和huge_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
可能是一个选择。需要进行性能测量来比较cstruct
和bytes
。 -
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 库一起使用。
杂项
-
ocaml-multicore/parallel-programming-in-multicore-ocaml#13 设置 CI
使用 GitHub Actions 进行每周 CI 构建将有助于检测任何构建错误。
-
ocaml-multicore/tezos#13 合并上游更新
一个问题跟踪器,用于合并 2022 年 1 月 24 日对
4.12.0+domains
分支的更新。 -
ocaml-multicore/tezos#24 测试套件失败
在运行测试套件时,报告了
Alcotest_engine__Core.Make(P) (M)
错误。 -
ocaml-multicore/effects-examples#26 移植到 OCaml 5.00
正在进行的工作,将所有 Effects 示例移植到 OCaml 5.00 中运行,无需专门的 effects 语法。
已完成
Eio
已添加
-
ocaml-multicore/eio#120 添加
Fibre.fork_on_accept
和Net.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.dump
和Cancel.dump
用于调试已添加
Switch.dump
和Cancel.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_readable
和await_writable
函数,并允许Lwt_eio
使用任一后端。Eio 需要在浏览器和 unikernel 上工作,因此它不能直接依赖于Unix
。 -
ocaml-multicore/eio#141
lib_eio
: 实现Stream.is_empty
已在
lib_eio/stream.ml
源代码中实现了length
和is_empty
函数。 -
ocaml-multicore/eio#159 添加
Eio.Buf_read
Eio 中添加
Buf_read
提供了一个低级 API 来查看内部缓冲区并将字节标记为已使用。此外,它现在具有一个高级 API 来读取字符、字符串和多行文本。 -
ocaml-multicore/eio#161 向
Buf_read
添加更多函数已将
peek_char
、skip
、pair
、map
、bind
、*>
和<*
函数添加到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#137 将
eunix
重命名为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#158 将
eio.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.md
、lib_ctf/unix/ctf_unix.mli
、lib_eio_linux/eio_linux.mli
和lib_eio_luv/eio_luv.mli
文件修复了dune build @doc
警告。 -
ocaml-multicore/eio#162 使用 MDX 测试多核指南
已更新 dune 文件以使用 MDX 测试
multicore.md
文档。 -
ocaml-multicore/eio#164 文档中记录了新的加载和保存函数
README.md 文件已更新,其中包含有关
Dir.save
、Dir.open_out
、Dir.open_in
和Dir.with_lines
的文档。
多核并行编程
-
ocaml-multicore/parallel-programming-in-multicore-ocaml#11 执行使用
parallel_for
原语的程序时出现未处理的异常@H-N41K(Hemendra M. Naik)针对
parallel_for
原语报告的异常已通过更新 domainslib.0.4.0 包修复。 -
ocaml-multicore/parallel-programming-in-multicore-ocaml#12 更新到 domainslib.0.4.0
已修复 domainslib.0.4.0 引入的重大更改,并已更新 README.md 以用于 OCaml 5.00。
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-project
和uring.opam
文件中进行了更新。
Domainslib
-
ocaml-multicore/domainslib#61 使用 EffectHandlers 的新名称(Effect)
已更新
lib/task.ml
代码以使用Effect
,因为上游 ocaml/ocaml#10879 已将EffectHandlers
模块重命名为Effect
。 -
ocaml-multicore/domainslib#63 使用 trunk OCaml 运行 CI
已更新 GitHub Actions CI 构建,以便使用
ocaml/ocaml
trunk 进行构建。
多核 OPAM
-
ocaml-multicore/retro-httpaf-bench#18 切换 Eio 基准测试以使用更快的轮询模式
retro-httpaf 基准测试现在使用最新的 Eio,该 Eio 添加了对轮询模式的支持,使其成为性能最快的基准测试。
-
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
分支的 CIBuild 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
正在进行
-
ocaml-bench/sandmark-nightly#26 更新夜间脚本
PR 更新了
nightly/
文件夹中的脚本,以在 Turing 和 Navajo 服务器上运行 5.00.0 变体。 -
ocaml-bench/sandmark-nightly#27 在标准化图表中包含基线变体信息
标准化图表必须包含用于比较的基线变体信息。
-
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 支持使用度量名称来指定层次结构的覆盖图表
前端现在支持覆盖图表,以便更好地比较,如下所示
-
ocurrent/current-bench#275 前端修复:显示警告和旧度量,而不是空页面
如果最新的执行仍在运行,或已失败完成,或已取消,现在将显示橙色显示和以前的基准测试度量结果。
-
ocurrent/current-bench#277 使用彩色图例显示覆盖图表的最后一个值
覆盖图表的最新值现在使用彩色图例显示,如下所示
-
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: 统一资源定位符