MySQL客户端/服务器:带ACK标志但不带PSH的TCP响应数据包
我有一个Linux二进制应用程序,它建立了两个到本地MySQL服务器的持久连接(使用127.0.0.1作为主机名) 每15分钟,这样的应用程序必须执行2000个单行MySQL客户端/服务器:带ACK标志但不带PSH的TCP响应数据包,mysql,linux,networking,tcp,protocols,Mysql,Linux,Networking,Tcp,Protocols,我有一个Linux二进制应用程序,它建立了两个到本地MySQL服务器的持久连接(使用127.0.0.1作为主机名) 每15分钟,这样的应用程序必须执行2000个单行inserts(请不要质疑数据库设计),但在将第n个insert语句发送到MySQL之后,在某一点连接B“挂起”近20秒;通过wireshark查看tcp转储,结果发现在这种上下文中,MySQL使用一个简单的ACK数据包进行响应,没有任何MySQL协议特定的部分,但实际上没有PSH标志,因此不能将其识别为正确的MySQL“respon
insert
s(请不要质疑数据库设计),但在将第n个insert
语句发送到MySQL之后,在某一点连接B“挂起”近20秒;通过wireshark查看tcp转储,结果发现在这种上下文中,MySQL使用一个简单的ACK数据包进行响应,没有任何MySQL协议特定的部分,但实际上没有PSH标志,因此不能将其识别为正确的MySQL“response OK”消息
请说明为什么MySQL服务器使用不带PSH标志的简单ACK TCP数据包响应请求查询数据包?TCP ACK位于TCP级别,而不是应用程序(MySQL协议)级别 TCP堆栈ACK是您发送的数据。这意味着它已成功接收数据,并可能将数据传递给用户(在您的示例中是mysql服务器)
因此,MySQL服务器正忙于执行您的查询,当执行完查询(在您的情况下,由于某种原因需要20秒)时,它将返回一个应用程序响应(您正在寻找的MySQL“response OK”消息)-可能存在I/O争用,可能其他长时间运行的查询持有锁,或者由于您的查询需要做一些其他繁重的工作。PSH标志基本上没有意义,而且在任何情况下都完全由TCP堆栈管理:与MySQL无关。