DM 統計資訊¶
裝置對映器支援收集 DM 裝置使用者定義區域上的 I/O 統計資訊。如果未定義區域,則不收集任何統計資訊,因此不會有任何效能影響。目前僅支援基於 bio 的 DM 裝置。
每個使用者定義的區域都指定了起始扇區、長度和步長。將針對指定範圍內的每個步長區域收集單獨的統計資訊。
區域中每個步長區域的 I/O 統計計數器格式與 /sys/block/*/stat 或 /proc/diskstats 相同 (參見:I/O 統計欄位)。但提供了兩個額外的計數器(12 和 13):讀寫總耗時。當使用 histogram 引數時,會報告代表延遲直方圖的第 14 個引數。所有這些計數器都可以透過 dmsetup 向相應的 DM 裝置傳送 @stats_print 訊息來訪問。
報告的時間以毫秒為單位,粒度取決於核心時鐘週期。當使用 precise_timestamps 選項時,報告的時間以納秒為單位。
每個區域都有一個對應的唯一識別符號,我們稱之為 region_id,它在區域建立時分配。查詢區域統計資訊、刪除區域等操作時必須提供 region_id。唯一的 region_id 允許多個使用者空間程式請求和處理同一 DM 裝置的統計資訊,而不會相互干擾資料。
DM 統計資訊的建立將透過 kmalloc 分配記憶體,或回退到使用 vmalloc 空間。DM 統計資訊最多可以分配總系統記憶體的 1/4。管理員可以透過讀取以下檔案檢視記憶體使用情況:
/sys/module/dm_mod/parameters/stats_current_allocated_bytes
訊息¶
- @stats_create <range> <step> [<number_of_optional_arguments> <optional_arguments>...] [<program_id> [<aux_data>]]
建立一個新區域並返回 region_id。
- <range>
- “-”
整個裝置
- “<start_sector>+<length>”
以 <start_sector> 開始,長度為 <length> 個 512 位元組扇區的範圍。
- <step>
- “<area_size>”
該範圍被細分為多個區域,每個區域包含 <area_size> 個扇區。
- “/<number_of_areas>”
該範圍被細分為指定數量的區域。
- <number_of_optional_arguments>
可選引數的數量
- <optional_arguments>
支援以下可選引數
- precise_timestamps
使用納秒解析度的精確計時器,而不是“jiffies”變數。使用此引數時,結果時間以納秒而不是毫秒為單位。精確時間戳的獲取速度比基於 jiffies 的時間戳稍慢。
- histogram:n1,n2,n3,n4,...
收集延遲直方圖。數字 n1、n2 等表示直方圖的邊界時間。如果未使用 precise_timestamps,時間以毫秒為單位,否則以納秒為單位。對於每個範圍,核心將報告在此範圍內完成的請求數量。例如,如果使用“histogram:10,20,30”,核心將報告四個數字 a:b:c:d。a 是完成時間為 0-10 毫秒的請求數量,b 是完成時間為 10-20 毫秒的請求數量,c 是完成時間為 20-30 毫秒的請求數量,d 是完成時間超過 30 毫秒的請求數量。
- <program_id>
一個可選引數。一個唯一標識該範圍的使用者空間所有者的名稱。這會將範圍進行分組,以便使用者空間程式可以識別它們建立的範圍,並忽略其他程式建立的範圍。核心會在 @stats_list 訊息的輸出中返回此字串,但不會將其用於其他任何目的。如果省略可選引數的數量,則 program id 必須不是數字,否則它將被解釋為可選引數的數量。
- <aux_data>
一個可選引數。一個提供對建立該範圍的客戶端程式有用的輔助資料的單詞。核心會在 @stats_list 訊息的輸出中返回此字串,但不會使用此值做任何事情。
- @stats_delete <region_id>
刪除具有指定 ID 的區域。
- <region_id>
從 @stats_create 返回的 region_id
- @stats_clear <region_id>
清除除進行中的 I/O 計數器之外的所有計數器。
- <region_id>
從 @stats_create 返回的 region_id
- @stats_list [<program_id>]
列出所有已透過 @stats_create 註冊的區域。
- <program_id>
一個可選引數。如果指定此引數,則只返回匹配的區域。如果未指定,則返回所有區域。
- 輸出格式
- <region_id>: <start_sector>+<length> <step> <program_id> <aux_data>
precise_timestamps histogram:n1,n2,n3,...
字串“precise_timestamps”和“histogram”僅在建立區域時指定了它們的情況下才會列印。
- @stats_print <region_id> [<starting_line> <number_of_lines>]
列印區域中每個步長區域的計數器。
- <region_id>
從 @stats_create 返回的 region_id
- <starting_line>
輸出中起始行的索引。如果省略,則返回所有行。
- <number_of_lines>
輸出中包含的行數。如果省略,則返回所有行。
區域中每個步長區域的輸出格式
- <start_sector>+<length>
計數器
前 11 個計數器與 /sys/block/*/stat 或 /proc/diskstats 的含義相同。
詳細資訊請參閱I/O 統計欄位。
完成的讀取次數
合併的讀取次數
讀取的扇區數量
讀取所花費的毫秒數
完成的寫入次數
合併的寫入次數
寫入的扇區數量
寫入所花費的毫秒數
當前正在進行的 I/O 數量
執行 I/O 所花費的毫秒數
執行 I/O 所花費的加權毫秒數
附加計數器
讀取總耗時(毫秒)
寫入總耗時(毫秒)
- @stats_print_clear <region_id> [<starting_line> <number_of_lines>]
原子性地列印然後清除除進行中的 I/O 計數器之外的所有計數器。當使用統計資訊的客戶端不想丟失任何統計資訊(即在列印和清除之間更新的統計資訊)時,此功能很有用。
- <region_id>
從 @stats_create 返回的 region_id
- <starting_line>
輸出中起始行的索引。如果省略,則列印並清除所有行。
- <number_of_lines>
要處理的行數。如果省略,則列印並清除所有行。
- @stats_set_aux <region_id> <aux_data>
為指定區域儲存輔助資料 aux_data。
- <region_id>
從 @stats_create 返回的 region_id
- <aux_data>
此字串標識對建立該範圍的客戶端程式有用的資料。核心會在 @stats_list 訊息的輸出中返回此字串,但不會使用此值做任何事情。
示例¶
將 DM 裝置“vol”細分為 100 個部分,並開始收集它們的統計資訊
dmsetup message vol 0 @stats_create - /100
將輔助資料字串設定為“foo bar baz”(每個空格的轉義符也必須轉義,否則 shell 會將其消耗掉)
dmsetup message vol 0 @stats_set_aux 0 foo\\ bar\\ baz
列出統計資訊
dmsetup message vol 0 @stats_list
列印統計資訊
dmsetup message vol 0 @stats_print 0
刪除統計資訊
dmsetup message vol 0 @stats_delete 0