我正在编写网络应用程序从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电源仍可用于处理?
答案 0 :(得分:2)
您的系统有多少CPU核心?你的代码是单线程的吗?它可以最大化单个核心,因此只使用可用CPU的25%。
答案 1 :(得分:2)
使用分析器我能够解决问题。 OpenSSL使用特殊的指令集,这些指令在CPU的特殊部分中执行。显示的CPU使用率很低,但事实上它被占用了加密,因此我的应用程序无法足够快地读取系统缓冲区。
我将解密移到了解决问题的其他线程。现在处理所有加密的线程显示为始终使用0%CPU。