首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于每个连接的TCP参数调整

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

Stack Overflow用户
提问于 2015-07-12 15:37:31
回答 2查看 190关注 0票数 0

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

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

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

有没有什么方法可以调优Linux上的网络堆栈,使高/低延迟连接同样工作正常?

EN

回答 2

Stack Overflow用户

发布于 2015-07-13 16:32:57

通常,您无法确保已在可能失败的tcp连接上完成事务。该命令必须是两次握手命令(commit -> ack),并且您必须在收到command时提交所有事务,如果超时,则在收到commit消息之前进行回滚。考虑到tcp会执行超时和重新发送,因此您只需对每条消息使用一次发送,而不会重新发送已经发送的消息。如果超时,只需丢弃连接并重新打开它,考虑到最后一个事务已中止。

事务的编号可以很好地说明服务器上最后一个ack的丢失。如果下一个连接上的第一个事务id与上一个连接的最后一个事务id相同,则可以假定客户端已丢失其上一个超时,并再次重复上一个事务。在这种情况下,您必须使用ack进行应答,并忽略客户端发出的所有命令(因为服务器已经执行了这些命令)。

这对于在两个地方(服务器和客户端)都是正确的是必要的,并且不要试图保存一些东西,否则你会丢失数据。

最后要注意的是,tcp连接没有超时之类的东西,你必须在协议内部实现它。tcp连接可以在几周甚至几年内处于就绪状态,而不交换一个数据包,这只是因为双方之间没有什么可说的。有一个KEEP_ALIVE选项,但你只能激活它,你没有办法修复它失败的超时延迟。

用于检测故障的所有这些协议的一个很好的例子是X协议。

在这个协议中,您有一个所谓的SYNC命令/服务,它允许客户端使与服务器同步(当您想要确保服务器已经处理了到目前为止的所有命令时使用它)。此外,服务器发送的响应/事件总是带有上一次执行的客户端请求的隐式请求id (每个客户端命令都会递增),因此这可以节省大量SYNC命令(和往返延迟)到客户端。

票数 0
EN

Stack Overflow用户

发布于 2015-07-13 17:52:12

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

其次,如果客户端超时,我认为服务器调优甚至没有帮助(我假设是这样的,因为这并不清楚)。假设您调优了服务器;您增加了超时值并添加了频繁的keepalives。如果客户端期望在给定的时间范围内收到来自服务器的响应,这会有什么好处?这是客户端在应用程序级别施加的限制(除非TCP连接本身超时,这是不太可能的,因为它们在默认情况下非常健壮且持续时间很长)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31365534

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档