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 的可變狀態的 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 檔案
保持編譯器函式庫(
stdlib
、compiler-libs
、threads
、unix
、str
和dynlink
)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
問題包含
ThreadSanitizer
從tests/parallel
執行中執行清單以進行競爭條件疑難排解的 issue 追蹤器。 -
ocaml/ocaml#11061
dumpobj
工具崩潰已報告來自位元組碼程式的
tools/dumpobj
區段錯誤。
增強
-
ocaml/ocaml#10925 將
Caml_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/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
這個 PR 移除了已棄用的
--disable-force-safe-string
和DEFAULT_STRING=unsafe
編譯器選項。 -
ocaml/ocaml#10962 在設定中忽略相容的
--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
中剩餘的 TODO現在修復了
runtime/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 Atomic:更新文件並新增機構
由於原子操作現在是原始的,因此移除了
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
來配置 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_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:正確孤立配置統計資料
孤立統計資料
儲存在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/effects
和testsuite/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
無關,而且不會複製呼叫環境。它需要重新命名。建議的名稱包括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 的相依性
已將明確提及
ocaml (>= 4.12.0)
的相依性新增至dune-project
和eio.opam
檔案。
修復
-
ocaml-multicore/eio#173
Buf_read.seq
現在檢查串流是否已繼續已新增針對使用序列兩次或先執行其他剖析操作的錯誤偵測。
-
ocaml-multicore/eio#174 從承諾中移除「已中斷」狀態
現在承諾只是未解析或已解析。
Promise.await
不會引發例外狀況,並且已移除Promise.break
、Promise.broken
和await_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_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.fold
取代Ipaddr.classify
使用
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
會針對 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_main
、eio_luv
和eio_linux
的 odoc已更新
eio_main
、eio_luv
和eio_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.md
和lib_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 所需的失敗建置清單的問題追蹤程式。
已關閉
-
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 文件
已使用 API 文件的連結更新
README.md
。 -
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 為 Multicore 更新
eventlog-tools
為了更新
eventlog-tools
以支援 Multicore OCaml 的進行中工作。 -
ocaml-multicore/tezos#24 測試套件失敗
正在修復執行測試時發生的
Alcotest_engine__Core.Make(P) (M)
錯誤。 -
ocaml-multicore/effects-examples#26 移植至 OCaml 5.00
需要 Rename Effect.{eff=>t} PR,才能在沒有專用 effects 語法的情況下,將
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
已更新在 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-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 輸出中使用特定名稱
custom.json 檔案中指定的
name
現在用於orun.summary.bench
結果檔案中。 -
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 建置狀態更新至 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_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
一個在 UI 中顯示 sandmark-nightly 中使用的 Sandmark 提交版本和分支的 PR。
已關閉
-
ocaml-bench/sandmark-nightly#27 在標準化圖表中包含基準變體資訊
標準化圖表現在包含用於比較的基準變體資訊。
-
ocaml-bench/sandmark-nightly#34 平行基準測試應在
ocaml/ocaml#trunk
上執行CI 平行基準測試執行已切換為在
ocaml/ocaml#trunk
上執行。 -
ocaml-bench/sandmark-nightly#37 循序結果比較已損壞
現在 UI 中會處理 .bench 輸出的 meta 標頭第一行的包含。
-
ocaml-bench/sandmark-nightly#40 首頁中的資訊已過時
首頁現在會正確顯示
stable
和trunk
變體。 -
ocaml-bench/sandmark-nightly#50 索引頁的簡單修復以正確顯示文字
已修復尾隨空白和清單縮排。
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 中的顯示/隱藏繪圖時,圖例現在會使用更多欄,如下所示
-
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#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 顯示行號並允許跳至工作記錄中的特定行
類似 https://127.0.0.1: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 現在包含一個使用
bisect_ppx
的coverage
目標,並產生 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