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