OpenSSL:减少内存使用

6

你好。我们有一个使用 C++ 编写的服务器,可以接受许多 SSL/TLS 连接;我们使用 boost::asio(因此后端是 openssl)来建立 SSL。

目前每个连接的服务器内存使用量约为 160-200kbytes,我们希望减少这种使用情况。默认情况下,boost::asio 使用 SSL_MODE_RELEASE_BUFFERS 标志进行优化,因此基本优化已完成.. 尝试调整 ctx->freelist_max_len 看起来没有什么变化。

怎么才能做到这一点呢?也许还有其他的“秘密设置”?也许我们可以安全地禁用一些加密算法以减少内存消耗?


你看过内存分配的位置了吗?从你提供的信息来看,可能是任何东西。例如线程开销? - sehe
根据Massif的结果,至少50%的内存是由CRYPTO_malloc分配的,因此空闲连接占用了大量内存,我正在尝试优化这部分。这是一个重要的部分,因为在每个时间点99%的客户端都处于空闲状态。 - Galimov Albert
1
你确定它是每个连接吗?如果 OpenSSL 正常工作,它应该是每个 SSL 会话,这两者并不相同。 - user207421
@EJP 怎样检查我有多少个会话?客户端可以同时与服务器建立几个连接,因此可能会重用会话。 - Galimov Albert
它降低了内存负载。 - user207421
显示剩余2条评论
1个回答

8
当我查看同样的内容时,在1000个客户端连接时,我使用massif对我的应用程序进行了分析。
测试1:不使用SSL。峰值内存使用量为2.871MB。
测试2:使用默认设置的SSL。峰值内存为617.3MB。
测试3:禁用SSL压缩。峰值内存为41.93MB。
测试4:在测试3的基础上启用SSL_MODE_RELEASE_BUFFERS。峰值内存为11.49MB。
这使每个连接的内存占用减少到了11.5kB,当然在您的应用程序中可能会有所不同。
您已经使用了SSL_MODE_RELEASE_BUFFERS,但您还可以考虑禁用压缩。禁用压缩可通过以下方式实现。它需要openssl >= 1.0。
SSL_CTX_set_options(ssl_ctx, SSL_OP_NO_COMPRESSION | <其他选项>);
或者
SSL_set_options(ssl, SSL_OP_NO_COMPRESSION | <其他选项>);

如何检查服务器上的选项和模式是否设置正确? 我尝试使用s_client,可以看到是否启用了压缩,但我没有找到检查SSL_MODE_RELEASE_BUFFERS模式的方式。 - Chetan Kole

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接