OCaml 多核心 - 2022 年 1 月
歡迎來到 2022 年 1 月的 多核心 OCaml 月度更新!此更新以及先前的更新已由 @avsm、@ctk21、@kayceesrk 和 @shakthimaan 彙編。
@xavierleroy 在 上游多核心 OCaml PR#10831 上點擊了「合併」,使其同時為新的一年開了一個好頭,並為我們準備好迎接 OCaml 5.00.0 穩定版本發布的艱苦工作!自從合併以來,我們透過錯誤修復、程式碼改進和工具支援,直接在主要的 ocaml 儲存庫中繼續致力於發布。值得注意的是,已經提出了新的 ARM64 後端支援草案 PR。
OCaml 5.0 主幹也刪除了一些已棄用的模組,並將 EffectHandlers
重新命名為 Effect
,以與標準函式庫的其餘部分保持一致。在生態系統中,一些關鍵的支援函式庫(例如 uring
、multicore-opam
和 domainslib
)已進行更新以與 5.0.0+主幹一起使用。基於效果的 OCaml 直接樣式並行 IO 的 Eio 進行了重大增強,現在也使用 OCaml 5.00.0+主幹進行建置。Sandmark 基準測試套件現在提供了 5.00.0+stable
和 5.00.0+trunk
的 OCaml 變體,以建置主幹的基準測試。
OCaml 5.00 發布規劃
核心開發團隊目前正在確定將在受支援功能方面構成 OCaml 5.00 發布的確切內容。任何將成為 OCaml 5.00 一部分但目前不受支援的內容都必須在此清單中,以便我們可以規劃其實施。如果您發現下面沒有但應該有的內容,請聯繫我們或回覆。與往常一樣,此清單會隨著核心開發團隊規劃和實施發布而變更。
執行階段
- 標記堆疊溢位
- 目前,標記堆疊允許增長到不受限制的大小。在 mc#466 中有一個多核心標記堆疊溢位的實作。此設計很複雜,並且同時觸及主要 GC 邏輯,以確定標記何時完成。有人認為更好的設計是用停止全域機制來處理標記堆疊溢位,但是尚未嘗試過。
- Statmemprof
- 使執行階段記憶體模型安全
- 確保
caml_modify
的實作正確。 - 修復測試套件上 Thread Sanitizer 回報的警告。
- 確保
- 標記預取最佳化
- 減少虛擬記憶體消耗的次要堆積設計
- 使執行階段對於非同步回呼安全
- 請參閱 #10915 中關於非同步回呼處理的元問題
- 可能需要變更停止全域機制和主要 GC 邏輯
- 目前沒有提出的計畫或實作。實作將需要大量的測試和基準測試
- 作為 statmemprof 工作的一部分完成可能是有意義的,因為兩者都可能會遇到類似的實作問題
- Eventring 執行階段追蹤事件日誌替換
- 監視和最佳化多核心程式中的 GC 很困難,目前的多核心事件日誌是一個臨時修復
- 在 #10964 中,將 eventring 支援新增至主幹的 PR
- 執行階段是否能夠僅針對 32 位元平台運行位元組碼?
- 循序還是多個網域?
- 移除對
Caml_state
使用 mmap(請參閱 mc#796)
Stdlib
- 完成 Stdlib 稽核 (#10960)
- 4.14 中的網域、互斥鎖、號誌、條件
- 支援網域和相關模組的 systhread 架構實作。互斥鎖、號誌和條件按原樣工作。
- 4.14 幾乎已經凍結;因此,網域的模擬可以透過單獨的相容性函式庫提供。
- API 文件
- 撰寫效果處理常式和網域的 API 文件
- 手冊章節
- 效果處理常式、網域和記憶體模型的新手冊章節
- OCamldoc 執行緒安全性註釋
- 為執行緒安全性引入 OCamldoc 標籤 (#10983)。
domain-safe
、systhread-safe
、fiber-safe
之間的偏序。not-concurrency-safe
作為未經執行緒安全性稽核的 API 函數、模組的預設佔位符。
- 原子陣列
- 原子可變記錄欄位
- 並發安全惰性
- 對網域、systhread 和纖程安全的惰性
後端/中端
- Flambda 支援
- Arm64 支援
- 目前正在主幹上進行處理。
- 目標是 Mac M1 和 AWS Graviton
- 32 位元支援 (
- 僅循序原生後端可以在 x86 上實現。32 位元 ARM 可能可以支援多個網域。是否要將 x86-32 降為僅位元組碼?
- Wasm 現在僅為 32 位元。
- RISC-V、Power、...
- OpenBSD、FreeBSD 已合併。
- #10875 新增 OpenBSD 支援
- Windows 上的 MSVC 支援。
- Framepointer 支援
- 對於基於
perf
的效能基準測試很有用。 - x86 和/或 arm64?
- 對於基於
工具
- 復原
ocamldebug
2021 年 1 月更新
與往常一樣,多核心 OCaml 更新首先列出,然後是生態系統工具更新。最後,列出 Sandmark 基準測試任務供您參考。
多核心 OCaml
進行中
討論
-
ocaml-multicore/ocaml-multicore#750 討論多核心下的 Lazy 設計
多核心 OCaml 下的 Lazy 設計討論,其中涉及循序 Lazy、並發問題、重複計算和記憶體安全。
-
ocaml-multicore/ocaml-multicore#795 將
Minor_heap_max
和Max_domains
作為OCAMLRUNPARAM
選項Minor_heap_max
在runtime/caml/config.h
中定義為 2GB,Max_domains
定義為 128,並且當運行 AFL 和 Valgrind 等工具時,多核心 OCaml 上存在 OOM 問題。OCAMLRUNPARAM
選項可用於將這些參數作為引數傳遞。已在 ocaml/ocaml#10971 中啟動了相同的上游討論。 -
ocaml-multicore/ocaml-multicore#806 統一 GC 中斷和信號觸發機制
信號和 GC 中斷之間的交互需要重新設計,因為它們作為兩個獨立的機制存在。在主幹中與多核心實作並行,非同步動作方面取得了進展。
-
ocaml/ocaml#10861 OCaml 多核心 PR 中的未解決註解
追蹤問題以記錄和記錄多核心 PR 中 5.00 里程碑的未解決註解。
-
ocaml/ocaml#10915 關於多核心中非同步動作處理的元問題
關於統一 GC 中斷和信號觸發機制的討論,以及多核心 OCaml PR#10831 的審查註解。
-
ocaml/ocaml#10930 已移除
Stream
和Pervasives
函式庫 PR#10896 的下游修補程式變更審查 Sandmark 依賴項的建議修補程式變更,用於為 5.00.0+主幹運行並行基準測試。
-
ocaml/ocaml#10960 稽核
stdlib
的可變狀態OCaml 5.00 stdlib 實作應同時具有記憶體和執行緒安全性,並且已建立此問題追蹤器來稽核 stdlib 的可變狀態。
上游
-
ocaml/ocaml#10876 使 Format 緩衝區對多核心更有效率
Format 緩衝區實作需要提高效率。尤其是,當產生第二個網域時,Format 會切換到 stdout/stderr 的緩衝實作,其中寫入僅在刷新時發生。
-
ocaml/ocaml#10953
ocamltest/summarize.awk
未正確回報測試套件運行時的中止失敗如果日誌格式不正確,
summarize.awk
和ocamltest
可以跳過回報失敗,這需要解決。 -
ocaml/ocaml#10971 限制執行時期保留記憶體量的方法,以便使用 Valgrind 和 AFL
OCaml 執行時期要保留的虛擬記憶體量可以被限制,這需要設為執行時期的參數。
-
ocaml/ocaml#10974
domain.c
:使用原子計數器來產生 domain 的唯一 ID需要移除對固定
Max_domains
設定的依賴,以便在程式執行期間動態設定。
改進
-
ocaml-multicore/ocaml-multicore#796 domain 的
Caml_state
不應使用 mmapCaml_state
不再位於使用 mmap 配置的次要堆積區域旁邊。目前正在積極處理相關的 PR。 -
ocaml/ocaml#10908 修正在 Windows 上
caml_mem_map
中可能發生的競爭情況runtime/platform.c
已更新,以修正在caml_mem_map
中可能發生的競爭情況,並移除了除錯用的 printf 語句。 -
ocaml/ocaml#10925 將
Caml_state
的符號重新命名為caml_state
Caml_state
是 Mac OS 中的一個巨集,因此為了避免名稱衝突,已將其重新命名為caml_state
。 -
ocaml/ocaml#10950 使用
malloc
而非mmap
來配置 domain 狀態此 PR 以
malloc
取代不必要的mmap
使用,以簡化Caml_state
的管理。 -
ocaml/ocaml#10965 所有執行時期 hook 的執行緒安全
此 PR 實作了 hook 的執行緒安全性,並還原了 Multicore 中的 GC 計時 hook。
-
ocaml/ocaml#10966 簡化/清理/澄清 Multicore 的審閱
信號/動作的 API 已簡化,
caml_modify
已加入文件說明,並且已移除無用程式碼。 -
ocaml/ocaml#10969 切換為使用
strerror_t
來進行可重入的錯誤字串轉換此 PR 使用
strerror_t
進行字串轉換,因為在存在多個執行緒的情況下,執行時期中的strerror
並非可重入。
ARM64
-
ocaml/ocaml#10943 在 Cmm 和 Mach IR 中引入原子載入
需要增強
Patomic_load
基本型別,以簡化對其他架構的支援。這是 ARM64 支援所必需的。 -
ocaml/ocaml#10972 ARM64 Multicore 支援
已提出一個草稿 PR,實作了讓 ARM64 運作所需的組譯器、程序和發射變更。這些變更已在 MacOS/M1 和 Linux/Graviton2 上進行測試。
度量
-
ocaml/ocaml#10961 處理 GC 統計資料的孤立狀態
在 Multicore 實作中使用
malloc
配置domain_state
會阻止在 domain 終止時釋放Caml_state
,這個問題需要解決。 -
ocaml/ocaml#10964 基於環狀緩衝區的執行時期追蹤 (
eventring
)Eventring 是一個執行時期追蹤系統,旨在持續監控 OCaml 應用程式。下圖顯示如何使用 Eventring 使用 Chrome 的追蹤檢視器記錄執行時期資料。
已完成
上游
-
ocaml-multicore/ocaml-multicore#822 將
array.c
還原到主幹。引入字大小的memmove
。只有在有多個 domain 執行時才會使用字大小的
memmove
,而且array.c
已更新為更接近主幹實作。 -
ocaml-multicore/ocaml-multicore/826 解決
ocaml/ocaml#10831
不必要 diff 審查意見此 PR 根據
ocaml/ocaml#10831
的審查,更新 Multicore OCaml 和主幹之間的差異。 -
ocaml-multicore/ocaml-multicore#827 從主幹重新引入 sigpending 變更
otherlibs/unix/signals.c
檔案已更新,以從主幹引入sigpending
程式碼。 -
ocaml-multicore/ocaml-multicore#833 解決
ocaml/ocaml#10831
審查意見runtime/
程式碼已更新,以解決ocaml/ocaml#10831
的程式碼審查意見和建議。 -
ocaml-multicore/ocaml-multicore#834 更多關於 ocaml-10831 的審查意見變更
此 PR 中已加入來自
ocaml/ocaml#10831
的其他意見回饋。 -
ocaml/ocaml#10831 Multicore OCaml
將 Multicore OCaml 合併到
ocaml/ocaml
的 PR,透過 domain 支援共享記憶體平行處理,以及透過 effect handler 支援並行處理,已合併! -
ocaml/ocaml#10872 變更 domain 執行緒名稱設定,使其更具可攜性和最佳化
caml_thread_setname
已變更為最佳化,並且已加入處理函式 BSD 排列的案例。 -
ocaml/ocaml#10879 將
EffectHandlers
模組重新命名為Effect
為了與
stdlib
的其餘部分保持一致,已將EffectHandlers
模組重新命名為Effect
。 -
ocaml/ocaml#10975 從 #10136 新增遺失的變更,這些變更可能在重新設定基礎時遺失
runtime/io.c
程式碼已使用來自 PR#10831 審查的變更進行更新。
改進
-
ocaml-multicore/ocaml-multicore#830 移除
Int/Long/Bool_field
巨集現在僅使用
Long_val(Field())
就已足夠,因為不再需要Int
、Long
和Bool_field
巨集。 -
ocaml-multicore/ocaml-multicore#831 還原對
ocaml_floatarray_blit
的變更保留
runtime/array.c
中ocaml_floatarray_blit
的變更,以避免破壞 32 位元編譯。 -
ocaml-multicore/ocaml-multicore#836 將僅限位元組碼的啟動程式碼移至
startup_byt.c
startup_byt.c
檔案已更新,以包含來自startup_aux.c
的僅限位元組碼的啟動程式碼。 -
ocaml-multicore/ocaml-multicore#837
mingw-w64
向後移植至 4.12具有重新設定基礎到 4.12+domains+effects 的變更的 ocaml-multicore/ocaml-multicore#351 的
mingw-w64
向後移植。 -
ocaml/ocaml#10742 使用
LXM
虛擬亂數產生器重新實作 Random已實作使用 LXM 系列的
L64X128
變體的新 PRNG 實作,以測試合併的 Multicore OCaml PR。以下顯示在 64 位元上的效能改進,以及在 32 位元平台上不太好的效能下降 (時間單位:秒)x86 64 bits 4.13 LXM 0.30 0.21 bit 0.28 0.20 bits 0.42 0.31 int 0xFFEE 0.71 0.40 int32 0xFFEEDD 0.97 0.32 int64 0xFFEEDDCCAA 0.72 0.31 float 1.0 11.35 0.02 full_init 3 (/100) ARMv7 32 bits 4.13 LXM 1.75 4.84 bit 1.53 2.78 bits 4.63 6.16 int 0xFFEE 5.12 6.89 int32 0xFFEEDD 30.92 20.51 int64 0xFFEEDDCCAA 3.36 8.30 float 1.0 47.40 0.13 full_init 3 (/100)
-
ocaml/ocaml#10880 使用位元向量來記錄擱置的信號
此 PR 使用位元陣列而不是
NSIG
原子 0 或 1 整數的陣列來儲存擱置信號的存在。使用目前主幹的測試套件效能如下
real 14m8.349s
user 20m52.485s
sys 0m46.666s
Event count (approx.): 5024892760014
Overhead Command Shared Object Symbol
16.43% Domain0 ocamlrun [.] caml_check_for_pending_signals
14.16% Domain0 ocamlrun [.] caml_interprete
6.67% Domain1 ocamlrun [.] caml_check_for_pending_signals
...
以下是使用此 PR 的測試套件輸出
real 8m32.072s
user 10m16.386s
sys 0m45.736s
Event count (approx.): 2483613262503
Overhead Command Shared Object Symbol
22.67% Domain0 ocamlrun [.] caml_interprete
4.21% Domain1 ocamlrun [.] caml_interprete
3.20% Domain3 ocamlrun [.] caml_interprete
-
ocaml/ocaml#10887 通用化
Domain.DLS
介面,以分割子 domain 的 PRNG 狀態當衍生 domain 分割 PRNG 狀態時,此 PR 會實作「正確的」PRNG+Domains 語意。
-
ocaml/ocaml#10890 從程式碼和手冊中移除未使用的 OCAMLRUNPARAM 參數
在稽核 OCAMLRUNPARAM 選項後,現在已從程式碼和手冊中移除未使用的參數。
backtrace_enabled: in use cleanup_on_exit: in use eventlog_enabled: in use init_fiber_wsz: in use init_heap_wsz: UNUSED init_heap_chunk_sz: UNUSED init_max_stack_wsz: in use init_custom_major_ratio: in use init_custom_minor_ratio: in use init_custom_minor_max_bsz: in use init_percent_free: in use init_max_percent_free: UNUSED parser_trace: in use init_minor_heap_wsz: in use trace_level: in use verb_gc: in use verify_heap: in use caml_runtime_warnings: in use
-
ocaml/ocaml#10935 使用例外重新實作
Thread.exit
此 PR 通過簡單地引發專用的
Thread.Exit
例外,而不是停止目前執行緒,重新實作了Thread.exit
以更好地管理資源。
修正
-
ocaml-multicore/ocaml-multicore#823 小修正
runtime/
、middle_end
和otherlibs
程式碼中的其他修正,以與主幹更加一致。 -
ocaml-multicore/ocaml-multicore#828 在外部 stat 初始化時將
extern_flags
初始化為 0需要將
extern_flags
初始化為零。否則,後續在reachable_words
中使用它會傳回垃圾值,導致記憶體損毀。 -
ocaml-multicore/ocaml-multicore#829 修復 FreeBSD/OpenBSD/NetBSD 上的 pthread 名稱設定
為了建置 FreeBSD、OpenBSD 和 NetBSD,針對
pthread
命名進行可攜性變更。 -
ocaml/ocaml#10853 修復
Obj.reachable_words
中的崩潰此 PR 中已修復
Obj.reachable_words
中的區段錯誤。序列化作業可能會使extern_flags
設定NO_SHARING
位元,因此現在在呼叫extern_init_position_table
之前會先初始化它。 -
ocaml/ocaml#10873 修復
Filename.check_suffix
;移除重複的,
修復 OCAMLRUNPARAM此 PR 包括針對 OCAMLRUNPARAM 中空的
,
的caml_parse_ocamlrunparam
重複修復,以及來自 Multicore OCaml PR#10831 審查的Filename.check_suffix
更新。 -
ocaml/ocaml#10881 修復 Jenkins 上
mingw-w64
的建置需要
winpthread-1.dll
檔案,因為它會設定建置所需的 PATH。 -
ocaml-multicore/ocaml-multicore#832 修復可存取的字組,第二部分
已更新
Obj.reachable_words
以避免造成區段錯誤。此外,這些變更已與 4.14 分支同步。
測試
-
ocaml/ocaml#10888 重新啟用
afl-instrumentation
測試,在沒有虛擬記憶體限制的情況下執行以子程序執行的
afl-fuzz
測試程式需要超過 50MB 的虛擬記憶體才能進行多核心處理。因此,提供修復程式以移除記憶體限制,並針對 OCaml 5.00.0+trunk 啟用afl-instrumentation
測試。 -
ocaml/ocaml#10918 新增明確的 afl-fuzz 測試
已新增一個沒有超時限制,且基於手冊中 readline 範例的
afl-fuzz
測試。
清理
-
ocaml-multicore/ocaml-multicore#835 移除
get_bucket
、get_credit
和huge_fallback_count
get_bucket
、get_credit
和huge_fallback_count
函式已從stdlib
中移除。 -
ocaml/ocaml#10863 移除
<caml/compatibility.h>
作為已合併的 Multicore OCaml PR#10831 的後續,已移除
caml/compatibility.h
標頭檔。 -
ocaml/ocaml#10973 移除
domain_state
中未使用的gc_regs_slot
gc_regs_slot
未被使用,且在 domain 狀態結構中並非必要。相同的程式碼已從otherlibs/systhreads/st_stubs.c
檔案中移除。
雜項
-
ocaml-multicore/ocaml-multicore#793 基於環形緩衝區的執行時期追蹤 (
eventring
)Eventring
是一個低開銷的執行時期追蹤系統,用於持續監控 OCaml 應用程式。此議題已關閉,以便在ocaml/ocaml
上建立 PR。 -
ocaml-multicore/ocaml-multicore#810 使用 Multicore 和自訂區塊時發生記憶體區段錯誤/未定義行為
記憶體區段錯誤是由 C 程式碼而非 OCaml 程式碼造成的,因此此議題已關閉。
-
ocaml-multicore/ocaml-multicore#816 使用 filter-tree 正規化提交者的電子郵件地址
Multicore OCaml 中提交者之間不一致的名稱和電子郵件地址已使用 filter-tree 修正並合併。
生態系統
進行中
Eio
-
ocaml-multicore/eio#124 決定如何表示路徑名稱
Eio 中的路徑是字串,但是我們需要考慮如何提供 Windows 路徑的支援。
-
ocaml-multicore/eio#125 在 Windows 上測試
Eio 需要支援 Windows,並且必須為此環境設定 CI。
-
ocaml-multicore/eio#126 用於產生子程序的 API
Eio
中需要一種建立和管理子程序的機制,類似於Lwt_process
。此機制必須能使用多個 domain,允許傳遞管道,檢查或報告程序的結束狀態等等。 -
ocaml-multicore/eio#138 將 Eio 的 CTF 追蹤與 OCaml 的追蹤整合
建議的
eventring
取代基於 OCaml CTF 的eventlog
系統,可以讓使用者新增需要儲存的自訂事件。 -
ocaml-multicore/eio#140 決定
cstruct
vsbytes
與核心的 IO 操作要求 GC 不能移動緩衝區的位址,這可以使用
Cstruct.t
實現。如果 OCaml 5.00 保證不會移動一般字串,則可以使用bytes
。需要執行效能測量來比較cstruct
和bytes
。 -
ocaml-multicore/eio#146
lib_eio
: 新增take_all
函式take_all
函式已新增至lib_eio/stream.ml
。 -
ocaml-multicore/eio#155 新增
Eio_unix.FD
已將
FD
模組新增至lib_eio/unix/eio_unix.ml
,以便與Luv.0.5.11
非同步 I/O 程式庫一起使用。
雜項
-
ocaml-multicore/parallel-programming-in-multicore-ocaml#13 設定 CI
使用 GitHub Actions 進行每週 CI 建置將有助於偵測任何建置失敗。
-
ocaml-multicore/tezos#13 合併上游更新
一個用於合併 2022 年 1 月 24 日更新到
4.12.0+domains
分支的議題追蹤器。 -
ocaml-multicore/tezos#24 測試套件失敗
執行測試套件時,已回報
Alcotest_engine__Core.Make(P) (M)
錯誤。 -
ocaml-multicore/effects-examples#26 移植到 OCaml 5.00
一個正在進行的工作,將所有 Effects 範例移植為在沒有專用 effects 語法的情況下使用 OCaml 5.00 執行。
已完成
Eio
已新增
-
ocaml-multicore/eio#120 新增
Fibre.fork_on_accept
和Net.accept
此 PR 將
fork_on_accept
更新為在新 switch 中使用 accept 函式,並將成功結果傳遞到新 fibre 中的處理函式,此 PR 已合併。 -
ocaml-multicore/eio#130 新增 Luv 輪詢函式
已將包裝在 Eio 中的 Luv 輪詢函式新增至
lib_eio_luv/eio_luv.ml
以進行 Lwt 整合。 -
ocaml-multicore/eio#133 新增用於除錯的
Switch.dump
和Cancel.dump
已新增
Switch.dump
和Cancel.dump
函式以用於除錯目的。以下顯示範例輸出Switch 6 (1 extra fibres): on [4] cancelling(Failure("Background switch turned off")) [] cancelling(Failure("Background switch turned off")) [] on (protected) [7]
-
ocaml-multicore/eio#135 為
FD.of_unix
新增~close_unix
旗標使用者現在可以使用
close_unix
旗標處理 FD 的關閉,以便更好地與 API 整合。 -
ocaml-multicore/eio#139 新增用於 Unix 整合的
eio.unix
模組新的
eio.unix
模組提供await_readable
和await_writable
函式,並允許Lwt_eio
與任一後端搭配使用。Eio 需要在瀏覽器和 unikernel 上運作,因此它不能直接依賴Unix
。 -
ocaml-multicore/eio#141
lib_eio
: 實作Stream.is_empty
已在
lib_eio/stream.ml
來源中實作length
和is_empty
函式。 -
ocaml-multicore/eio#159 新增
Eio.Buf_read
在 Eio 中新增
Buf_read
提供了一個低階 API 來檢視內部緩衝區,並將位元組標記為已消耗。此外,它現在有一個高階 API 來讀取字元、字串和多行文字。 -
ocaml-multicore/eio#161 將更多函式新增至
Buf_read
已將函式
peek_char
、skip
、pair
、map
、bind
、*>
和<*
新增至lib_eio/buf_read.ml
以符合 Angstrom API。也新增了使用 crowbar 的額外模糊測試。 -
ocaml-multicore/eio#163 新增
Buf_read.{seq,lines}
和Dir.{load,save}
便利函式已新增
at_end_of_input
函式,並且已將eof
重新命名為end_of_input
以符合 Angstrom API。已新增Buf.read.{seq,lines}
和Dir.{load.save}
便利函式,使其易於載入和儲存檔案,以及逐行讀取檔案。
建置
-
ocaml-multicore/eio#128 依賴
base-domains
opam 儲存庫現在提供
base-domains
套件,將使用此套件,而不是對ocaml.4.12.0+domains
進行硬式編碼明確的依賴關係。 -
ocaml-multicore/eio#137 將
eunix
重新命名為eio.utils
用於建置
Eio
後端的實用模組集合已從enix
重新命名為eio.utils
,因為不需要單獨的 OPAM 套件。 -
ocaml-multicore/eio#147 移除未使用的
bigstringaf
依賴關係不再需要
bigstringaf
依賴關係,因此已將其移除。 -
ocaml-multicore/eio#149 移除對 ppxlib 的依賴關係
lib_ctf/ctf.ml
檔案正在使用 ppxlib,並且相關程式碼已內聯。因此,已移除對ppxlib
的依賴關係,以便為 5.00.0 建置。 -
ocaml-multicore/eio#151 新增對 OCaml 5.00+trunk 的支援
此 PR 更新
eio
以便為 OCaml 5.00.0+trunk 建置,並保持與 4.12+domains 的相容性。 -
ocaml-multicore/eio#157 從 Eio 中移除
Unix
依賴關係為了在 unikernel 或瀏覽器中使用,已從 Eio 中移除對 Unix 的依賴關係。
Eio.Unix_perm.t
取代Unix.file_perm
,而Eio.Net.Ipaddr.t
取代Unix.inet_addr
。
改進
-
ocaml-multicore/eio#156 [eio_linux] 允許在輪詢模式下執行 uring
已新增
polling_timeout
選項,以便在輪詢模式下執行 uring。這樣更快,因為 Linux 可以開始處理請求,而無需等待我們提交它們。 -
ocaml-multicore/eio#158 將
eio.ml
分割成個別模組將
lib_eio/eio.ml
分割成個別模組的程式碼重構。
修正
-
ocaml-multicore/eio#134 簡化並改進錯誤報告
現在已修復取消操作時引發和遺失的錯誤。現在由 switch 處理取消內容。
-
ocaml-multicore/eio#160 修正
Buf_read.take_all
lib_eio/buf_read.ml
中的修正,用於讀取串流中的所有內容,而不僅僅是緩衝區中存在的内容。
測試
-
ocaml-multicore/eio#153 允許使用
Stdenv.fs
讀取絕對路徑可以使用
Stdenv.fs
存取絕對路徑。也已將測試案例新增至此 PR。 -
ocaml-multicore/eio#154 [eio_linux] 避免在
read_into
中複製現在可以使用
readv
實作直接讀取到使用者的緩衝區,以避免使用read_into
進行複製。
文件
-
ocaml-multicore/eio#123 在 README.md 中新增遺失的單字
已更新 README.md 文件,以提供
Switch.run
的上下文。 -
ocaml-multicore/eio#136 新增使用 Promise 的快取 README 範例
已在 README 中包含並行快取範例,示範如何使用 Promise。
-
ocaml-multicore/eio#144 對 README 進行小更新
已更新 README,其中包含有關
Lwt_eio
的資訊,並對Switch
行為進行了小幅修改以進行說明。 -
ocaml-multicore/eio#145 新增 Multicore 指南,說明新的記憶體模型
已新增新的
doc/multicore.md
檔案,其中說明了具有以下主題的記憶體模型1. Introduction 2. Problems with Multicore Programming a. Optimisation 1: Caching b. Optimisation 2: Out-of-Order Execution c. Optimisation 3: Compiler Optimisations d. Optimisation 4: Multiple COres 3. The OCaml Memory Model. 4. Guidelines 5. Further reading
-
ocaml-multicore/eio#152 修正次要文件錯誤
已針對
doc/rationale.md
、lib_ctf/unix/ctf_unix.mli
、lib_eio_linux/eio_linux.mli
和lib_eio_luv/eio_luv.mli
檔案修正dune build @doc
警告。 -
ocaml-multicore/eio#162 使用 MDX 測試 Multicore 指南
已更新 dune 檔案以使用 MDX 測試
multicore.md
文件。 -
ocaml-multicore/eio#164 為新的載入和儲存函數建立文件
README.md 檔案已更新,包含
Dir.save
、Dir.open_out
、Dir.open_in
和Dir.with_lines
的文件。
Multicore 中的平行程式設計
-
ocaml-multicore/parallel-programming-in-multicore-ocaml#11 執行使用
parallel_for
原語的程式時,出現未處理的例外@H-N41K (Hemendra M. Naik) 回報關於
parallel_for
原語的例外問題已透過更新 domainslib.0.4.0 套件修復。 -
ocaml-multicore/parallel-programming-in-multicore-ocaml#12 更新至 domainslib.0.4.0
已修復 domainslib.0.4.0 引入的重大變更,並更新 README.md 以支援 OCaml 5.00。
OCaml Uring
-
ocaml-multicore/ocaml-uring#43 移除
bigstringaf
依賴已移除
bigstringaf
依賴,現在我們使用cstruct
提供的相同函數。 -
ocaml-multicore/ocaml-uring#44 允許以輪詢模式執行
已更新
lib/uring/uring.ml
,現在可以使用polling_timeout
引數以輪詢模式執行。 -
ocaml-multicore/ocaml-uring#45
Cmdliner
僅用於測試cmdliner
依賴僅在測試時需要,已在dune-project
和uring.opam
檔案中更新。
Domainslib
-
ocaml-multicore/domainslib#61 使用 EffectHandlers (Effect) 的新名稱
已更新
lib/task.ml
程式碼,使用Effect
,因為上游 ocaml/ocaml#10879 已將EffectHandlers
模組重新命名為Effect
。 -
ocaml-multicore/domainslib#63 使用主幹 OCaml 執行 CI
已更新 GitHub Actions CI 建置,以使用
ocaml/ocaml
主幹進行建置。
Multicore OPAM
-
ocaml-multicore/retro-httpaf-bench#18 將 Eio 基準測試切換為使用更快的輪詢模式
retro-httpaf 基準測試現在使用最新的 Eio,它增加了對輪詢模式的支援,並使其成為效能最高的基準測試。
-
ocaml-multicore/multicore-opam#61 移除
omake
此 PR 移除了 omake,它僅在 +effects 時需要,並且也移除了在主幹中不存在的
caml_modify_field
。 -
ocaml-multicore/multicore-opam#62 移除
domainslib
已從此儲存庫中移除
Domainslib.0.3.0
,因为它已上游至 opam-repository。 -
ocaml-multicore/multicore-opam#63
base-domains
早已上游至opam-repository
已從
multicore-opam
中移除base-domains
依賴,因为它已上游至 opam 儲存庫。
基準測試
Sandmark
進行中
-
ocaml-bench/sandmark#272 如果機器處於活動狀態,則延遲基準測試執行
需要執行負載平均值檢查,以確保在觸發新的基準測試執行之前,機器上沒有正在執行的活動基準測試作業。
-
ocaml-bench/sandmark#273 僅將 5.00+trunk 用於 OCaml 變體建置
需要更新 Sandmark 中的 OCaml 變體,使其僅包含 5.00.0+trunk 建置。
-
ocaml-bench/sandmark#274 自訂變體支援
允許 Sandmark 基準測試執行用於編譯器開發人員分支的要求。組態應該允許一個指向特定分支的 URL,具有組態選項、執行階段參數、變體名稱和 Sandmark 夜間執行應發生的截止日期。例如
[ { "url" : "https://github.com/ocaml-multicore/ocaml-multicore/archive/parallel_minor_gc.tar.gz", "configure" : "-q", "runparams" : "v=0x400", "name": "5.00+trunk+kc+pr23423", "expiry": "YYYY-MM-DD"}, ...]
-
ocaml-bench/sandmark#275 從 drone CI 移至 GitHub actions
目前 .drone.yml CI 需要替換為使用 GitHub Actions 的建置。
已完成
-
ocaml-bench/sandmark#268 更新 README CI 建置狀態至 main 分支
已更新 Sandmark 中
main
分支的 CIBuild Status
以指向 main 分支。 -
ocaml-bench/sandmark#270 更新至 5.00.0+domains
已更新在 Sandmark master 分支中建置的依賴項和執行 5.00.0+domains 變體的基準測試。
-
ocaml-bench/sandmark#271 將 ocaml-variants 資訊參數化為 Docker 環境變數
已在 Sandmark Makefile 中參數化下列變數,以用作環境變數來支援
Custom Variant Support
功能請求SANDMARK_DUNE_VERSION SANDMARK_URL SANDMARK_REMOVE_PACKAGES SANDMARK_OVERRIDE_PACKAGES
-
ocaml-bench/sandmark#276 使用 CI failure:ignore 選項重新加入 5.00.0+trunk
已更新 .drone.yml CI 以忽略 5.00.0+trunk 的失敗建置,以便我們在 5.00.0+stable Sandmark 建置良好時,可以繼續合併變更。
-
ocaml-bench/sandmark#277 從 master 分支同步並更新 README
Sandmark master 分支的 README 變更已與 main 分支同步,因為我們很快會將 main 分支切換為 Sandmark 中的預設分支。
Sandmark-nightly
進行中
-
ocaml-bench/sandmark-nightly#26 更新 nightly 腳本
此 PR 更新了
nightly/
資料夾中的腳本,以在 Turing 和 Navajo 伺服器上執行 5.00.0 變體。 -
ocaml-bench/sandmark-nightly#27 在標準化圖表中包含基準變體資訊
標準化圖表必須包含用於比較的基準變體資訊。
-
ocaml-bench/sandmark-nightly#32 支援來自私人 GitHub 儲存庫的自訂變體
Sandmark 夜間執行應該允許從 GitHub 儲存庫建置自訂開發人員分支變體。
-
ocaml-bench/sandmark-nightly#33 圖表固定連結
在儀表板 UI 中提供選定選項和圖表的固定連結,方便使用者之間分享。
-
ocaml-bench/sandmark-nightly#34 應該在 ocaml/ocaml#trunk 上執行平行基準測試
平行基準測試執行也應該在
ocaml/ocaml#trunk
上執行,因為現在 Multicore OCaml PR 已合併。 -
ocaml-bench/sandmark-nightly#36 向 Sandmark nightly 新增自訂執行
需要向 Sandmark nightly 新增一個具有組態選項
--enable-mmap-stack
和--disable-mmap-stack
的自訂變體執行。 -
ocaml-bench/sandmark-nightly#37 循序結果比較損壞
在 UI 中選擇循序結果比較時會顯示 TypeError,需要修復此問題。
-
ocaml-bench/sandmark-nightly#38 標準化圖表的基準缺少條目
所有變體及其提交都需要在標準化圖表的下拉式選單中顯示。
-
ocaml-bench/sandmark-nightly#40 登陸頁面中的資訊已過時
Sandmark nightly 登陸頁面中變體列表的資訊需要與最新結果同步。
已完成
-
ocaml-bench/sandmark-nightly#24 使用 ocurrent-deployer 執行 git clone
已更新 Dockerfile 以使用
ocurrent-deployer
而不是ocaml-bench/sandmark-nightly
執行 git clone。 -
ocaml-bench/sandmark-nightly#28 將平行基準測試中的預設變體數量設為 1
已將平行基準測試的預設變體數量從兩個切換為一個。
-
ocaml-bench/sandmark-nightly#30 為 Sandmark Nightly 新增登陸頁面
已為 Sandmark Nightly 建立
index.py
登陸頁面,其中包含有關如何執行基準測試以及機器詳細資訊的資訊。 -
ocaml-bench/sandmark-nightly#31 為檢測基準測試新增封存訊息
一則訊息通知最終使用者,檢測到的 pausetimes 基準測試未針對最新的 5.00.0 OCaml 變體進行更新。
-
ocaml-bench/sandmark-nightly#35 更新圖示和標題
標題和網站圖示預設為 Streamlit 標誌,現在已更新為
Sandmark Nightly
。 -
ocaml-bench/sandmark-nightly#39 無法在 sandmark.ocamllabs.io 上看到平行結果
UI 中的 hotfix 可以正確顯示在 UI 中對應到單一提交的多個變體的平行基準測試。
current-bench
進行中
-
ocurrent/current-bench#282 用於堆疊部署的 Docker compose
已新增
docker-compose.yaml
檔案以部署後端管線和前端堆疊。 -
ocurrent/current-bench#292 為 API 請求傳回更好的 HTTP 錯誤碼
此 PR 新增例外,以便為用戶端 API 請求傳回正確的 HTTP 錯誤碼。
-
ocurrent/current-bench#293 透過從連結文字中移除日誌 ID,使日誌連結更明顯
執行日誌中的日誌 UUID 現在已替換為連結,以提高清晰度。
已完成
修復
-
ocurrent/current-bench#272 計算平均值時忽略 NaN
計算平均值時不應包含 NaN 條目,並已在
LineGraph.res
中更新。 -
ocurrent/current-bench#276 生產修復:驗證 graphql URL 的環境
已更新
scripts/validate-env.sh
腳本以驗證路徑/_hasura/v1/graphql
。 -
ocurrent/current-bench#278 生產修復
對於在 Docker 內運行的前端 Nginx,使用連接埠
8082
而不是連接埠 80。 -
ocurrent/current-bench#284 處理多個基準測試資料的一些修復
在處理多個基準測試的資料時,現在支援命名基準測試的列表。基準測試選單現在僅針對未命名的基準測試隱藏。
-
ocurrent/current-bench#289 修復缺少提取請求編號的 URL
在發出重新導向以新增工作者或 Docker 映像時,提取請求編號遺失,此問題已修復。
前端
-
ocurrent/current-bench#268 修復前端:將工作者和 Docker 映像新增至 URL
工作者和 Docker 映像未反映在 URL 中,現在已包含。
-
ocurrent/current-bench#273 支援使用度量名稱指定階層來覆蓋圖表
前端現在支援圖表的覆蓋,以進行更好的比較,如下所示
-
ocurrent/current-bench#275 前端修復:顯示警告和舊度量,而不是空白頁面
如果最新執行仍在執行中、未能完成或已取消,則現在會顯示橘色顯示和先前的基準測試度量結果。
-
ocurrent/current-bench#277 使用彩色圖例顯示覆蓋圖表的最後值
覆蓋圖表的最新值現在會以彩色圖例顯示,如下所示
-
ocurrent/current-bench#288 Nginx 前端:修復包含斜線的 URL
修復了生產部署中的一個錯誤,該錯誤導致
/
產生 404 找不到錯誤。
監控
-
ocurrent/current-bench#270 基本 Prometheus 和 Alertmanager 設定
已建立 Prometheus 整合設定和組態,以用於 current-bench 部署。
-
ocurrent/current-bench#271 當主機磁碟空間不足時新增 Prometheus 警報
已新增一個警報,當 current-bench 主機的磁碟容量達到 90% 時會觸發。
-
ocurrent/current-bench#274 修復 alertmanager 警報 URL
alertmanager URL 現在已更新為指向 autumn.ocamllabs.io。
-
ocurrent/current-bench#283 從管道伺服器抓取指標
Prometheus 組態已更新,以取得 OCaml GC 指標、GitHub webhook 和快取統計資料。
雜項
-
ocurrent/current-bench#281 文件說明如何新增新的 worker
HACKING.md
已更新,其中包含有關將新 worker 新增至叢集的說明文件。 -
ocurrent/current-bench#287 用於擷取基準測試結果的 HTTP API 端點
可以使用新的 HTTP API 端點將基準測試結果新增至資料庫,而無需實際使用
current-bench
前端。例如curl -X POST -H 'Authorization: Bearer <token>' <scheme>://<host>/benchmarks/metrics --data-raw ' { "repo_owner": "ocurrent", "repo_name": "current-bench", "commit": "c66a02ea54430d99b3fefbeba4941921501796ef", "pull_number": 286, "run_at": "2022-01-28 12:42:02+05:30", "duration": "12.45", "benchmarks": [ { "name": "benchmark-1", "results": [ { "name": "test-1", "metrics": [ { "name": "time", "value": 18, "units": "sec" } ] } ] }, { "name": "benchmark-2", "results": [ { "name": "test-1", "metrics": [ { "name": "space", "value": 18, "units": "mb" } ] } ] } ] } '
我們衷心感謝社群中所有 OCaml 使用者、開發人員和貢獻者對專案的持續支持。請注意安全!
縮寫
- AFL:美國模糊測試器 (American Fuzzy Lop)
- API:應用程式程式設計介面 (Application Programming Interface)
- ARM:進階 RISC 機器 (Advanced RISC Machines)
- AWK:Aho Weinberger Kernighan
- BSD:柏克萊軟體發行版 (Berkeley Software Distribution)
- CI:持續整合 (Continuous Integration)
- CTF:通用追蹤格式 (Common Trace Format)
- DLS:網域本地儲存 (Domain Local Storage)
- FD:檔案描述符 (File Descriptor)
- GB:Gigabyte
- GC:垃圾收集器 (Garbage Collector)
- HTTP:超文本傳輸協定 (Hypertext Transfer Protocol)
- IO:輸入/輸出 (Input/Output)
- IR:中繼表示法 (Intermediate Representation)
- MD:Markdown
- OOM:記憶體不足 (Out of Memory)
- OPAM:OCaml 套件管理器 (OCaml Package Manager)
- OS:作業系統 (Operating System)
- PR:提取請求 (Pull Request)
- PRNG:偽隨機數產生器 (Pseudo-Random Number Generator)
- UI:使用者介面 (User Interface)
- URL:統一資源定位器 (Uniform Resource Locator)