我们的业务应用程序的基于Qt的生产服务器存在问题。当总SSL连接随时间增加时,某些客户端根本无法连接。
QSslSocket :: waitForEncrypted()开始失败,没有QSslError,无论设置的超时如何。当这个问题开始出现时,还有大约100个活动连接。
所以有大约170个连接,两次线程,“lsof”提到了1000多个打开的文件(我们不得不增加文件“ulimit”)。
它看起来不像是客户端问题,因为失败和重新连接的IP会随着时间的推移而发生变化(有些“跳跃”会成功,但其他则不会)。
如上所述,这发生在Ubuntu Server(Zentyal 10.04和“vanilla”9.10)中,但不适用于Ubuntu Desktop 9.10。
所有内容都在VMWare ESX 4.1中运行,系统测试时附加了相同的资源。系统负载低于1.0。守护程序以root权限运行。
看起来它是“服务器”/“桌面”内核或其他配置差异的东西,但我无法分辨究竟是什么可以使SSL连接不在握手......在“服务器版本”......
我们正在使用自己编译的Qt 4.5.3。
编辑:毕竟在我试过的任何Linux上都是一样的。感觉它是每个进程的某种插座限制,女巫约1016 - other_opened_files。我会尝试创建一个新的问题。
编辑2:这是选择和FD_SETSIZE限制问题......
答案 0 :(得分:2)
问题在于,Qt使用select(),它受FD_SETSIZE宏限制,用于最大选择的套接字/文件。在编译libQtNetwork和libQtCore之前,我必须在/usr/include/bits/typesizes.h中更改FD_SETSIZE值。