2011-12-08 47 views
3

我正在寫網絡應用程序從UDP套接字讀取數據包,然後使用OpenSSL解密它們。由OpenSSL引起的數據包丟失?奇怪的CPU使用

主要功能如下:使用

receive(){ 
    while(1){ 
     read(udp_sock); 
     decrypt_packet(); 
    } 
} 

計劃,以做工精細,直到我說加密。現在在內核緩衝區和我的應用程序之間丟失了很多數據包(netstat -su-RcvbufErrors:77123並在增長;)。數據包相當大(60K),我試圖在1Gbps以太網上使用它(因此問題在超過100Mbps後開始)

聲音正常 - 解密花費太多時間並且數據包速度過快。問題是 - 發送方和接收方的CPU使用率從未超過30%。

在decrypt_packet()中註釋掉以下語句後問題消失: AES_ctr128_encrypt();

我的問題是 - 是否有可能,OpenSSL正在使用一些指令集,這些指令不在CPU使用中(我使用htop和Gnome系統監視器)?如果不是還有什麼會導致這樣的數據包丟失,CPU功率仍可用於處理?

回答

2

使用事件探查器我能解決這個問題。 OpenSSL使用特殊的一組指令,這些指令在CPU的特殊部分執行。顯示的CPU使用率很低,但實際上它被佔用做加密,所以我的應用程序無法足夠快地讀取系統緩衝區。

我將解密轉移到解決問題的其他線程。現在處理所有加密的線程始終顯示爲使用0%的CPU。

2

你的系統有多少個CPU核心?你的代碼是單線程的嗎?它可能最大化一個核心,因此只能使用25%的可用CPU。

+0

我有2個內核,但是我發佈了每個內核的使用率,所以我的應用程序使用了一個線程的25%的功耗。 – harnen