c++ - openssl:减少内存使用

标签 c++ c memory memory-management openssl

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

目前服务器每个连接使用大约 160-200kbytes 的内存,我们希望减少这种使用。 boost::asio 默认使用 SSL_MODE_RELEASE_BUFFERS 标志,因此基本优化已经完成。使用 ctx->freelist_max_len 似乎没有任何改变。

如何做到这一点?也许我们还有一个额外的“ secret 设置”?也许我们可以安全地禁用一些加密算法以减少内存消耗?

最佳答案

当我查看同一件事时,我在连接了 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 | <other options>);

SSL_set_options(ssl, SSL_OP_NO_COMPRESSION | <other options>);

关于c++ - openssl:减少内存使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18954918/

相关文章:

c++ - 如何在 native 桌面 Windows 应用程序中使用 Direct2D 呈现子窗口?

c++ - 在 C++ 中使用 libtiff 写入图像时出现问题,在 TIFFScanlineSize 中出现整数溢出

c++ - 在接口(interface)不是时标记派生实现 noexcept 的副作用是什么

c - Try_files 如果 nginx 模块返回 ngx_declined

c++ - 是否可以将 "unnamed"变量传递给函数?

无法使用 libtidy 获取 HTML 文本

c - 抽象引脚和端口 - 使用指针

Ubuntu 中的 Java OutofMemory 错误,即使有足够的可用内存

java - Java中32位和64位系统中对象大小的差异

memory - 'time -f "%M "' and ' valgrind --tool=massif' 之间有什么区别?