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-nightlySandmark 具有自定义变体支持功能,可以构建 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.00 stdlib 的实现应该既内存安全又线程安全。

  • 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,用于维护编译器库(stdlibcompiler-libsthreadsunixstrdynlink)的最新 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#10925Caml_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-PR-10964-time|690x355

  • ocaml/ocaml#11062 字节码编译器发出过多对 caml_ensure_stack_capacity 的调用,导致速度变慢

    字节码编译器发出对 caml_ensure_stack_capacity 的调用,这会导致 Sandmark 基准测试的性能下降。下图比较了 4.13.1 和 5.0.0(2022 年 2 月 24 日)之间的字节码结果。

OCaml-Issue-11062|690x376

已关闭

构建

  • 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-PR-10875|690x301

  • ocaml/ocaml#10893 删除配置选项 --disable-force-safe-stringDEFAULT_STRING=unsafe

    一个删除已弃用的 --disable-force-safe-stringDEFAULT_STRING=unsafe 编译器选项的 PR。

  • ocaml/ocaml#10962 在 configure 中忽略兼容的 --disable 选项

    为了兼容性,保留了m.h中的NO_NAKED_POINTERSMakefile.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_rootsEnd_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中残留的TODO

    runtime/startup_byt.c中的Fatal error during unlock: Operation not permitted错误现已修复。

  • ocaml/ocaml#11053Hd_val设为松散原子加载

    此PR提供了对ThreadSanitizer问题的修复。Hd_val不再是左值,并已移至松散原子。

文档

  • ocaml/ocaml#11008 文档化并重构gc-stats代码

    GC模块提供两种运行时统计信息,Heap StatsAllocation Stats,并在runtime/caml/gc_stats.h中进行了说明。

  • ocaml/ocaml#11038 原子:更新文档并添加机构

    由于原子现在是原语,因此已删除CamlInternalAtomic,并更新了文档。

  • ocaml/ocaml#11059 本地栈切换函数的文档改进

    fiber.h中为ocaml_runstackcaml_performcaml_reperformcaml_resume的本地代码规范添加了其他注释。还记录了数据结构struct stack_infostruct stack_handler

测试

  • ocaml/ocaml#10930 针对已删除的StreamPervasives库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_minorDebug_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 针对已删除的StreamPervasives库PR#10896的下游补丁更改

    删除StreamPervasives库需要对Sandmark依赖项包进行补丁更新。

  • ocaml/ocaml#10949 数组上的原子操作

    新的Atomic.Array模块包含数组上的原子操作,即原子读、写、交换、比较和设置以及获取和添加。对一个程序进行了基准测试,该程序生成四个线程并在整数的原子数组中执行10,000次获取和添加。下图显示了随机写访问的性能。

    OCaml-PR-10949

  • 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/effectstestsuite/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 无关,并且它不会复制调用环境。它需要重命名。建议包括 createstartspawn

  • ocaml-multicore/eio#205 准备发布

    源代码现在依赖于 uring.0.3,并且 CHANGES.md 文件已更新以准备发布。

已完成

构建
  • ocaml-multicore/eio#167 删除对 uring 的 pin-depends

    eio_linux.opam 文件中的 pin-depends 部分已删除。

  • ocaml-multicore/eio#182 添加对 OCaml 的依赖

    已在 dune-projecteio.opam 文件中添加了一个显式依赖项,其中提到了 ocaml (>= 4.12.0)

修复
  • ocaml-multicore/eio#173 Buf_read.seq 现在检查流是否已移动

    已添加对重复使用序列或先执行其他解析操作时的错误检测。

  • ocaml-multicore/eio#174 从承诺中删除“broken”状态

    承诺现在只是未解决或已解决。Promise.await 不再抛出异常,并且 Promise.breakPromise.brokenawait_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_errorPR#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#165secure_random 设备添加到 stdenv

    已将 Random 模块添加到 lib_eio_luv/eio_luv.ml 中,并且 lib_eio/eio.ml 包含一个 secure_random 设备到 stdenv 中。

  • ocaml-multicore/eio#166 简化 Flow 接口

    已删除 readwrite 类,我们现在对所有内容都使用 sourcesink。此外,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#177Ipaddr.classify 替换为 Ipaddr.fold

    Ipaddr.fold 用于代替 Ipaddr.classify 以匹配 stdlib 的样式。

  • ocaml-multicore/eio#178Sink.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_maineio_luveio_linux 的 odoc

    已更新 eio_maineio_luveio_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.mdlib_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 所需的失败构建。

已关闭

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 添加 sendmsgrecvmsg

    此 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 分配固定大小的缓冲区,以避免遇到资源限制并锁定内存。

文档

retro-httpaf-bench

开放

已完成

其他

开放

已关闭

  • ocaml-multicore/eventlog-tools#5 更新 consts.ml 以支持 OCaml 4.13

    force_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 的依赖项,并且不再需要 ocamlfindocamlbuild。这三个依赖项已从 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.jsonmulticore_parallel_navajo_run_config.json 合并到一个 JSON 文件中,以便我们将新的基准测试添加到一个地方而不是两个(或更多)。

  • ocaml-bench/sandmark#286 更新 check_url 并验证 custom.json 文件中的 URL

    Makefile 中的 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-compilerocaml 依赖项包文件夹,因为它们在后续的 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 文件中指定 urltagconfig_jsonnameexpiryenvironmentconfigurerunparams,以便与 sandmark-nightly 运行。

  • ocaml-bench/sandmark#284 在 .orun.summary.bench 输出中使用特定名称

    现在,在 orun.summary.bench 结果文件中使用 custom.json 文件中指定的 name

  • ocaml-bench/sandmark#287 为每个服务器使用单独的自定义变体 JSON 文件

    为 sandmark-nightly 执行运行创建了两个单独的 custom_navajo.jsoncustom_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_forawait 调用现在包装在 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 的提交版本和分支。

已关闭

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 中单击显示/隐藏绘图时,图例使用更多列,如下所示

    Current-bench-PR-323

  • 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#305ocamlformat 版本更新到 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。

    Current-bench-PR-293

  • 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-PR-309

  • ocurrent/current-bench#320 显示所有指标的所有提交并突出显示失败的指标

    对于最新提交没有值的指标被视为失败的提交,但是所有指标都显示在 UI 中。图表也已设置为全宽并垂直对齐,如下所示

    Current-bench-PR-320

  • 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