module Memprof:sig
..end
Memprof
是一個分析引擎,它會隨機採樣已配置的記憶體字組。每個配置的字組都有一個被採樣的機率,該機率等於可設定的採樣率。一旦區塊被採樣,它就會被追蹤。一個被追蹤的區塊會在它被配置、提升或釋放時觸發一個使用者定義的回呼函式。
由於區塊由多個字組組成,因此一個區塊可能被採樣多次。如果一個區塊被採樣多次,則每個回呼函式會針對該區塊的每個事件被呼叫一次:重複次數在 allocation
結構的 n_samples
欄位中給出。
此引擎可以讓您將低負擔的記憶體分析器實作為 OCaml 函式庫。
注意:此 API 為實驗性質。它可能會在沒有事先通知的情況下變更。
type
t
設定檔的類型
type
allocation_source =
| |
一般 |
| |
序列化 |
| |
自訂 |
type
allocation = private {
|
n_samples : |
(* | 此區塊中的採樣次數(>= 1)。 | *) |
|
size : |
(* | 區塊的大小,以字組為單位,不包括標頭。 | *) |
|
source : |
(* | 配置的原因;自 OCaml 5 以來,無法產生 | *) |
|
callstack : |
(* | 配置的呼叫堆疊。 | *) |
}
與配置相關聯的中繼資料類型。這是傳遞給配置採樣所觸發的回呼函式的記錄類型。
type ('minor, 'major)
tracker = {
|
alloc_minor : |
|
alloc_major : |
|
promote : |
|
dealloc_minor : |
|
dealloc_major : |
}
('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_rate
、callstack_size
和 tracker
回呼函式)。
配置回呼函式通常由配置區塊的執行緒運行。如果執行緒在呼叫回呼函式之前退出或設定檔停止,則回呼函式可能會由不同的執行緒運行。
每個回呼函式通常由配置區塊的網域運行。如果網域在呼叫回呼函式之前終止或設定檔停止,則回呼函式可能會由不同的網域運行。
不同的網域可能會同時運行不同的設定檔。
val stop : unit -> unit
停止目前設定檔的採樣。如果目前網域中沒有設定檔正在採樣,則會失敗。停止所有共享設定檔的執行緒和網域中的採樣。
在呼叫 stop
之後,設定檔中的回呼函式可能會運行,直到對設定檔應用 discard
為止。
如果所有為其採樣的網域和執行緒都終止,則設定檔會隱式停止(但不會捨棄)。
val discard : t -> unit
捨棄已停止設定檔的所有分析狀態,這會阻止其執行任何更多回呼函式。如果在尚未停止的設定檔上呼叫,則會引發例外。