【发布时间】:2015-10-26 19:11:01
【问题描述】:
我们正在使用 LoadRunner 对基于 tcp 的多线程服务器应用程序进行压力测试。最近遇到一个烦人的问题:
客户端在一些周期后收到错误报告 - “10054 - 对等方重置连接”。通过从客户端捕获数据包,我们发现客户端从服务器接收到 RST。
奇怪的是我们没有从服务器端调用任何 close() 或 shutdown()(出于测试目的),客户端仍然收到 RST 数据包和 10054 错误?!!
以下是我抓到的数据包:
- 5395 77.335317000 192.168.11.232 192.168.11.30 TCP 62 27124→10000 [SYN] Seq=0 Win=65535 Len=0 MSS=1460 SACK_PERM=1
- 5656 77.356679000 192.168.11.30 192.168.11.232 TCP 60 10000→27124 [SYN, ACK] Seq=0 Ack=1 Win=14600 Len=0 MSS=1460
- 5657 77.356684000 192.168.11.232 192.168.11.30 TCP 54 27124→10000 [ACK] Seq=1 Ack=1 Win=65535 Len=0
- 5776 77.359276000 192.168.11.232 192.168.11.30 TCP 1514 [重组 PDU 的 TCP 段]
- 5778 77.359286000 192.168.11.232 192.168.11.30 HTTP/XML 332 POST /AddressBookController.php HTTP/1.1
- 5901 77.368227000 192.168.11.30 192.168.11.232 TCP 60 10000→27124 [RST] Seq=1 Win=0 Len=0
这是我的问题,任何帮助将不胜感激!
第一季度。为什么服务器会发送RST给客户端当它甚至没有从服务器端调用任何close()或shutdown()到套接字时?
第二季度。 [重复 Q1,请跳过]当客户端和服务器都没有调用任何 close() 或关闭时,服务器在什么情况下会发送 RST?
第三季度。我可以重新编译内核并在 TCP 堆栈中打印一些日志吗?我想知道它发送RST数据包时发生了什么。
[更新]
将listen(BACKLOG) 从 BackLog=100 增加到 BackLog=1000,将大大减少错误从大约 50/小时到 1~2/10 小时。为什么?
[更新2]
1.这是一个接受soap请求并返回的gSOAP服务器
向客户端发送 1~2 KB 的数据。
2. 我们检查了来自客户端的数据包,没有来自服务器的 FIN 标志,这证明服务器从不调用任何 close() 或
关机()。
3. 我们使用 LoadRunner 做新闻测试,有 400 个用户发出并行的肥皂请求,频率是每人 8 万个请求
小时平均值。
4. Packet 4内容无异常,以下为部分内容
POST /AddressBookController.php HTTP/1.1
Host: 192.168.11.30:10000
User-Agent: gSOAP/2.7
Content-Type: text/xml; charset=utf-8
Content-Length: 1470
Connection: close
Cookie: sessionId=a23b15dcc14bb1d8f9f6bf3c4ed728d90c4c3939143866821152918211
SOAPAction: ""
<?xml version="1.0" encoding="UTF-8"?>
......
【问题讨论】:
-
数据包 4 中有什么?
标签: linux multithreading sockets tcp