【问题标题】:QWebSocketServer - not releasing memoryQWebSocketServer - 不释放内存
【发布时间】:2016-09-14 18:33:31
【问题描述】:

首先,我在我的安全 websocket 服务器应用程序上运行 valgrind 并发现了一个问题(在 Qt Memcheck 中,我必须检查 "External Errors" 才能看到它) - 某些字节 肯定丢失了 - 指向我的main,就在我的QCoreApplication::exec() 呼叫所在的位置。在堆栈跟踪中,在调用之后,只有一些 Qt 库,以libQt5Core 开头,以libQt5WebSockets 结尾。丢失的字节数随着建立的连接数而增加。我仔细检查了我删除了QWebSocketServer::nextPendingConnection() 返回的所有QWebSocket 实例。我也删除了QWebSocketServer 实例。有趣的是,valgrind 在运行 sslechoserver 演示或在不安全模式(无 SSL)下运行我的服务器时不会报告任何错误。我不知道这是否是一个实际问题。

其次,更重要的是,我观察到消耗的内存随着每个新连接而不断增加(即使旧连接已关闭并且它们的 QWebSocket 实例已被删除,实际上大多数时候有 0 或 1 个活动连接)在我的应用程序和 sslechoserver 演示中。我在 Ubuntu 上使用 systemmonitor 并在 Windows 上使用 Windows 任务管理器 进行观察。建立数万次连接后,报告的内存使用量为数十兆字节,而在应用程序生命周期开始时约为 1.5 MB。

我使用 Qt 5.5.1 和 5.6.0(Ubuntu 上的 GCC,Windows 上的 MSVC)对其进行了测试。

我有什么问题吗? Qt 的 websocket 中是否存在错误? sslechoserver 演示不正确吗?


更新:我也尝试了 echoserver 演示(没有 SSL),消耗的内存也在不断增加。


更新 2: 我们得出结论,Qt 中一定存在错误。错误报告在这里: https://bugreports.qt.io/browse/QTBUG-53503

【问题讨论】:

  • 这个问题有更新吗?这还在发生吗?顺便说一句,我也很想知道 Qt Web/TCP 服务器可以处理多少个同时连接。它可以扩展到百万吗?

标签: c++ qt memory-leaks websocket


【解决方案1】:

更新:我怀疑底层QTcpSocket 必须由用户管理。但是,从 Qt 5+ 开始似乎不是这样。请参考:Is the QTcpSocket (or QSslSocket) which underlies a QWebSocket -- destroyed by itself when a socket error happens?.
答案的错误部分在下方被删除。


当我们使用QWebSocketServer::handleConnection() 方法将QTcpSocket 升级到QWebSocket 时,两个套接字在不同的内存地址上保持活动状态!

换句话说,QWebSocket 充当包装器,所有套接字通信都通过底层的QTcpSocket 进行。 所以我们每管理 1 个 Web 套接字,就会多出 1 个隐藏的 TCP 套接字。

当两个套接字要被销毁时,应该使用deleteLater() 机制来处理它们。
这种情况至少对于 TCP 到 Web 的升级是正确的。

【讨论】:

    猜你喜欢
    • 2017-06-29
    • 2011-06-30
    • 2015-08-19
    • 2012-05-15
    • 2018-01-26
    • 2011-09-30
    • 2012-03-18
    • 2011-08-10
    • 2020-09-17
    相关资源
    最近更新 更多