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 統計欄位

  1. 完成的讀取次數

  2. 合併的讀取次數

  3. 讀取的扇區數量

  4. 讀取所花費的毫秒數

  5. 完成的寫入次數

  6. 合併的寫入次數

  7. 寫入的扇區數量

  8. 寫入所花費的毫秒數

  9. 當前正在進行的 I/O 數量

  10. 執行 I/O 所花費的毫秒數

  11. 執行 I/O 所花費的加權毫秒數

附加計數器

  1. 讀取總耗時(毫秒)

  2. 寫入總耗時(毫秒)

@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