Linux内核tcp时间测量,linux内核 – 测试linux内核中函数的执行时间
我使用Linux安全模塊掛鉤來添加一些自定義功能到recv()系統調用。與原始的recv()相比,我想測量這個功能的開銷。我寫了一個簡單的tcp服務器,我運行與沒有我的模塊。這個tcp服務器調用recv()函數’N’次。它可以測量每個recv的時間,例如:
clock_gettime(before);
recv()
clock_gettime(after);
global_time += after - before.
最后,我用“global_time / N”打印單個recv()的平均時間。讓我們把這個時間稱為“user_space_avg_recv”。
在我的模塊內,我想放置時間測量功能來計算我的鉤子的確切執行時間。我嘗試了3種方法。
>我用jiffies如下:
sj = jiffies
my_hook();
ej = jiffies;
current-> total_oh = ej – sj;
但是我看到sj和ej值之間沒有差別。因此total_oh不變。
>我使用current_kernel_time(),因為我以為它以納秒為單位返回時間。但是,再一次,前后沒有差別。
我用了get_cycles。當過程退出時,我打印總循環。然而,當我將總周期值轉換為毫秒時,它的出現遠遠大于
“user_space_avg_recv”值。內核中的測量值總是小于從用戶空間測量的時間值,這是沒有意義的。這可能意味著我不是使用正確的API進行測量,或者我將值從周期轉換為毫秒時出錯。
我基本上使用以下公式將周期轉換為毫秒:
avg overhead of my hook in milliseconds =
(((cycles / 2.99) / 10^6) / N)
因為我的時鐘頻率是2.99Ghz
幾點:
>我的用戶空間程序使用set affinity綁定到單個核心。
我正在使用內核2.6.22.14
>要阻止內核在我的鉤子內切換上下文,我使用preempt_disable()和preempt_enable()。因此,它不會計算其他內核線程的執行時間。即使這樣,由于我的鉤子使用一些I / O,我的線程可能會自動釋放控制,或者可能會發生一些可能會增加總循環次數的中斷。
題:
如何在內核中精確地測量功能執行時間?
總結
以上是生活随笔為你收集整理的Linux内核tcp时间测量,linux内核 – 测试linux内核中函数的执行时间的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ehviewer_EhViewer(E绅
- 下一篇: linux脚本变量运算符,linux——