面向 netlink 使用者的通用網路統計¶
統計計數器被分組到結構體中
結構體 |
TLV 型別 |
描述 |
|---|---|---|
gnet_stats_basic |
TCA_STATS_BASIC |
基本統計資訊 |
gnet_stats_rate_est |
TCA_STATS_RATE_EST |
速率估計器 |
gnet_stats_queue |
TCA_STATS_QUEUE |
佇列統計資訊 |
無 |
TCA_STATS_APP |
應用程式特定 |
收集:¶
宣告您需要的統計結構體
struct mystruct {
struct gnet_stats_basic bstats;
struct gnet_stats_queue qstats;
...
};
更新統計資訊,僅在 dequeue() 方法中,(當擁有 qdisc->running 時)
mystruct->tstats.packet++;
mystruct->qstats.backlog += skb->pkt_len;
匯出到使用者空間(轉儲):¶
my_dumping_routine(struct sk_buff *skb, ...)
{
struct gnet_dump dump;
if (gnet_stats_start_copy(skb, TCA_STATS2, &mystruct->lock, &dump,
TCA_PAD) < 0)
goto rtattr_failure;
if (gnet_stats_copy_basic(&dump, &mystruct->bstats) < 0 ||
gnet_stats_copy_queue(&dump, &mystruct->qstats) < 0 ||
gnet_stats_copy_app(&dump, &xstats, sizeof(xstats)) < 0)
goto rtattr_failure;
if (gnet_stats_finish_copy(&dump) < 0)
goto rtattr_failure;
...
}
TCA_STATS/TCA_XSTATS 向後相容性:¶
struct tc_stats 和 xstats 的先前使用者可以透過呼叫相容性包裝器來保持向後相容性,以繼續提供現有的 TLV 型別
my_dumping_routine(struct sk_buff *skb, ...)
{
if (gnet_stats_start_copy_compat(skb, TCA_STATS2, TCA_STATS,
TCA_XSTATS, &mystruct->lock, &dump,
TCA_PAD) < 0)
goto rtattr_failure;
...
}
一個 struct tc_stats 將在 gnet_stats_copy_* 呼叫期間被填充並附加到 skb。 如果呼叫了 gnet_stats_copy_app,則提供 TCA_XSTATS。
鎖定:¶
在寫入之前獲取鎖,並在所有統計資訊都寫入後釋放鎖。 在發生錯誤時總是釋放鎖。 您負責確保鎖已初始化。
速率估計器:¶
準備一個估計器屬性。 最有可能的這將在使用者空間。 這個TLV的值應該包含一個 tc_estimator 結構。 通常,這樣的 TLV 需要 32 位對齊,因此需要適當地設定長度等等。 估計器間隔和 ewma 日誌需要轉換為適當的值。 建議使用 tc_estimator.c::tc_setup_estimator() 作為轉換例程。 它做了一些聰明的事情。 它接受一個以微秒為單位的時間間隔,一個同樣以微秒為單位的時間常數和一個要填充的 struct tc_estimator。 返回的 tc_estimator 可以傳輸到核心。 將這樣的結構以型別為 TCA_RATE 的 TLV 傳輸到核心中的程式碼。
在核心中設定時
確保您首先設定了基本統計資訊和速率統計資訊。
確保您已初始化用於設定此類統計資訊的統計資訊鎖。
現在初始化一個新的估計器
int ret = gen_new_estimator(my_basicstats,my_rate_est_stats, mystats_lock, attr_with_tcestimator_struct); if ret == 0 success else failed
從現在開始,每次轉儲 my_rate_est_stats 時,它都會包含最新的資訊。
完成後,呼叫 gen_kill_estimator(my_basicstats, my_rate_est_stats)。 確保在進行此呼叫時 my_basicstats 和 my_rate_est_stats 仍然有效(即仍然存在)。