OCaml 多核 - 2022年2月
欢迎阅读 2022 年 2 月的 多核 OCaml 月度报告!与 之前的更新 一样,这些报告由我、@ctk21、@kayceesrk 和 @shakthimaan 共同整理。
OCaml 5.0.0 稳定版本的发布工作正在全力推进,大部分多核 OCaml 的工作现在都直接在主 ocaml/ocaml 仓库中进行。由于 OCaml 5.0+trunk 中发生了一些 弃用 ,因此在短期内获取一个可用的开发环境可能会有点棘手。您可能会发现以下资源很有帮助
- 有一个 多核单体仓库 ,它是一个“快速克隆和 Dune 构建”的仓库,包含许多生态系统库。(感谢 @patricoferris)
- 有一个 alpha-opam-repository ,其中包含正在开发的包。如果您维护的包在其中,现在是时候开始将其发布到主线 opam-repository 了。请记住,虽然我们可以提出更改,但只有相关项目的社区维护者才能进行实际发布,因此**我们非常感谢您帮助发布您的项目的 OCaml 5.0 兼容版本**。(感谢 @kit-ty-kate)
对于主线开发,编译器开发通讯 概述了编译器中发生的情况。从多核的角度来看
- 已合并了 ARM64 PR ,因此您闪亮的 Mac M1 现在可以正常工作了
- 我们继续处理即将发布的 5.0.0+trunk 版本的多核合并后的任务。关于 OCaml 内存模型、运行时系统和 STW 同步的文档工作也已开始。
- 正在积极开发 eio 项目 ,该项目现在包括使用 Eio 网络接口的 UDP 支持。关于 eio 的几个方面已经进行了 深入的讨论 ,所有这些都影响着其设计的下一轮迭代(感谢大家!)。对于那些不希望参与公开讨论的人,可以随时与我或 @kayceesrk 联系进行私下讨论,特别是如果您拥有大型 OCaml 代码库以及对并发性的看法。我们将在未来几个月内尽力总结所有这些讨论。
Sandmark-nightly
和Sandmark
具有自定义变体支持功能,可以构建 trunk、开发分支或特定提交以评估任何性能回归。具有 UI 增强的后端工具继续推动current-bench
项目向前发展。
与往常一样,首先列出多核 OCaml 更新,然后是生态系统工具更新。最后,提及 sandmark、sandmark-nightly 和 current-bench 项目任务以供参考。
多核 OCaml
开放
讨论
-
ocaml-multicore/ocaml-multicore#750 讨论多核下 Lazy 的设计
关于多核 OCaml 下 Lazy 的持续设计讨论,涉及顺序 Lazy、并发问题、重复计算和内存安全。
-
ocaml/ocaml#10960 审计
stdlib
中的可变状态一个问题跟踪器,用于审计
stdlib
中的可变状态,因为 OCaml 5.00stdlib
的实现应该既内存安全又线程安全。 -
ocaml/ocaml#11013 OCaml 5.0 发布目标的元问题
一个问题跟踪器,其中包含 OCaml 5.0 分支的清单。
-
ocaml/ocaml#11073 代码理解:为什么 STW 部分不会一直保持
all_domains_lock
?关于 STW 部分中的互斥机制的讨论,其中使用条件变量
all_domains_cond
检查新域上的竞争条件。
构建
-
ocaml/ocaml#10940 configure:5.00.0 需要 C11 原子支持
_Atomic
关键字是在 GCC 4.9 中引入的,因此 RHEL 7 及其衍生版本无法构建 OCaml 5.0.0。RHEL 7 的生命周期结束时间为 2024 年。此问题跟踪添加对 C11_Atomic
支持所需的更改。 -
ocaml/ocaml#10989 直接从 Git 下载 GNU parallel
tools/ci/appveyor/appveyor_build.sh
已更新为使用 Git 下载 GNU parallel。 -
ocaml/ocaml#10991 使用
zstd
上传和下载 CI 工件使用
zstd
压缩提高了 CI 工件的上传和下载时间。 -
ocaml/ocaml#11007 发运和安装 META 文件
一个 PR,用于维护编译器库(
stdlib
、compiler-libs
、threads
、unix
、str
和dynlink
)的最新 META 文件,并将其与编译器一起安装。
错误
-
ocaml/ocaml#10773
[4.14] Type [> Cycle ]
与type [> Cycle ]
不兼容使用 4.14 分支编译
capnp-rpc.1.2.1
时报告了Type [> ``Cycle ]
不兼容错误。 -
ocaml/ocaml#10868 修复初始化帧哈希表时的越界错误
一个针对
runtime/frame_descriptors.c
的 PR,修复了初始化帧哈希表时的越界错误。 -
ocaml/ocaml#11040
ThreadSanitizer
问题一个问题跟踪器,其中包含
tests/parallel
执行的ThreadSanitizer
运行列表,用于排查竞争条件。 -
ocaml/ocaml#11061
dumpobj
工具崩溃已报告
tools/dumpobj
在字节码程序上出现段错误。
增强
-
ocaml/ocaml#10925 将
Caml_state
的符号重命名为caml_state
Caml_state
宏将重命名为caml_state
以避免名称冲突,但此更改不会向后移植到 4.14。 -
ocaml/ocaml#10967 添加
temp_dir
函数以创建临时目录stdlib
中添加Filename.temp_dir
是 Tezos 项目需要的,以允许导入 HTTP tar 快照。 -
ocaml/ocaml#10971 限制运行时保留多少内存的方法,以便可以使用 Valgrind 和 AFL
建议从
OCAMLRUNPARAM
设置max_domains
,以便在实现中取得可用性和复杂性之间的良好平衡。 -
ocaml/ocaml#11054 尊重用户提供的最大堆栈空间值,并修复
tmp/stack_space.ml
测试的调试运行一个 PR,它为初始堆栈大小保留
OCAMLRUNPARAM=1
,并确保tmc/stack_space.ml
在运行阶段应用堆栈限制。 -
ocaml/ocaml#11057 实现对多核中异步操作的质量处理
已重新实现
caml_process_pending
的行为,并且对多核运行时中的异步操作进行了代码改进。
文档
-
ocaml/ocaml#10992 OCaml 多核内存模型和 C(运行时、FFI、VM)
关于 OCaml 多核内存模型以及
Field
宏用法的文档草稿。 -
ocaml/ocaml#11058
runtime/HACKING.adoc
:调试运行时的技巧HACKING.adoc
已更新了有关运行时系统的信息,并创建了一个新的runtime/HACKING.adoc
文件,介绍了如何排查运行时问题。 -
ocaml/ocaml#11072 domain.c:记录 STW 同步代码
关于
domain.c
中 STW 同步代码的文档草稿。
测试
-
ocaml/ocaml#10953
ocamltest/summarize.awk
未正确报告测试套件运行中的中止失败需要使用
ocamltest
对序列化器进行彻底测试。现在的建议是使用标准库和 OCaml 运行时的最少代码来实现 ocamltest。 -
ocaml/ocaml#10980 GitHub Actions / ocamltest / 测试套件 / OCaml 5
一个问题跟踪器,其中包含与 ocamltest 和 OCaml 5 相关的行动项列表。
-
ocaml/ocaml#11016
lib-dynlink-private/test.ml
在调试运行时失败在测试期间的
test_cow_repeated
段中发现了来自lib-dynlink-private/test.ml
的断言失败。 -
ocaml/ocaml#11055 运行时:在
misc.h
中引入Debug_uninit_tmc
在
runtime/memory.c
中使用misc.h
中引入的Debug_uninit_tmc
进行断言检查。 -
ocaml/ocaml#11065 恢复字节码调试器的基本功能
一个 PR 草稿,用于在存在纤维的情况下处理回溯,以恢复字节码调试器的基本功能。
性能
-
ocaml/ocaml#10964 基于环形缓冲区的运行时跟踪(
eventring
)Eventring 是一个为持续监控 OCaml 应用程序而设计的运行时跟踪系统。如下所示,在运行 Sandmark 的顺序基准测试时,此 PR 几乎没有区别
-
ocaml/ocaml#11062 字节码编译器发出过多对
caml_ensure_stack_capacity
的调用,导致速度变慢字节码编译器发出对
caml_ensure_stack_capacity
的调用,这会导致 Sandmark 基准测试的性能下降。下图比较了 4.13.1 和 5.0.0(2022 年 2 月 24 日)之间的字节码结果。
已关闭
构建
-
ocaml/ocaml#10760 使用 GNU parallel 运行 CI 测试套件
在
tools/ci/actions/runner.sh
中使用make parallel
加速 CI 测试运行。 -
ocaml/ocaml#10875 在 OpenBSD 上为纤维堆栈使用 mmap(MAP_STACK|...)
一个使用
mmap(MAP_STACK)
而不是malloc
分配堆栈的选项。可以使用配置选项--enable-mmap-map-stack
使用此选项。如下所示,在 Linux 上,trunk 或启用/禁用 mmap 之间几乎没有区别
-
ocaml/ocaml#10893 删除配置选项
--disable-force-safe-string
和DEFAULT_STRING=unsafe
一个删除已弃用的
--disable-force-safe-string
和DEFAULT_STRING=unsafe
编译器选项的 PR。 -
ocaml/ocaml#10962 在 configure 中忽略兼容的
--disable
选项为了兼容性,保留了
m.h
中的NO_NAKED_POINTERS
和Makefile.config.in
中的NAKED_POINTERS=false
定义,并忽略了配置脚本中--disable
选项的错误。 -
ocaml/ocaml#11037 在重启Jenkins CI期间发现的各种修复
此PR包含配置调整、Jenkins脚本更新、测试套件修复以及基于Jenkins CI观察结果对运行时系统的更新。
-
ocaml/ocaml#11049 规范化编译器的版本号
编译器版本号现在为
5.0.0
。 -
ocaml/ocaml#11063 修复#11049后的opam文件
ocaml-variants.opam
文件已更新为使用版本5.0.0+trunk
。
修复
-
ocaml/ocaml#10973 删除domain_state中未使用的
gc_regs_slot
gc_regs_slot
已被gc_regs_bucket
取代,因此将其删除。 -
ocaml/ocaml#10994 [次要] 修复
minor_gc.c:reallloc_generic_table
中的多核合并错误runtime/minor_gc.c
中的realloc_generic_table
已使用正确的参数恢复。 -
ocaml/ocaml#11002 在运行时不要使用
Begin_roots
/End_roots
运行时不应使用
Begin_roots
和End_roots
,并且已在这些宏中添加了弃用警告。 -
ocaml/ocaml#11014 在字节码解释器中减少对挂起信号向量的轮询
字节码解释器中已删除使用
caml_check_pending_signals
进行的轮询。此外,caml_check_pending_interrupt
已删除,取而代之的是caml_check_gc_interrupt
。 -
ocaml/ocaml#11039 重新引入
caml_final_do_calls_exn
基于对多核中异步动作处理的审查,已更新
runtime/finalise.c
代码,并重新引入了caml_final_do_calls_exn
。 -
ocaml/ocaml#11046 caml_reallocate_minor_heap中的小错误修复
修复了
caml_reallocate_minor_heap
的“释放”逻辑,并记录了当前的小堆布局。 -
ocaml/ocaml#11051 修复
runtime/startup_byt.c
中残留的TODOruntime/startup_byt.c
中的Fatal error during unlock: Operation not permitted
错误现已修复。 -
ocaml/ocaml#11053 将
Hd_val
设为松散原子加载此PR提供了对ThreadSanitizer问题的修复。
Hd_val
不再是左值,并已移至松散原子。
文档
-
ocaml/ocaml#11008 文档化并重构gc-stats代码
GC模块提供两种运行时统计信息,
Heap Stats
和Allocation Stats
,并在runtime/caml/gc_stats.h
中进行了说明。 -
ocaml/ocaml#11038 原子:更新文档并添加机构
由于原子现在是原语,因此已删除
CamlInternalAtomic
,并更新了文档。 -
ocaml/ocaml#11059 本地栈切换函数的文档改进
在
fiber.h
中为ocaml_runstack
、caml_perform
、caml_reperform
和caml_resume
的本地代码规范添加了其他注释。还记录了数据结构struct stack_info
和struct stack_handler
。
测试
-
ocaml/ocaml#10930 针对已删除的
Stream
和Pervasives
库PR#10896的下游补丁更改已更新用于运行5.00.0+trunk并行基准测试的Sandmark依赖项的推荐补丁更改。
-
ocaml/ocaml#11004 内存模型测试
已创建新的
testsuite/tests/memory-model
子目录用于测试内存模型。 -
ocaml/ocaml#11033 修复测试
callback/test_signalhandler.ml
已清理
testsuite/tests/callback
中的.mli
文件,并且unix_kill
现在检查信号。已向测试中添加了一个不分配的mykill
函数。
增强
-
ocaml/ocaml#10462 添加[@poll error]属性
此PR建议一个属性来配合安全点PR,这将帮助库开发者以更不容易出错的方式执行原子部分。
-
ocaml/ocaml#10950 使用
malloc
而不是mmap
分配域状态mmap
调用已替换为malloc
以简化Caml_state
管理。 -
ocaml/ocaml#10965 所有运行时钩子的线程安全
已合并钩子的线程安全性和多核中GC计时钩子的恢复。
-
ocaml/ocaml#10966 多核审查的简化/清理/澄清
已记录
caml_modify
,简化了信号/动作的API,并删除了死代码。 -
ocaml/ocaml#10974
domain.c
:对域唯一ID使用原子计数器已删除使用固定的
Max_domains
设置,以便在程序执行期间动态配置它。 -
ocaml/ocaml#10977 使
<caml/sync.h>
更抽象并重构sync.c的实现<caml/sync.h>
中互斥锁和条件变量的POSIX实现已移至sync_posix.h
。<caml/sync.h>
仅声明高级的、与平台无关的互斥锁和条件变量操作。 -
ocaml/ocaml#10988 提供
cpu_relax
的默认定义已在
runtime/caml/platform.h
中添加了cpu_relax
的默认定义。 -
ocaml/ocaml#11003 调整小堆空间的
mmap
对齐已调整小堆空间中
mmap
的对齐方式以使用caml_sys_pagesize
。 -
ocaml/ocaml#11010 使用
strerror_r
进行可重入错误字符串转换的替代方法strerror_r
用于可重入错误字符串转换。此外,已在runtime/platform.c
中添加了caml_plat_fatal_error
错误报告函数。 -
ocaml/ocaml#11023 在DEBUG中仔细清理小堆
Debug_free_minor
用于在小收集结束时清理小堆,并且在使用Alloc_small
时会检查从Debug_free_minor
到Debug_uninit_minor
的转换。 -
ocaml/ocaml#11031 使用帧指针时,异常处理程序应恢复RBP
在AMD64上,使用帧指针时,异常处理程序应恢复
rbp
寄存器。 -
ocaml/ocaml#11056 对“命名值”处理的少量改进
caml_named_value("Unix.Unix_error")
的结果被缓存,并且“djb2”哈希函数用于命名值的表。此外,已在caml_iterate_named_values
中添加了锁定。
清理
-
ocaml/ocaml#10966 来自多核审查的简化/清理/澄清
现在已记录
caml_modify
,并且一些公共API已变为私有。信号的API已简化,并删除了死代码。 -
ocaml/ocaml#11001 头文件清理:
mlvalues.h
只包含domain_state.h
一次并最大程度减少跨头文件包含domain_state.h
现在只包含mlvalues.h
一次,并且此PR最大程度减少了头文件之间的交叉包含。 -
ocaml/ocaml#11019 删除
caml_thread_enter_blocking_section
中不必要的Current_thread
恢复otherlibs/systhreads/st_stubs.c
中的caml_thread_enter_blocking_section
函数已更新,以删除对Current_thread
的不必要使用。 -
ocaml/ocaml#11041 effect.ml中的少量清理
此PR删除了
Effect.Shallow
中的代码重复。它还删除了Obj.magic
并包含对Shallow.fiber
的优化。
性能
-
ocaml/ocaml#10930 针对已删除的
Stream
和Pervasives
库PR#10896的下游补丁更改删除
Stream
和Pervasives
库需要对Sandmark依赖项包进行补丁更新。 -
ocaml/ocaml#10949 数组上的原子操作
新的
Atomic.Array
模块包含数组上的原子操作,即原子读、写、交换、比较和设置以及获取和添加。对一个程序进行了基准测试,该程序生成四个线程并在整数的原子数组中执行10,000次获取和添加。下图显示了随机写访问的性能。 -
ocaml/ocaml#11000 修复#10462引入的一个小回归
check_local_inline
已添加到lambda/translattribute.ml
以修复与安全点相关的一个小回归。 -
ocaml/ocaml#11047 gc stats:正确地孤立分配统计信息
orphan stats
存储在gc_stats.c
中的全局structure alloc_stats
中,该结构受锁保护。在域终止时,当前域的统计信息将添加到orphan stats
中。
ARM64
-
ocaml/ocaml#10943 在Cmm和Mach IR中引入原子加载
Patomic_load
原语现在已得到增强,以便于支持其他架构。ARM64支持需要此功能。 -
ocaml/ocaml#10972 ARM64多核支持
已合并ARM64多核OCaml的PR。已更新
arm64.S
文件,并且testsuite/tests/effects
和testsuite/tests/callback
的覆盖测试运行正常。
生态系统
Eio
开放
-
ocaml-multicore/eio#190 更新至
cmdliner.1.1.0
一个更新至
cmdline.1.1.0
的草稿 PR,其中包含对lib_eio_linux/tests/eurcp.ml
的更改。 -
ocaml-multicore/eio#196 考虑重命名
Fibre.fork
Fibre.fork
的名称与Unix.fork
无关,并且它不会复制调用环境。它需要重命名。建议包括create
、start
或spawn
。 -
源代码现在依赖于
uring.0.3
,并且CHANGES.md
文件已更新以准备发布。
已完成
构建
-
ocaml-multicore/eio#167 删除对 uring 的 pin-depends
eio_linux.opam
文件中的pin-depends
部分已删除。 -
ocaml-multicore/eio#182 添加对 OCaml 的依赖
已在
dune-project
和eio.opam
文件中添加了一个显式依赖项,其中提到了ocaml (>= 4.12.0)
。
修复
-
ocaml-multicore/eio#173
Buf_read.seq
现在检查流是否已移动已添加对重复使用序列或先执行其他解析操作时的错误检测。
-
ocaml-multicore/eio#174 从承诺中删除“broken”状态
承诺现在只是未解决或已解决。
Promise.await
不再抛出异常,并且Promise.break
、Promise.broken
和await_result
已删除。 -
ocaml-multicore/eio#176 防止从其他域修改 Switch 和 Cancel
不允许跨域的取消上下文,并且取消函数可以假设它们在其自己的域中运行。
-
ocaml-multicore/eio#187 WSL:“Hello, World”示例上的 Unix.Unix_error
@leviroth (Levi Roth) 在 Windows 11 上运行“Hello, World”示例时报告了一个
Unix.Unix_error
。 PR#203 提供了相同的修复程序。 -
ocaml-multicore/eio#195 将 Fibre 重命名为 Fiber
源代码中使用了
Fiber
的上游命名,旧名称被标记为已弃用。 -
ocaml-multicore/eio#201
Effect.eff
现在在主干中为Effect.t
主干中将
Effect.eff
更改为Effect.t
的上游更改已合并到 Eio 中,并与 4.12+domains 兼容。 -
ocaml-multicore/eio#203 如果无法使用 uring,则切换到
luv
后端已添加一个
fallback
参数来检查系统上是否可用io_uring
。否则,将使用luv
后端。
增强
-
ocaml-multicore/eio#155 添加
Eio_unix.FD
FD
模块已添加到lib_eio/unix/eio_unix.ml
中,用于与Luv.0.5.11
异步 I/O 库一起使用。 -
ocaml-multicore/eio#165 将
secure_random
设备添加到 stdenv已将 Random 模块添加到
lib_eio_luv/eio_luv.ml
中,并且lib_eio/eio.ml
包含一个secure_random
设备到 stdenv 中。 -
ocaml-multicore/eio#166 简化 Flow 接口
已删除
read
和write
类,我们现在对所有内容都使用source
和sink
。此外,Flow.read_into src buf
已重命名为Flow.read src buf
。 -
ocaml-multicore/eio#168 将底层后端函数移动到子模块
Eio 抽象提供了顶级函数,因此底层后端函数已移动到子模块。
-
ocaml-multicore/eio#169 使
Eio.Std
只提供对 Eio 的别名此 PR 允许您直接引用
Eio.Promise.t
,并且Eio.Std
提供对 Eio 的别名。 -
ocaml-multicore/eio#171 UDP 接口
对 Eio 的网络接口的
UDP
支持的初始实现。还添加了一个tests/test_network.md
文件来测试使用 UDP 和端点。 -
ocaml-multicore/eio#175 添加
Buf_read.parse_exn
lib_eio/buf_read.ml
文件现在包含一个parse_exn
函数,该函数将解析器错误转换为友好消息。 -
ocaml-multicore/eio#177 将
Ipaddr.classify
替换为Ipaddr.fold
Ipaddr.fold
用于代替Ipaddr.classify
以匹配stdlib
的样式。 -
ocaml-multicore/eio#178 将
Sink.write
重命名为Sink.copy
Sink.write
函数已重命名为Sink.copy
以匹配实际功能。 -
ocaml-multicore/eio#181 将 ctf 移动到 eio
Ctf
模块已移动到 Eio 内部,因为它的 API 可能会经常更改。 -
ocaml-multicore/eio#188 添加
Eio_unix.sleep
已添加
Eio_unix.sleep
函数作为Lwt_unix.sleep
的替代,以不将时间视为能力。 -
ocaml-multicore/eio#192 整理分叉 API
Cancel.cancel
已优化,并且fork_promise
报告针对承诺的结果。 -
ocaml-multicore/eio#198 添加
Eio_unix.FD.as_socket
我们现在将 Unix FD 包装为 Eio 套接字,这对于处理提供
Unix.file_descr
的现有库或从套接字激活接收 FD 时很有用。 -
ocaml-multicore/eio#199 更新到新的 uring API 以获取 FD 传递
lib_eio_linux/eio_linux.ml
文件已更新为使用新的uring API
,并且已添加了一个 FD 传递测试。 -
ocaml-multicore/eio#200 Eio_linux:应对缺少固定块
分配固定缓冲区的失败请求现在会记录警告。
with_chunk
函数采用n_blocks
参数,free
现在称为free_fixed
。
文档
-
ocaml-multicore/eio#170 文档说明如何自己实现 Eio 对象
已在
README.md
文件中添加了“提供程序接口”部分,其中记录了如何定义您自己的资源。 -
ocaml-multicore/eio#172 清理 Eio odoc
Hook
已内联到Switch
中,大多数模块现在都有带有示例的文档。 -
ocaml-multicore/eio#179 更新
eio_main
、eio_luv
和eio_linux
的 odoc已更新
eio_main
、eio_luv
和eio_linux
文件的 odoc 文档。 -
ocaml-multicore/eio#180 更新 README
在
README.md
文件中添加了关于对象能力
的其他说明,以及 Eio 项目的当前状态。 -
ocaml-multicore/eio#183 在发布时发布 odoc
dune-project
文件已更新,其中包含指向 Eio 的 odoc 文档网页的链接。 -
ocaml-multicore/eio#185 从 README 链接到生成的 odoc
已明确链接
README.md
文件中生成的 odoc 的链接,以便快速参考。 -
ocaml-multicore/eio#186 较小的文档修复
README.md
和lib_eio/eio.mli
文档已更新,其中包含一些小修复。 -
ocaml-multicore/eio#194 删除“object”一词的混淆用法
已从 README.md 文件的“能力”部分删除了
object
一词,以避免与 OCaml 对象(多态记录)混淆。 -
ocaml-multicore/eio#197 添加更多文档
已更新有关
取消
的文档,其中包含更多底层详细信息。
测试
-
ocaml-multicore/eio#184 测试:对测试套接字使用本地目录
opam-repo-ci
使用只读/tmp
目录,因此我们切换到对测试套接字使用本地目录。 -
ocaml-multicore/eio#189 添加一个示例
Eio_null
后端已添加一个没有实际效果的 Eio 后端框架作为示例。它效率低下且不是线程安全的,但仅用于演示目的。
-
ocaml-multicore/eio#191 抑制 cmdliner 过时警告
已将
-deprecated
标志添加到lib_eio_linux/tests/eurcp.ml
以在测试时抑制 cmdliner 警告。 -
ocaml-multicore/eio#202 修复测试中的错别字
lib_eio/eio_linux/tests/fd_passing.md
文件已更新为使用EIO_BACKEND=luv
运行 uring 测试。 -
ocaml-multicore/eio#204 在非 Linux 平台上禁用 Linux mdx 测试
使用
dune.2.9
中的enabled_if
结构,现在仅当系统为linux
时才运行 Linux MDX 测试。
Tezos
打开
-
ocaml-multicore/tezos#25 合并更新 - 暂时禁用失败的测试
暂时禁用失败的测试,以及上游更改的合并更新。
-
ocaml-multicore/tezos#27 在 5.0.0+trunk 上构建的状态
一个问题跟踪器,用于列出在 5.0.0+trunk 上构建 Tezos 所需的失败构建。
已关闭
-
ocaml-multicore/tezos-opam-repository#9 同步
一个合并,将存储库更新为 2022 年 1 月 24 日的上游更改,用于
4.12.0+domains
分支。 -
将上游更改同步到
4.12.0+domains
分支。
domainslib
打开
-
ocaml-multicore/domainslib#65 修复主干上的构建
已提供 Domainslib 中用于重命名
Effect.eff -> Effect.t
更改的补丁。CI 现在也已更新为构建5.0.0+trunk
。 -
ocaml-multicore/domainslib#66
Domainslib.0.4.1
使用OCaml 5.0.0+trunk
构建失败在 Sandmark 中为 OCaml 5.0.0+trunk 构建
Domainslib.0.4.1
时发生Unbound type constructer eff
错误。
已完成
-
ocaml-multicore/domainslib#64 来自 opam-repository 的更改
domainslib.opam
文件已更新为使用OCaml (>= "5.0")
和dune (>= "1.8")
。
ocaml-uring
已关闭
更新
-
ocaml-multicore/ocaml-uring#46 更新到
liburing 2.1
源代码已更新为使用
liburing.2.1
,并且lib/uring/uring_stubs.c
现在调用io_uring_submit(ring)
。 -
ocaml-multicore/ocaml-uring#49 添加
sendmsg
和recvmsg
此 PR 将
sendmsg(2)
和recvmsg(2)
调用添加到 uring 库中,并定义了一个模块Msghdr
。 -
ocaml-multicore/ocaml-uring#50
Cmdliner.1.1.0
Cmdliner
版本已更新到 1.1.0,并使用最新的 API 进行测试。 -
ocaml-multicore/ocaml-uring#52 允许使用 SCM_RIGHTS 发送和接收 FD
send_msg
中的目标地址是可选的,我们现在可以使用 SCM_RIGHTS 发送和接收 FD。 -
ocaml-multicore/ocaml-uring#53 默认情况下不分配固定缓冲区
用户需要使用
set_fixed_buffer
分配固定大小的缓冲区,以避免遇到资源限制并锁定内存。
文档
-
ocaml-multicore/ocaml-uring#47 准备发布
CHANGES.md
文件已更新,包含新功能和发布变更。 -
ocaml-multicore/ocaml-uring#48 API 文档链接
README.md
已更新,包含指向 API 文档 的链接。 -
ocaml-multicore/ocaml-uring#54 准备发布
CHANGES.md
文件已更新,包含新的和重大变更,以准备发布。
retro-httpaf-bench
开放
-
ocaml-multicore/retro-httpaf-bench#19 cohttp-eio: 添加基于 cohttp-eio 的基准测试
已添加一个
cohttp_eio
基准测试,并更新了基准测试脚本。 -
ocaml-multicore/retro-httpaf-bench#21 更简单的 hyper 服务器
一个使用 Tokio 的多线程调度器的简单 hyper 服务器实现。
-
ocaml-multicore/retro-httpaf-bench#22 添加 shuttle 的版本约束
为了保持基准测试的运行,即使 shuttle 的未来版本有重大更改,也明确指定了
shuttle.0.3.1
版本。
已完成
-
ocaml-multicore/retro-httpaf-bench#20 更新到
Eio
0.1Dockerfile 已更新为使用
Eio
0.1。
其他
开放
-
ocaml-multicore/eventlog-tools#6 更新
eventlog-tools
以支持多核正在进行的工作,用于更新
eventlog-tools
以支持多核 OCaml。 -
ocaml-multicore/tezos#24 测试套件失败
正在修复运行测试时出现的
Alcotest_engine__Core.Make(P) (M)
错误。 -
ocaml-multicore/effects-examples#26 移植到 OCaml 5.00
需要 重命名 Effect.{eff=>t} 的 PR 将
Effects
示例移植到 OCaml 5.0 上运行,而无需使用专门的效果语法。
已关闭
-
ocaml-multicore/eventlog-tools#5 更新
consts.ml
以支持 OCaml 4.13force_minor/memprof
源代码已包含在lib/consts.ml
中,以便为 OCaml 4.13.1 构建 eventlog-tools。 -
ocaml-multicore/lockfree#9 更新
cpu_relax
到新位置Domain.Sync.cpu_relax
已更新为src/backoff.ml
中的cpu_relax
,以便使用 OCaml 5.0.0 构建。 -
ocaml-multicore/lockfree#10 从 opam 文件中删除未使用的依赖项
kcas
包不是lockfree
的依赖项,并且不再需要ocamlfind
和ocamlbuild
。这三个依赖项已从lockfree.opam
文件中删除。 -
ocaml-multicore/kcas#11 更新
cpu_relax
到新位置此 PR 更新了
src/backoff.ml
中的Domain.Sync.cpu_relax
,以便它可以与 OCaml 5.0.0 编译。
基准测试
Sandmark
开放
-
ocaml-bench/sandmark#274 自定义变体支持
为特定分支构建 Sandmark 开发者分支的配置、配置选项、运行时参数、变体的名称、依赖项包覆盖、包删除列表以及 Sandmark 每晚运行应持续到期的日期几乎已完成。示例 JSON 配置文件如下所示
[ { "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#279 将 notebooks/ 更新到 5.00.0+trunk
notebooks/
文件夹中的 Jupyter 笔记本需要更新为默认使用 5.0.0+trunk。 -
ocaml-bench/sandmark#280 上游 5.00.0+trunk 依赖项包
一些 Sandmark 依赖项包补丁已上游到相应的维护者或 OPAM 存储库。还有一些补丁需要提交到上游。
-
ocaml-bench/sandmark#282 分析字节码性能
Sandmark 基准测试默认生成本机代码,我们希望运行基准测试的字节码版本,以识别 4.13 或 4.14 与 5.0.0+trunk 之间的任何回归。
-
ocaml-bench/sandmark#285 评估合并并行 run_config.json 文件
请求将
multicore_parallel_run_config.json
和multicore_parallel_navajo_run_config.json
合并到一个 JSON 文件中,以便我们将新的基准测试添加到一个地方而不是两个(或更多)。 -
ocaml-bench/sandmark#286 更新
check_url
并验证 custom.json 文件中的 URLMakefile 中的
check_url
目标需要检查custom.json
文件中每个条目是否存在 URL,以及 URL 是否确实存在。
已关闭
构建
-
ocaml-bench/sandmark#270 更新到 5.00.0+domains
已更新运行 5.00.0+domains 变体的依赖项和基准测试,以便在 Sandmark 中构建。
-
ocaml-bench/sandmark#276 使用 CI failure:ignore 选项重新添加 5.00.0+trunk
已更新 .drone.yml CI 以忽略 5.00.0+trunk 的构建失败,以便只要 5.00.0+stable Sandmark 构建正常,我们就可以继续合并更改。
-
ocaml-bench/sandmark#278 更新 run_all 脚本并将 5.00.0+stable 更新到 2022 年 2 月 3 日的提交
已更新
run_all
脚本以使用SYS_DUNE_HACK
,并且 5.00.0+stable 变体已更新到 2022 年 2 月 3 日的ocaml/ocaml
提交。 -
ocaml-bench/sandmark#295 在构建后完全清理 OCaml 依赖项/包
需要正确清理
ocaml-base-compiler
和ocaml
依赖项包文件夹,因为它们在后续的 sandmark-nightly 运行中使用。
增强
-
ocaml-bench/sandmark#271 将 ocaml-variants 信息参数化为 Docker 环境变量
Sandmark Makefile 中的以下变量已参数化为环境变量,以支持
自定义变体支持
功能请求SANDMARK_DUNE_VERSION SANDMARK_URL SANDMARK_REMOVE_PACKAGES SANDMARK_OVERRIDE_PACKAGES
-
ocaml-bench/sandmark#283 添加自定义变体支持功能
已合并对自定义变体支持功能的初始支持,该功能允许您在 custom.json 文件中指定
url
、tag
、config_json
、name
、expiry
、environment
、configure
和runparams
,以便与 sandmark-nightly 运行。 -
ocaml-bench/sandmark#284 在 .orun.summary.bench 输出中使用特定名称
现在,在
orun.summary.bench
结果文件中使用 custom.json 文件中指定的name
。 -
ocaml-bench/sandmark#287 为每个服务器使用单独的自定义变体 JSON 文件
为 sandmark-nightly 执行运行创建了两个单独的
custom_navajo.json
和custom_turing.json
文件。 -
ocaml-bench/sandmark#291 将自定义脚本日志输出到结果目录
构建和执行日志现在与基准测试结果一起存储,以便在 UI 中轻松访问。
-
ocaml-bench/sandmark#293 允许对自定义变体使用原始 GitHub JSON 配置输入
您现在可以使用
CUSTOM_FILE
环境变量将远程文件作为输入配置传递给自定义支持变体功能请求。
文档
-
ocaml-bench/sandmark#268 将 README CI 构建状态更新到主分支
Sandmark 中
main
分支的 CI构建状态
已更新为指向主分支。 -
ocaml-bench/sandmark#277 从 master 分支同步和更新 README
Sandmark master 分支的 README 更改已与 main 分支同步,因为我们很快将切换到使用 main 分支作为 Sandmark 的默认分支。
其他
-
ocaml-bench/sandmark#281 Sandmark.ocamllabs.io 显示错误而不是并行基准测试
生产服务器已部署了最新的每晚脚本,以及修复并行基准测试显示的 Web 应用程序。
-
ocaml-bench/sandmark#289 为一致性使用 run_config.json 中的 CPU 5
orun
命令现在使用 CPU 5 以与其他包装器保持一致。这与 CI 运行无关。 -
ocaml-bench/sandmark#292 在并行基准测试中使用 Task 运行
Sandmark 中的
domainslib.0.4.1
包已更新,并且parallel_for
和await
调用现在包装在Task.run
中。 -
ocaml-bench/sandmark#296 在并行基准测试中使用单个
Task.run
修复了 iter 函数内部的
Task.pool
无限期阻塞的问题。现在LU_decomposition_multicore.exe
并行基准测试可以正确运行。
Sandmark-nightly
开放
-
ocaml-bench/sandmark-nightly#21 添加 5.0 变体
sandmark-nightly 脚本现在运行 5.0 变体,但是需要更新
ocaml/ocaml
的暂停时间。 -
ocaml-bench/sandmark-nightly#42 Sandmark 每晚运行的警报通知
每晚运行的每日状态摘要应发送到
ocaml-matrix
服务器的部署。 -
ocaml-bench/sandmark-nightly#45 重构 sandmark-nightly
需要进行一系列更改以清理 sandmark-nightly 存储库,并将脚本移动到 Sandmark。因此,sandmark-nightly 将仅存储数据结果,而 Sandmark 将包含代码。
-
ocaml-bench/sandmark-nightly#48 首页中的编号列表未对齐
首页中的列表缩进不正确,需要修复。
-
ocaml-bench/sandmark-nightly#49 将 Sandmark 信息添加到 sandmark-nightly
此 PR 在 UI 中显示了 sandmark-nightly 中使用的 Sandmark 的提交版本和分支。
已关闭
-
ocaml-bench/sandmark-nightly#27 在标准化图表中包含基线变体信息
标准化图表现在包含用于比较的基线变体的信息。
-
ocaml-bench/sandmark-nightly#34 并行基准测试应在
ocaml/ocaml#trunk
上运行CI 并行基准测试执行运行已切换到
ocaml/ocaml#trunk
上运行。 -
ocaml-bench/sandmark-nightly#37 顺序结果比较已损坏
现在在 UI 中处理 .bench 输出中包含元数据头第一行的操作。
-
ocaml-bench/sandmark-nightly#40 着陆页信息已过期
着陆页现在正确显示
stable
和trunk
变体。 -
ocaml-bench/sandmark-nightly#50 索引页的简单修复以正确显示文本
已修复尾随空格和列表缩进。
current-bench
打开
最终用户
-
ocurrent/current-bench#306 OCaml 编译器基准测试 (WIP)
一个用于构建
ocaml/ocaml
编译器基准测试以及使用 current-bench 的必要工具的高级问题跟踪器。 -
ocurrent/current-bench#311 树莓派长期支持
树莓派现已添加到
current-bench
集群中,您可以在environments/production.conf
中添加如下所示的条目。{ "repositories": [ { "name": "mirage/irmin", "worker": "rpi4b", "image": "ocaml/opam:debian-11-ocaml-4.12" }
需要一种方法来处理树莓派上密集的 Irmin 基准测试期间的风扇噪音。
增强功能
-
ocurrent/current-bench#312 时间调度
基准测试在新的提交、默认分支或 PR 上运行。我们需要添加支持以及时安排作业。
-
ocurrent/current-bench#314 对新存储库进行回溯基准测试
一项功能请求,以便能够对较旧的提交运行基准测试结果,以用于较新的 current-bench 部署。
前端
-
ocurrent/current-bench#313 记录提交信息
提交的第一行描述需要与提交哈希一起在 UI 中显示。
-
ocurrent/current-bench#317 前端重写
前端使用 Rescript,当前的绘图库存在局限性。一个开放的问题,讨论重写前端。
-
ocurrent/current-bench#322 调整比较提交值工具上的单位
现在在基准测试值和比较值上都调用
adjust
函数以显示相同的单位。 -
ocurrent/current-bench#323 允许单击图例以显示/隐藏绘图线并使用更多列
现在,当在 UI 中单击显示/隐藏绘图时,图例使用更多列,如下所示
-
ocurrent/current-bench#324 禁用的工作程序/Docker 镜像
前端自动选择第一个“环境”(工作程序 + Docker 镜像),并且系统可能包含已禁用的环境。需要过滤环境列表以仅显示活动条目。
-
ocurrent/current-bench#326 前端:修复对所有指标使用相同 x 轴的错误
此 PR 修复了更改,以便对 x 轴上的每个指标使用所有提交的正确元数据。
测试
-
ocurrent/current-bench#316 真实环境测试
current-bench 需要功能测试和集成测试来检查故障条件并验证后端管道。
-
ocurrent/current-bench#318 Cobench 用户库
在添加新的基准测试时,需要一个验证测试接口来检查
make bench
输出的预期 JSON 输出是否符合最新的模式。
监控
-
ocurrent/current-bench#290 向 JSON 添加可选字段
一个请求,在 JSON 对象中添加一个可选字段,其值可以在日志中逐字打印。
-
ocurrent/current-bench#298 生产日志和警告
根据管道中的组件过滤日志对于排查和调试生产问题将很有用。
-
ocurrent/current-bench#319 Github 机器人消息
类似于代码覆盖率报告,在 GitHub PR 上生成详细的性能回归结果将是很好的。
已关闭
构建
-
ocurrent/current-bench#282 用于堆栈部署的 Docker Compose
现在,
docker-compose.yaml
文件可以构建后端管道和前端堆栈以进行部署。 -
ocurrent/current-bench#301 树莓派 ARM 的工作程序支持:添加新的参数以指定架构
已将架构参数添加到
run_command
函数中,以允许使用树莓派 ARM 作为工作程序。 -
ocurrent/current-bench#305 将
ocamlformat
版本更新到0.20.1
ocamlformat
版本已从0.19.0
更新到0.20.1
。
增强功能
-
ocurrent/current-bench#289 修复缺少拉取请求编号的 URL
重定向以添加工作程序或 Docker 镜像时,URL 应包含 PR 编号。
-
ocurrent/current-bench#292 为 API 请求返回更好的 HTTP 错误代码
客户端请求现在接收正确的 HTTP 错误代码以进行异常处理。
前端
-
ocurrent/current-bench#293 通过从链接文本中删除日志 ID 使日志链接更醒目
现在在 UI 中提供了查看构建和执行日志的链接,而不是日志 UUID。
-
ocurrent/current-bench#299 修复 GitHub 状态更新:等待基准测试终止
只有在成功执行基准测试后,应用程序的 GitHub 状态才会显示绿色“通过”状态。
-
ocurrent/current-bench#308 前端:修复默认基准测试的 GraphQL 查询错误
默认基准测试现在具有名称而不是 NULL 以满足 PostgreSQL 的 UNIQUE 约束。
-
ocurrent/current-bench#309 使从错误视图返回“主页”更容易
已在错误视图中添加了一个侧边栏以方便导航。
-
ocurrent/ocurrent#309 显示行号并允许跳转到作业日志中的特定行
类似 http://localhost:8080/job/2022-02-09/115753-docker-build-71c777#L11-L15 这样的 URL 将突出显示第 11 到 15 行,并将页面滚动到第 11 行,如下所示
-
ocurrent/current-bench#320 显示所有指标的所有提交并突出显示失败的指标
对于最新提交没有值的指标被视为失败的提交,但是所有指标都显示在 UI 中。图表也已设置为全宽并垂直对齐,如下所示
-
ocurrent/current-bench#325 无论构建状态如何,都显示旧提交基准测试警告
UI 现在显示旧提交基准测试警告。
测试
-
ocurrent/current-bench#294 添加单元测试
已创建包含单元测试的
pipeline/tests
文件夹,您可以从pipeline/
目录中运行它们,如下所示$ dune runtest $ dune exec tests/test.exe
-
ocurrent/current-bench#307 使用 bisect_ppx 添加覆盖率
Makefile 现在包含一个
coverage
目标,该目标使用bisect_ppx
并生成 HTML 覆盖率报告。
其他
-
ocurrent/current-bench#281 文档如何添加工作程序
HACKING.md
文件已更新,其中包含有关如何将新工作程序添加到集群以及配置远程工作程序以运行基准测试的信息。 -
ocurrent/current-bench#295 修复基准测试名称唯一性约束
PostgreSQL 不认为 NULL 值相等,因此不会触发基准测试名称的 UNIQUE 约束冲突。这会在数据库中创建重复行,此 PR 提供了应用程序和数据库级别的修复。
-
ocurrent/current-bench#296 捕获指标在日志中出现的位置的行号
现在在数据库中捕获来自日志的指标的行号。
-
ocurrent/current-bench#303 在管道启动时运行 DB 迁移
现在在启动应用程序之前运行数据库迁移,这些迁移以前是在
make
目标中定义的。 -
ocurrent/current-bench#304 更新已弃用的 Term 函数
已更新
cmdliner.1.1.0
包以及删除已弃用的Term
函数用法的更改。
我们特别感谢社区中所有 OCaml 用户、开发人员和贡献者,感谢他们宝贵的时间和对项目的持续支持。
首字母缩略词
- AFL:American Fuzzy Lop
- AMD:超微半导体
- API:应用程序编程接口
- ARM:高级精简指令集机器
- AWK:Aho Weinberger Kernighan
- BSD:伯克利软件发行版
- CI:持续集成
- CTF:通用跟踪格式
- DB:数据库
- EOL:生命周期结束
- FD:文件描述符
- FFI:外部函数接口
- GC:垃圾回收器
- GNU:GNU 不是 Unix
- HTTP:超文本传输协议
- IO:输入/输出
- IR:中间表示
- JSON:JavaScript 对象表示法
- MD:Markdown
- OPAM:OCaml 包管理器
- POSIX:可移植操作系统接口
- PR:拉取请求
- RHEL:Red Hat Enterprise Linux
- STW:停止世界
- UDP:用户数据报协议
- UI:用户界面
- URL:统一资源定位符
- UUID:通用唯一标识符
- VM:虚拟机
- WSL:Windows 子系统 Linux