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,以與標準函式庫的其餘部分保持一致。在生態系統中,一些關鍵的支援函式庫(例如 uringmulticore-opamdomainslib)已進行更新以與 5.0.0+主幹一起使用。基於效果的 OCaml 直接樣式並行 IO 的 Eio 進行了重大增強,現在也使用 OCaml 5.00.0+主幹進行建置。Sandmark 基準測試套件現在提供了 5.00.0+stable5.00.0+trunk 的 OCaml 變體,以建置主幹的基準測試。

OCaml 5.00 發布規劃

核心開發團隊目前正在確定將在受支援功能方面構成 OCaml 5.00 發布的確切內容。任何將成為 OCaml 5.00 一部分但目前不受支援的內容都必須在此清單中,以便我們可以規劃其實施。如果您發現下面沒有但應該有的內容,請聯繫我們或回覆。與往常一樣,此清單會隨著核心開發團隊規劃和實施發布而變更。

執行階段

  • 標記堆疊溢位
    • 目前,標記堆疊允許增長到不受限制的大小。在 mc#466 中有一個多核心標記堆疊溢位的實作。此設計很複雜,並且同時觸及主要 GC 邏輯,以確定標記何時完成。有人認為更好的設計是用停止全域機制來處理標記堆疊溢位,但是尚未嘗試過。
  • Statmemprof
  • 使執行階段記憶體模型安全
    • 確保 caml_modify 的實作正確。
    • 修復測試套件上 Thread Sanitizer 回報的警告。
  • 標記預取最佳化
  • 減少虛擬記憶體消耗的次要堆積設計
    • #10955 建議在程式啟動時決定次要區域的大小,而不是現在固定的 256GB 保留。修復 Valgrind 和 AFL(具有預設的有限虛擬記憶體)。
    • 探索次要堆積(DLAB、BiBoP)替代組織的設計是
      1. 由於程式碼變更,現在進行風險太高
      2. 好處尚不清楚。請參閱 mc#508 中的實驗。
  • 使執行階段對於非同步回呼安全
    • 請參閱 #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-safesysthread-safefiber-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#795Minor_heap_maxMax_domains 作為 OCAMLRUNPARAM 選項

    Minor_heap_maxruntime/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 已移除 StreamPervasives 函式庫 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.awkocamltest 可以跳過回報失敗,這需要解決。

  • ocaml/ocaml#10971 限制執行時期保留記憶體量的方法,以便使用 Valgrind 和 AFL

    OCaml 執行時期要保留的虛擬記憶體量可以被限制,這需要設為執行時期的參數。

  • ocaml/ocaml#10974 domain.c:使用原子計數器來產生 domain 的唯一 ID

    需要移除對固定 Max_domains 設定的依賴,以便在程式執行期間動態設定。

改進

  • ocaml-multicore/ocaml-multicore#796 domain 的 Caml_state 不應使用 mmap

    Caml_state 不再位於使用 mmap 配置的次要堆積區域旁邊。目前正在積極處理相關的 PR。

  • ocaml/ocaml#10908 修正在 Windows 上 caml_mem_map 中可能發生的競爭情況

    runtime/platform.c 已更新,以修正在 caml_mem_map 中可能發生的競爭情況,並移除了除錯用的 printf 語句。

  • ocaml/ocaml#10925Caml_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-PR-10964-graph |690x149

已完成

上游

  • ocaml-multicore/ocaml-multicore#822array.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#10879EffectHandlers 模組重新命名為 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()) 就已足夠,因為不再需要 IntLongBool_field 巨集。

  • ocaml-multicore/ocaml-multicore#831 還原對 ocaml_floatarray_blit 的變更

    保留 runtime/array.cocaml_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#351mingw-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_endotherlibs 程式碼中的其他修正,以與主幹更加一致。

  • 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_bucketget_credithuge_fallback_count

    get_bucketget_credithuge_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 vs bytes

    與核心的 IO 操作要求 GC 不能移動緩衝區的位址,這可以使用 Cstruct.t 實現。如果 OCaml 5.00 保證不會移動一般字串,則可以使用 bytes。需要執行效能測量來比較 cstructbytes

  • 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 程式庫一起使用。

雜項

已完成

Eio

已新增
  • ocaml-multicore/eio#120 新增 Fibre.fork_on_acceptNet.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.dumpCancel.dump

    已新增 Switch.dumpCancel.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#135FD.of_unix 新增 ~close_unix 旗標

    使用者現在可以使用 close_unix 旗標處理 FD 的關閉,以便更好地與 API 整合。

  • ocaml-multicore/eio#139 新增用於 Unix 整合的 eio.unix 模組

    新的 eio.unix 模組提供 await_readableawait_writable 函式,並允許 Lwt_eio 與任一後端搭配使用。Eio 需要在瀏覽器和 unikernel 上運作,因此它不能直接依賴 Unix

  • ocaml-multicore/eio#141 lib_eio: 實作 Stream.is_empty

    已在 lib_eio/stream.ml 來源中實作 lengthis_empty 函式。

  • ocaml-multicore/eio#159 新增 Eio.Buf_read

    在 Eio 中新增 Buf_read 提供了一個低階 API 來檢視內部緩衝區,並將位元組標記為已消耗。此外,它現在有一個高階 API 來讀取字元、字串和多行文字。

  • ocaml-multicore/eio#161 將更多函式新增至 Buf_read

    已將函式 peek_charskippairmapbind*><* 新增至 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#137eunix 重新命名為 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#158eio.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.mdlib_ctf/unix/ctf_unix.mlilib_eio_linux/eio_linux.mlilib_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.saveDir.open_outDir.open_inDir.with_lines 的文件。

Multicore 中的平行程式設計

OCaml Uring

Domainslib

Multicore OPAM

  • ocaml-multicore/retro-httpaf-bench#18 將 Eio 基準測試切換為使用更快的輪詢模式

    retro-httpaf 基準測試現在使用最新的 Eio,它增加了對輪詢模式的支援,並使其成為效能最高的基準測試。

Retro-httpaf-bench-PR-18-graph|411x264

基準測試

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 分支的 CI Build 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

進行中

Sandmark-nightly-issue-27-graph|690x278

  • 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 支援使用度量名稱指定階層來覆蓋圖表

    前端現在支援圖表的覆蓋,以進行更好的比較,如下所示

Current-bench-PR-273-graph|690x232

  • ocurrent/current-bench#275 前端修復:顯示警告和舊度量,而不是空白頁面

    如果最新執行仍在執行中、未能完成或已取消,則現在會顯示橘色顯示和先前的基準測試度量結果。

  • ocurrent/current-bench#277 使用彩色圖例顯示覆蓋圖表的最後值

    覆蓋圖表的最新值現在會以彩色圖例顯示,如下所示

Current-bench-PR-277-graph|690x150

  • 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)