2011-12-08 15 views
3

私はUDPソケットからパケットを読み込み、OpenSSLを使用してネットワークアプリケーションを解読しています。OpenSSLによるパケット損失?奇妙なCPU使用率

主な機能は次のようになります。私は、暗号化を追加するまで使用

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

プログラムが正常に動作します。カーネルバッファと私のアプリケーション(netstat -su-RcvbufErrors:77123とgrow;)の間には多くのパケットが失われています。パケットはかなり大きく(60K)、1Gbpsイーサネットで使用しようとします(したがって、問題は100Mbpsを超えた後に開始されます)。

通常の復号化には時間がかかり、パケットが速すぎます。問題は、 - CPU使用率が送信者と受信者の両方で30%を超えることはありません。

decrypt_packet()でこの文をコメントアウトすると、問題が解消します。 AES_ctr128_encrypt();

私の質問は、OpenSSLがCPU使用量に含まれない命令セットを使用している可能性があります(私はhtopとGnomeシステムモニタを使用します)。そのようなパケット損失を引き起こす原因が他にない場合は、CPUの処理能力はまだ処理可能ですか?

答えて

2

私はこの問題を解決することができました。 OpenSSLはCPUの特別な部分で実行される特別な命令セットを使用しています。示されたCPU使用率は低かったが、実際には暗号化を行っていたため、アプリケーションがシステムバッファを十分に高速に読み取ることができなかった。

私は問題を解決した他のスレッドに復号化を移動しました。今、すべての暗号化を処理するスレッドは、常に0%のCPUを使用しているように表示されます。

2

システムにはいくつのCPUコアがありますか?あなたのコードはシングルスレッドですか?それは単一のコアを最大にすることができるので、使用可能なCPUのわずか25%しか使用しない可能性があります。

+0

私は2つのコアを持っていますが、コアあたりの使用量を掲載していますので、私のアプリケーションは1つのスレッドの消費電力の25%を使用しています。 – harnen