模組 Gc.Memprof

module Memprof: sig .. end

Memprof 是一個分析引擎,它會隨機採樣已配置的記憶體字組。每個配置的字組都有一個被採樣的機率,該機率等於可設定的採樣率。一旦區塊被採樣,它就會被追蹤。一個被追蹤的區塊會在它被配置、提升或釋放時觸發一個使用者定義的回呼函式。

由於區塊由多個字組組成,因此一個區塊可能被採樣多次。如果一個區塊被採樣多次,則每個回呼函式會針對該區塊的每個事件被呼叫一次:重複次數在 allocation 結構的 n_samples 欄位中給出。

此引擎可以讓您將低負擔的記憶體分析器實作為 OCaml 函式庫。

注意:此 API 為實驗性質。它可能會在沒有事先通知的情況下變更。


type t 

設定檔的類型

type allocation_source = 
| 一般
| 序列化
| 自訂
type allocation = private {
   n_samples : int; (*

此區塊中的採樣次數(>= 1)。

*)
   size : int; (*

區塊的大小,以字組為單位,不包括標頭。

*)
   source : allocation_source; (*

配置的原因;自 OCaml 5 以來,無法產生 Marshal

*)
   callstack : Printexc.raw_backtrace; (*

配置的呼叫堆疊。

*)
}

與配置相關聯的中繼資料類型。這是傳遞給配置採樣所觸發的回呼函式的記錄類型。

type ('minor, 'major) tracker = {
   alloc_minor : allocation -> 'minor option;
   alloc_major : allocation -> 'major option;
   promote : 'minor -> 'major option;
   dealloc_minor : 'minor -> unit;
   dealloc_major : 'major -> unit;
}

('minor, 'major) tracker 描述 memprof 應如何在其生命週期內追蹤採樣的區塊,為每個區塊保留使用者定義的中繼資料:'minor 是用於保留次要區塊的中繼資料類型,而 'major 是用於主要區塊的中繼資料類型。

tracker 中的成員函式被稱為回呼函式。

如果配置或提升回呼函式引發例外或返回 None,memprof 會停止追蹤相應的區塊。

val null_tracker : ('minor, 'major) tracker

預設回呼函式只返回 None()

val start : sampling_rate:float ->
?callstack_size:int -> ('minor, 'major) tracker -> t

使用給定的參數啟動設定檔。如果目前的網域中已有設定檔正在採樣,則會引發例外。

採樣立即開始。參數 sampling_rate 是每個字組(包括標頭)的採樣率。通常,對於成本較低的回呼函式,1e-4 的速率對效能沒有明顯影響,而 1e-3 會使程式運行速度慢幾個百分比。

參數 callstack_size 是每個採樣記錄的呼叫堆疊長度。預設值為 max_int

參數 tracker 決定如何在次要和主要堆積中追蹤採樣的區塊。

當呼叫回呼函式時,目前執行緒上的採樣會暫時停用,因此如果程式是單執行緒和單網域的,則回呼函式不需要是可重入的。但是,如果使用執行緒或多個網域,則可能會平行運行多個回呼函式。在這種情況下,回呼函式必須是可重入的。

請注意,回呼函式可能會在實際事件發生後稍微延遲。傳遞給配置回呼函式的呼叫堆疊總是準確地反映配置,但是程式狀態可能在配置和呼叫回呼函式之間發生變化。

如果在分析啟用時建立新的執行緒或網域,則子執行緒或網域會加入該設定檔(使用相同的 sampling_ratecallstack_sizetracker 回呼函式)。

配置回呼函式通常由配置區塊的執行緒運行。如果執行緒在呼叫回呼函式之前退出或設定檔停止,則回呼函式可能會由不同的執行緒運行。

每個回呼函式通常由配置區塊的網域運行。如果網域在呼叫回呼函式之前終止或設定檔停止,則回呼函式可能會由不同的網域運行。

不同的網域可能會同時運行不同的設定檔。

val stop : unit -> unit

停止目前設定檔的採樣。如果目前網域中沒有設定檔正在採樣,則會失敗。停止所有共享設定檔的執行緒和網域中的採樣。

在呼叫 stop 之後,設定檔中的回呼函式可能會運行,直到對設定檔應用 discard 為止。

如果所有為其採樣的網域和執行緒都終止,則設定檔會隱式停止(但不會捨棄)。

val discard : t -> unit

捨棄已停止設定檔的所有分析狀態,這會阻止其執行任何更多回呼函式。如果在尚未停止的設定檔上呼叫,則會引發例外。