OpenSSL导致丢包?奇怪的CPU使用率

时间:2011-12-08 09:57:46

标签: c linux openssl cpu-usage

我正在编写网络应用程序从UDP套接字读取数据包,然后使用OpenSSL解密它们。

主要功能如下:

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 个答案:

答案 0 :(得分:2)

您的系统有多少CPU核心?你的代码是单线程的吗?它可以最大化单个核心,因此只使用可用CPU的25%。

答案 1 :(得分:2)

使用分析器我能够解决问题。 OpenSSL使用特殊的指令集,这些指令在CPU的特殊部分中执行。显示的CPU使用率很低,但事实上它被占用了加密,因此我的应用程序无法足够快地读取系统缓冲区。

我将解密移到了解决问题的其他线程。现在处理所有加密的线程显示为始终使用0%CPU。