TIdHTTPServer 缓慢使用所有连接
TIdHTTPServer slowly using all connections
Delphi 10.3.1,印地 10.6.2.5366
我们在 REST 服务中使用 TIdHTTPServer
,我们遇到了 TIdHttpServer
使用所有连接缓慢的问题。 MaxConnections
是 100。
当我们达到 100 个连接时,没有人可以从该服务获得任何响应。
使用 netstat 我们可以看到 IP 和对端端口,在 OnCommandGet
/OnCommandOther
中我们记录 IP 和对端端口,但是 [=36= 的 none ] 与状态 ESTABLISHED 的 netstat 中的 IP/ports 相匹配。
但是当我们也开始在 OnConnect
中记录 IP 和对等端口时,我们可以从 netstat 中看到 IP/ports。
所以现在我们认为我们的一些连接卡在 OnConnect
和 OnCommandGet
/OnCommandOther
之间。
并非我们所有的客户都会遇到此问题,但对于一些客户来说,只需要 2-10 天就可以到达 MaxConnections
。
该服务的客户端是移动设备,所以我们认为这可能与建立连接时的互联网连接质量有关?!
我们可以做些什么来防止这种情况发生吗?
客户端连接时会立即触发 OnConnect
事件,但直到收到完整的 HTTP 请求后才会触发 OnCommand...
事件。但是您肯定能够在 OnCommand...
事件中获得可行的 PeerIP
/PeerPort
值。
如果您的移动设备存在连接稳定性问题,它们可能会异常断开连接,服务器 OS 可能无法及时对此做出反应。这肯定会导致服务器最终以一堆死连接结束,至少在一段时间内是这样。
在 OnConnect
事件中,尝试为 AContext.Connection.ReadTimeout
属性 或 AContext.Binding.SetKeepAliveValues()
方法分配一个合理的 non-infinite 超时,看看是否帮助解决你的问题。
Delphi 10.3.1,印地 10.6.2.5366
我们在 REST 服务中使用 TIdHTTPServer
,我们遇到了 TIdHttpServer
使用所有连接缓慢的问题。 MaxConnections
是 100。
当我们达到 100 个连接时,没有人可以从该服务获得任何响应。
使用 netstat 我们可以看到 IP 和对端端口,在 OnCommandGet
/OnCommandOther
中我们记录 IP 和对端端口,但是 [=36= 的 none ] 与状态 ESTABLISHED 的 netstat 中的 IP/ports 相匹配。
但是当我们也开始在 OnConnect
中记录 IP 和对等端口时,我们可以从 netstat 中看到 IP/ports。
所以现在我们认为我们的一些连接卡在 OnConnect
和 OnCommandGet
/OnCommandOther
之间。
并非我们所有的客户都会遇到此问题,但对于一些客户来说,只需要 2-10 天就可以到达 MaxConnections
。
该服务的客户端是移动设备,所以我们认为这可能与建立连接时的互联网连接质量有关?!
我们可以做些什么来防止这种情况发生吗?
客户端连接时会立即触发 OnConnect
事件,但直到收到完整的 HTTP 请求后才会触发 OnCommand...
事件。但是您肯定能够在 OnCommand...
事件中获得可行的 PeerIP
/PeerPort
值。
如果您的移动设备存在连接稳定性问题,它们可能会异常断开连接,服务器 OS 可能无法及时对此做出反应。这肯定会导致服务器最终以一堆死连接结束,至少在一段时间内是这样。
在 OnConnect
事件中,尝试为 AContext.Connection.ReadTimeout
属性 或 AContext.Binding.SetKeepAliveValues()
方法分配一个合理的 non-infinite 超时,看看是否帮助解决你的问题。