我们已经从 Linux 上的 openldap 服务器迁移到 Windows 2008 上的 DirX。ldap 服务器和正常搜索请求的行为符合预期。但是,某些应用程序(weblogic 部署的 web 应用程序)遇到了性能问题。
我们跟踪了网络活动,发现当客户端发送“放弃”操作时,ldap 服务器会发送 ACK,其 RTT 约为 0.1 - 0.2 秒。
我们不是 100% 确定,但我们认为这就是性能下降的原因。我们观察到的交互有 270 次放弃,其中 179 个 ACKS 的 RTT 大于 0.2 秒。
我对 TCP 不太熟悉,因此有以下疑问:
- 为响应数据包的接收而发送的 ACK 与接收方处理所发送数据所需的时间无关。这发生在 TCP 级别,甚至在接收方收到传入的有效负载(在我们的例子中是放弃)之前。对吗?
所有其他交互都表明 searchrequest/searchresponse 在有效载荷数据包中具有确认。这是“延迟确认”?它们仅需要大约 0.01 秒,其中包括有效载荷和可能计算。那么为什么要为放弃发送单独的 ACK?或者提出这样的问题:何时发送单独的确认,而不是组合确认+数据?
657 9.2943 ldapserver ldapclient LDAP 170 searchResDone(57) 658 9.2948 ldapclient ldapserver TCP 66 18367 > 389 [ACK] Seq=10007 Ack=19799 Len=0 659 9.2954 ldapclient ldapserver LDAP 1009 searchRequest(134) 660 9.2972 ldapserver ldapclient LDAP 630 searchResEntry(134) 661 9.2973 ldapserver ldapclient LDAP 172 searchResDone(134) Sequence number:45106, len=106 662 9.2978 ldapclient ldapserver LDAP 76 abandonRequest(134) Sequence number: 46818, len=10 663 9.3378 ldapclient ldapserver TCP 66 18368 > 389 [ACK] Seq=46828 Ack=45212 Len=0 (The RTT to ACK the segment was: 0.040492000 seconds) 664 9.5062 ldapserver ldapclient TCP 66 389 > 18368 [ACK] Seq=45212 Ack=46828 Len=0 (The RTT to ACK the segment was: 0.208397000 seconds) 665 9.5068 ldapclient ldapserver LDAP 183 searchRequest(136) 666 9.5229 ldapserver ldapclient LDAP 163 searchResEntry(136) 667 9.5229 ldapserver ldapclient LDAP 170 searchResDone(136)
谢谢,
迈克尔