基于每个连接的TCP参数调整

时间:2015-07-12 07:37:31

标签: linux performance networking tcp

我在具有高容量/高速互联网连接的Linux服务器上有监听程序,它接受并插入从远程监控站通过GPRS / GSM上传的SQL数据库。

问题是由于这些连接的固有慢速高延迟性质,许多连接超时并且未完全插入SQL数据库。

我无法调整服务器TCP参数,因此可以使这些连接正常工作,因为其他服务器活动会受到影响。

有什么方法可以调整Linux上的网络堆栈,以便高/低延迟连接同样有效?

2 个答案:

答案 0 :(得分:0)

通常,您无法确保已在tcp连接上完成可能失败的事务。在tcp连接中实现此类协议的唯一方法是向commit添加一个简单的命令(一个已确认的命令),并将放在每一批这些命令的末尾(这些命令)可以通过tcp缓冲成组。该命令必须是两个握手命令(commit -> ack),并且如果在收到command消息之前超时,则必须在接收commit时提交所有事务并回滚。移动设备必须考虑在收到ack消息时提交(嗯,您不需要对事务进行编号,因为TCP确保到达顺序和数据包序列)并考虑提交所有已收到ack消息的交易。考虑到tcp执行超时并重新发送,因此您只需为每条消息使用一次发送,并且永远不会重新发送已发送的消息。如果超时,只需将连接断开并重新打开它,考虑到最后一次事务中止。

交易编号可以解释服务器上最后ack的丢失。如果下一个连接上的第一个事务ID与上一个连接的最后一个相同,则可以假设客户端已丢失其上次超时并再次重复上一个事务。在这种情况下,您必须使用ack来回答它,并忽略客户端发出的所有命令(因为它们已经由服务器执行。)

这一切都必须在两个地方(服务器和客户端)正确,并且不要尝试保存某些内容,否则您将丢失数据。

最后要注意的是,你没有像tcp连接的超时那样,你必须在协议内部实现它。 tcp连接可以处于READY状态数周甚至数年,而无需交换单个数据包,只是因为双方都无法相互说话。这有 KEEP_ALIVE 选项,但您只能激活它,您无法修复超时延迟以使其失败。

检测故障的所有协议的一个很好的例子是X协议。这是一个基于事务的协议,其中有客户端发出的命令(有样式,带有响应的命令和不请求这种响应的命令),还有异步事件(来自服务器的信号到客户没有确认或命令请求他们)

在此协议中,您有一个所谓的SYNC命令/服务,允许客户端与服务器同步(当您要确保服务器具有此功能时,您可以使用它到目前为止处理了所有命令)。此外,服务器始终使用最后执行的客户端请求隐式请求ID(针对每个客户端命令递增)发送响应/事件,因此这节省了大量{{ 1}}命令(和往返延迟)到客户端。

答案 1 :(得分:0)

首先,我不得不说我不知道​​如何调整各个TCP连接的参数(如果有人知道某种方式,请分享!)。您可以为单个连接设置套接字选项,但我知道的堆栈设置是全局的,在内核中设置。

其次,我不认为如果客户端是超时的话,服务器调优甚至会有所帮助(我认为是这种情况,因为那不清楚)。假设您调整服务器;您可以增加超时值并添加频繁的Keepalive。如果客户期望在给定时间范围内来自服务器的响应,它会有什么用呢?这是客户端在应用程序级别施加的限制(除非TCP连接本身超时,这是不可能的,因为它们非常强大且默认持久)。