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 的可變狀態的 issue 追蹤器,因為 OCaml 5.00 stdlib 實作應同時具有記憶體安全和執行緒安全。

  • ocaml/ocaml#11013 OCaml 5.0 發佈目標的中繼 issue

    包含 OCaml 5.0 分支的檢查清單的 issue 追蹤器。

  • 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 年才會達到 EOL。此 issue 追蹤新增 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 檔案

    保持編譯器函式庫(stdlibcompiler-libsthreadsunixstrdynlink)META 檔案為最新狀態,並將其與編譯器一起安裝的 PR。

錯誤

  • ocaml/ocaml#10773 [4.14] Type [> Cycle ]type [> Cycle ] 不相容

    在用 4.14 分支編譯 capnp-rpc.1.2.1 時,報告了 Type [> ``Cycle ] 不相容錯誤。

  • ocaml/ocaml#10868 修正初始化框架雜湊表時的 off-by-1 錯誤

    runtime/frame_descriptors.c 的 PR,它修正在初始化框架雜湊表時的 off-by-1 錯誤。

  • ocaml/ocaml#11040 ThreadSanitizer 問題

    包含 ThreadSanitizertests/parallel 執行中執行清單以進行競爭條件疑難排解的 issue 追蹤器。

  • ocaml/ocaml#11061 dumpobj 工具崩潰

    已報告來自位元組碼程式的 tools/dumpobj 區段錯誤。

增強

  • ocaml/ocaml#10925Caml_state 的符號重新命名為 caml_state

    Caml_state 巨集將重新命名為 caml_state 以避免名稱衝突,但此變更不會向後移植到 4.14。

  • ocaml/ocaml#10967 新增 temp_dir 函式以建立臨時目錄

    Tezos 專案需要 stdlib 中新增 Filename.temp_dir,以允許匯入 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 動作 / ocamltest / 測試套件 / OCaml 5

    包含與 ocamltest 和 OCaml 5 相關的動作項目清單的 issue 追蹤器。

  • ocaml/ocaml#11016 lib-dynlink-private/test.ml 在偵錯執行階段失敗

    在測試期間,已在 test_cow_repeated 區段中發現來自 lib-dynlink-private/test.ml 的斷言失敗。

  • ocaml/ocaml#11055 執行階段:在 misc.h 中引入 Debug_uninit_tmc

    misc.h 中引入 Debug_uninit_tmc 的情況下,runtime/memory.c 中的斷言檢查。

  • 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

    這個 PR 移除了已棄用的 --disable-force-safe-stringDEFAULT_STRING=unsafe 編譯器選項。

  • ocaml/ocaml#10962 在設定中忽略相容的 --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 Atomic:更新文件並新增機構

    由於原子操作現在是原始的,因此移除了 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 來配置 domain 狀態

    mmap 呼叫已由 malloc 取代,以簡化 Caml_state 的管理。

  • ocaml/ocaml#10965 所有執行時掛鉤的執行緒安全

    已合併掛鉤的執行緒安全和多核心中 GC 計時掛鉤的還原。

  • ocaml/ocaml#10966 多核心審查的簡化/清理/澄清

    已記錄 caml_modify,簡化了信號/動作的 API,並移除了無效程式碼。

  • ocaml/ocaml#10974 domain.c:針對 domain 唯一 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 的預設定義

    已將 cpu_relax 的預設定義新增至 runtime/caml/platform.h

  • ocaml/ocaml#11003 調整小堆積空間的 mmap 對齊方式

    已調整小堆積空間中 mmap 的對齊方式,以使用 caml_sys_pagesize

  • ocaml/ocaml#11010 使用 strerror_r 進行可重入錯誤字串轉換的替代方法

    strerror_r 用於可重入的錯誤字串轉換。此外,已將 caml_plat_fatal_error 錯誤報告函式新增至 runtime/platform.c

  • 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:正確孤立配置統計資料

    孤立統計資料 儲存在 gc_stats.c 中的全域 structure alloc_stats 中,該結構受到鎖定的保護。在 domain 終止時,目前 domain 的統計資料會新增至 孤立統計資料

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

    一個草稿 PR,用於更新至 cmdline.1.1.0,並對 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 的相依性

    已將明確提及 ocaml (>= 4.12.0) 的相依性新增至 dune-projecteio.opam 檔案。

修復
  • ocaml-multicore/eio#173 Buf_read.seq 現在檢查串流是否已繼續

    已新增針對使用序列兩次或先執行其他剖析操作的錯誤偵測。

  • ocaml-multicore/eio#174 從承諾中移除「已中斷」狀態

    現在承諾只是未解析或已解析。Promise.await 不會引發例外狀況,並且已移除 Promise.breakPromise.brokenawait_result

  • ocaml-multicore/eio#176 防止從其他網域修改 Switch 和 Cancel

    不允許跨網域的取消上下文,並且取消函式可以假設它們在自己的網域中執行。

  • ocaml-multicore/eio#187 WSL:「Hello, World」範例中的 Unix.Unix_error

    在 Windows 11 上執行「Hello, World」範例時,@leviroth (Levi Roth) 回報了 Unix.Unix_errorPR#203 提供了相同的修復程式。

  • ocaml-multicore/eio#195 將 Fibre 重新命名為 Fiber

    來源中使用 Fiber 的上游命名,舊名稱標記為已過時。

  • ocaml-multicore/eio#201 Effect.eff 在主幹中現在是 Effect.t

    主幹中從 Effect.effEffect.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#169Eio.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.fold 取代 Ipaddr.classify

    使用 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 會針對 Promise 回報結果。

  • ocaml-multicore/eio#198 新增 Eio_unix.FD.as_socket

    我們現在將 Unix FD 包裝為 Eio Socket,這對於使用提供 Unix.file_descr 的現有程式庫,或從 Socket 啟動接收 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 物件

    已將 Provider Interfaces 區段新增至 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 檔案中新增關於 Object Capabilities 的其他附註,以及 Eio 專案的目前狀態。

  • ocaml-multicore/eio#183 在發行時發佈 odoc

    已使用 Eio 的 odoc 文件網頁連結更新 dune-project 檔案。

  • ocaml-multicore/eio#185 從 README 連結至產生的 odoc

    已明確連結 README.md 檔案中產生之 odoc 的連結,以方便快速參考。

  • ocaml-multicore/eio#186 次要文件修正

    已使用次要修正更新 README.mdlib_eio/eio.mli 文件。

  • ocaml-multicore/eio#194 移除「物件」一詞的混淆用法

    已從 README.md 檔案中的 Capabilities 區段移除 object 一詞,以避免與 OCaml 物件 (多型記錄) 混淆。

  • ocaml-multicore/eio#197 新增更多文件

    已更新關於 Cancellation 的文件,其中包含更多低階詳細資料。

測試
  • ocaml-multicore/eio#184 測試:使用本機目錄進行測試 Socket

    opam-repo-ci 使用唯讀的 /tmp 目錄,因此我們切換為使用本機目錄進行測試 Socket。

  • 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+主幹上建置的狀態

    在 5.0.0+主幹上建置 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#9cpu_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#11cpu_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

    已更新在 Sandmark 中建置 5.00.0+domains 變體的相依性和基準測試。

  • 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 輸出中使用特定名稱

    custom.json 檔案中指定的 name 現在用於 orun.summary.bench 結果檔案中。

  • 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 建置狀態更新至 main 分支

    Sandmark 中 main 分支的 CI 建置狀態已更新為指向 main 分支。

  • 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

    一個在 UI 中顯示 sandmark-nightly 中使用的 Sandmark 提交版本和分支的 PR。

已關閉

current-bench

開啟中

最終使用者
  • ocurrent/current-bench#306 WIP ocaml 編譯器基準測試

    用於建置 ocaml/ocaml 編譯器基準測試的高階議題追蹤器,以及具有 current-bench 的必要工具。

  • ocurrent/current-bench#311 Raspberry Pi 長期支援

    Raspberry Pi 已新增至 current-bench 集群,您可以依照下方所示,在 environments/production.conf 中新增對應條目。

    {
    "repositories": [
      {
        "name": "mirage/irmin",
        "worker": "rpi4b",
        "image": "ocaml/opam:debian-11-ocaml-4.12"
      }
    

    需要一種方法來處理 Raspberry Pi 上密集 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 Raspberry ARM 的工作者支援:新增指定架構的新引數

    已將架構引數新增至 run_command 函式,以允許使用 Raspberry Pi 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 顯示行號並允許跳至工作記錄中的特定行

    類似 https://127.0.0.1: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 現在包含一個使用 bisect_ppxcoverage 目標,並產生 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:Advanced Micro Devices
  • API:Application Programming Interface
  • ARM:Advanced RISC Machines
  • AWK:Aho Weinberger Kernighan
  • BSD:Berkeley Software Distribution
  • CI:Continuous Integration
  • CTF:Common Trace Format
  • DB:Database
  • EOL:End Of Life
  • FD:File Descriptor
  • FFI:Foreign Function Interface
  • GC:Garbage Collector
  • GNU:GNU's Not Unix
  • HTTP:Hypertext Transfer Protocol
  • IO:Input/Output
  • IR:Intermediate Representation
  • JSON:JavaScript Object Notation
  • MD:Markdown
  • OPAM:OCaml Package Manager
  • POSIX:Portable Operating System Interface
  • PR:Pull Request
  • RHEL:Red Hat Enterprise Linux
  • STW:Stop The World
  • UDP:User Datagram Protocol
  • UI:User Interface
  • URL:Uniform Resource Locator
  • UUID:Universally Unique Identifier
  • VM:Virtual Machine
  • WSL:Windows Subsystem for Linux