数据库修仙金丹篇十三——缩短tcp超时时间的方法

LINUX socket SIOCOUTQ获取发送队列信息 在某C/S结构程序测试时发现一个问题当无线网络拥塞的时候,无线层丢包很严重,TCP socket可能需要若干秒(worst case n>5)才能发出去。发送方调用write(fd)将报文发送的时候实际上只是写入了内核的write buffer。接收方什么时候能收到报文是个未知数。在某些需要同步状态机的地方,发送方最好能够确认接收方收到报文后再进行下一步动作。C: How to tell t... 阅读详情

缩短tcp超时时间的方法

在tcp链路中,当网络异常时,缩短tcp超时时间一般有如下方法:

  • TCP_USER_TIMEOUT(需要内核2.6.37及其以上版本)
  • SIOCOUTQ
  • tcp_retries2
  • 应用层keepalive

TCP_USER_TIMEOUT

需要内核2.6.37及其以上版本才支持该选项。

TCP_USER_TIMEOUT选项是TCP层的socket选项,选项接受unsigned int类型的值。值为数据包被发送后未接收到ACK确认的最大时长,以毫秒为单位,例如设置为10000时,代表如果发送出去的数据包在十秒内未收到ACK确认,则下一次调用send或者recv,则函数会返回-1,errno设置为ETIMEOUT,代表connection timeout。

unsigned int timeout = 10000;
if (-1 == setsockopt(fd, IPPROTO_TCP, TCP_USER_TIMEOUT, &timeout, sizeof(timeout))) {
    fprintf(stderror, "set TCP_USER_TIMEOUT option error: %s", strerror(errno));
}

SIOCOUTQ

linux提供了ioctl(fd, SIOCOUTQ, &count)方法来查询一个tcp socket的write buffer是否清空。发送方一般可以用这个方法来判断对端是否收到报文。当底层网卡将缓冲区的数据全部发送成功时,获取的count=0.

#include <sys/ioctl.h>
 
#include <linux/sockios.h>
 
int value;
 
ioctl(client_fd,SIOCOUTQ,&value);

tcp_retries2

在丢弃激活(已建立通讯状况)的TCP连接之前﹐需要进行多少次重试。默认值为15,根据RTO的值来决定,相当于13-30分钟(RFC1122规定,必须大于100秒).(这个值根据目前的网络设置,可以适当地改小,我的网络内修改为了5)

int name[] = {CTL_NET, NET_IPV4, NET_IPV4_TCP_RETRIES2};
long value = 0;
size_t size = sizeof(value);
if(!sysctl(name, sizeof(name)/sizeof(name[0]), &value, &size, NULL, 0) {
  value // It contains current value from /proc/sys/net/ipv4/tcp_retries2
}
value = ... // Change value if it needed
if(!sysctl(name, sizeof(name)/sizeof(name[0]), NULL, NULL, &value, size) {
  // Value in /proc/sys/net/ipv4/tcp_retries2 changed successfully
}

tcp_retries2指定的是tcp重传的次数,其超时时间与RTO的计算有关。RTO最小值默认为200ms,最大为120s,在tcp的重传过程中,以200ms为基础,每次重传超时时间翻倍,但最大只能为120s。

在linux中tcp_retries2默认为15,因而其超时时间为:(2^9 -1)*0.2 + (16 - 9) * 120s = 924.6s.

需要特别留意的是tcp_retries2针对的是系统上的所有链路。

应用层keepalive

可以在应用层实现keepalive机制,通过主动发送keepalive报文和设置超时时间来检测链路是否异常。

需修改应用层代码,设计实现keepalive。

reference

  1. https://stackoverflow.com/questions/5907527/application-control-of-tcp-retransmission-on-linux/5907951#5907951
  2. https://blog.youkuaiyun.com/thwack/article/details/79960935
  3. https://developer.aliyun.com/article/840000
setsockopt选项对tcp速度 setsockopt的选项很多,可以配置的层级包括但不限于IP(`IPPROTO_IP`, IPPROTO_IPV6),TCP(`IPPROTO_TCP`),UDP,和套接字本身(`SOL_SOCKET`)。每个`setsockopt`调用都涉及到一个套接字描述符,一个指定网络层的常数(如`IPPROTO_IP`, IPPROTO_TCP, IPPROTO_IPV6, SOL_SOCKET等),一个指定需配置的选项的常数,一个指向配置值的指针,以及那个值的大小。不恰当的设置可能会导致性能下降或网络问题。 阅读详情

相关推荐

Linux:network:tcp: socket option: TCP_USER_TIMEOUT (since Linux 2.6.37);

如果不设置此值,失败的链接一般需要20多分钟才能真正断掉,根据一般WAN的环境而且是默认值的情况下。上图里的138 帧,的出现,并不是因为timerout哪个时间点,而是超时之后,socket依据不存在,而对方发来的包,都会被RESET掉。是无符号整型数据作为参数。如果值大于0,也就是当传输的数据在一定的时间(单位为毫秒)内没有得到回复,就会强制关闭链接,并且返回ETIMEOUT错误给英语。如果是0,就是要系统默认的值。当包发生重传的时候,此值无效,当一个keepalive的探测发出去后,此值也不生效。

mzhan017的博客 1645

TCP用户超时(UTO)

Linux内核提供了可设置的TCP用户超时时长(TCP User Timeout),其控制发送的未确认数据可保持多长时间,之后强制关闭连接。但是,内核不支持RFC5482定义的TCP UTO选项(User Timeout Option),不会将此设置通告给对端,其为本地超时时长。 UTO用户接口 应用层可通过setsockopt选项TCP_USER_TIMEOUT设置超时时长,内核将其保存在ics...

redwingz的博客 4383

基于R语言的DICE模型实践技术应用;预测不同减排路径下的经济增长、碳排放量、气候变化程度以及社会福利变化

DICE模型是一个动态综合气候经济模型,由诺贝尔经济学奖得主William Nordhaus开发,用于评估气候变化对经济的影响以及不同减排政策的经济成本和效益。以下是一个关于DICE模型在气候变化影响评估中的实际应用案例,结合R语言代码进行讲解。

KY_chenzhao的博客 869

TCP KEEP-ALIVE和TCP_USER_TIMEOUT机制

正常通信的情况下,send函数发送成功会返回发送数据的字节数。当有错误发生时,send返回-1,全局变量errno被设置。很多情况下,send返回-1是由于连接被对端关闭(对端发送了RST或者FIN包),这种情况errno会被设置为ECONNRESET(Connection reset by peer)。 可是在对端的网线被拔、网卡被卸载或者禁用的时候,对端没有机会向本地操作系统发送TCP RST或者FIN包来关闭连接。这时候操作系统不会认为对端已经挂了。所以在调用send函数的时候,返回的仍然是我们指定

时有限 3875

Lakes.AERMOD.View.v8.9.0 1CD大气扩散模型软件包

Lakes.AERMOD.View.v8.9.0 1CD大气扩散模型软件包 Lakes Environmental ARTM View v1.4.2 1CD放射物扩散模拟模型 Aermod View是一套完整的、功能强大的大气扩散模型软件包,并将美国EPA指定的大气扩散模型(如下)完美的集成成为一个综合的操作平 台: - AERMOD 电话TEL:18980583122  客服 QQ:11

yyii0000的博客 4001

三维视觉智能焊接系统:免示教技术的工业应用实践

本文深入探讨了三维视觉智能焊接系统中免示教技术的工业应用实践。该系统通过三维视觉相机实时扫描工件,自动识别焊缝并生成轨迹,将产线换型时间从数小时缩短至几分钟,显著提升了生产柔性。文章详细解析了其核心硬件、算法及工厂部署流程,并展望了与数字孪生、工艺智能化融合的未来趋势。

weixin_29091105的博客 432

TCP的定时器系列 — 保活定时器

主要内容:保活定时器的实现,TCP_USER_TIMEOUT选项的实现。 内核版本:3.15.2 我的博客:http://blog.youkuaiyun.com/zhangskd 原理 HTTP有Keepalive功能,TCP也有Keepalive功能,虽然都叫Keepalive,但是它们的目的却是不一样的。 为了说明这一点,先来看下长连接和短连接的定义。 连接的“长短”...

weixin_30553065的博客 625

Zotero+WPS文献引用跳转功能缺失?3分钟教你用VBA宏搞定(附完整代码)

本文针对WPS用户使用Zotero时文献引用无法点击跳转的痛点,提供了一套完整的VBA宏解决方案。通过解析Zotero的域代码,自动在文内引用和文末参考文献之间创建超链接,实现一键跳转,极大提升了学术写作与文献查阅的效率。

weixin_28419039的博客 673

TCP User Timeout (翻译)gRpc deadline 相关

原文 摘要 提供一个选项来设置Linux内核2.6.37及更高版本的TCP套接字选项TCP_USER_TIMEOUT。 背景 TCP_USER_TIMEOUT是一个套接字选项,从内核版本2.6.37开始在Linux上可用。如Linux手册页所述,“此选项将uint作为参数。当该值大于0时,它指定在TCP强制关闭相应的连接并将ETIMEDOUT返回给应用程序之前,传输的数据可能保持未确认的最大时间(毫秒)。如果将选项值指定为0, TCP将使用系统默认设置。" 在编写此提议时, gRPC Core面临着一个问题

ermeiyao11的博客 2129

激光除草技术原理与应用全解析

激光除草技术通过光热、光化学等效应精准破坏杂草组织,核心参数包括功率(20-6000W)、波长(400nm-10.6μm)和脉冲宽度。主要应用于大田作物(如玉米、棉花)、经济作物(烟草、果树)及城市绿化,具有环保(无化学污染)、高效(识别率≥95%)和非接触等优势,但存在设备成本高(20-50万元)、技术门槛高等局限。当前技术融合AI识别、多光谱协同等创新,国产设备如华工智耘已实现95.3%识别精度。虽短期投入较高,但长期可降低30%除草成本,并带来环境效益(每亩减排1.2吨CO₂)

start_up_go的博客 557

redhawk:Low Power Analysis

1.rush current与switch cell 在standby状态下为了控制leakage power我们选择power gating的设计方式,使用power switch cell关闭block/power domain的电源。 power switch的基本介绍可见: 低功耗设计-Power Switch power switch的table中有四种状态,对应block工作、待机和上电,下电。low power analysis主要分析上电的过程。 上电过程可以看做mos电容

m0_61544122的博客 3206

TCP连接超时处理

首先设置socket描述符为非阻塞模式,然后调用connect建立连接,此时连接操作不会立即完成,会返回错误码EINPROGRESS。然后使用select或者epoll来监测socket的写事件,如果超时时间内没有写事件到达,说明连接超时。如果有写事件时,需要获取socket错误码,错误为0时表示连接成功,错误码不为0时表示连接失败。但是对于应用程序来说,这个超时时间太长了,不利于一些业务的处理。比如说我的应用想通过建立TCP连接来判断服务端程序是否在运行,或者网络是否通达,这时我不可能等127秒。

dreamflyly的博客 5073

基于Matlab的深度学习OFDM系统信号检测

在接收端,我们首先去除循环前缀,然后对接收到的信号进行FFT变换和QAM解调。在通信系统中,正交频分复用(Orthogonal Frequency Division Multiplexing,OFDM)是一种常用的调制技术,它可以将高速数据流分成若干个低速子载波进行传输,提高了信道利用率和抗干扰性能。接下来,我们使用训练好的神经网络对QAM调制后的数据进行检测,得到估计的FFT变换结果。深度学习方法可以通过大量的训练数据来学习信号的特征,并具有一定的适应能力,在某些情况下可能能够获得更好的检测性能。

2301_79325657的博客 296

设置TCP_USER_TIMEOUT参数来判断tcp连接是否断开

目录 1. bug描述 2. 问题分析 3. 结论 4. 解决 1. bug描述 前段时间遇到这样的一个问题,openstack一个控制节点宕机后,在宕机后一段时间内创建的虚拟机,一直卡在创建中的状态。有的甚至要等到16分钟之后虚拟机才会切换到下一个状态,创...

a15010608983的博客 3651

【XSRP软件无线电】基于软件无线电平台的FM数字接收系统设计(含有完整工程资料获取链接)

随着无线通信技术的快速发展,软件无线电(Software Defined Radio, SDR)作为一种新兴的无线通信技术,逐渐成为研究和应用的热点。传统的无线接收机通常依赖于专用硬件实现其功能,灵活性和可扩展性有限。相较之下,软件无线电利用软件来实现信号处理和调制解调功能,能够适应多种频率和调制方式,使无线通信系统更加灵活和高效。在FM(频率调制)广播中,数字接收技术的应用不仅提高了信号的抗干扰能力,还能提供更好的音质和更多的附加信息(如广播电台名称、节目内容等)。

嵌入式技术开发 1368

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

TCP 协议(四)重传与超时

本博客从TCP重传、超时、拥塞控制、流量控制等方面进行了深入探讨,以帮助读者更好地理解TCP协议在网络传输过程中如何确保数据的可靠性和高效性。我们详细分析了各种重传原理、触发条件和优化策略,以及超时检测、动态调整和与重传的关系。同时,我们还探讨了拥塞控制与流量控制在调整网络传输速率、协同作用以确保网络稳定性的重要性。在实践中,我们针对不同的网络环境提供了优化策略,并对常见性能问题进行了分析和解决。此外,我们还展望了未来TCP重传与超时的发展趋势,为进一步提高网络性能提供了指导。

cliffordl的专栏 6438

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

如何进行优雅的TCP协议层保活

如何在TCP协议层进行全场景覆盖的保活。

qq_15077485的博客 1223

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

tcp/udp socket 网络通信中超时时间的设置

1.connect函数的超时时间设置只对TCP有效 UDP由于是无连接的connect都会返回success。实测发现 这个值是从0开始的 TCP_SYNCNT 值为2 那么 就是超时时间就是1+2+4 = 7秒。第二种是 默认其为阻塞模式 通过setsockopt 函数设置TCP_SYNCNT 值 头文件如下。表示失败是tcp重连的次数 每次重连时间会翻倍 依次是 1 2 4 8 16 32 64 ....如果是3 就是1+2+4+8 = 15秒。

baoecit的博客 6611

Linux 设置tcp重连时间,死磕生菜 -- lettuce 间歇性发生 RedisCommandTimeoutException 的深层原理及解决方案...

0x00 起源项目的一些微服务集成了 Spring Data Redis,而底层的 Redis 客户端是 lettuce,这也是默认的客户端。微服务在某些环境中运行很正常,但在另一些环境中运行就会间歇性的发生 RedisCommandTimeoutException:有时长时间没人使用(当然也不操作 Redis 了),例如一个晚上没人操作系统,第二天早上使用时就会发生这个异常。而且发生该异常之后,...

weixin_32747681的博客 1927

提升PostgreSQL复制稳定性:CloudNative-PG中TCP_USER_TIMEOUT配置的终极指南

CloudNative-PG是一个Kubernetes operator,它使用原生流复制功能,涵盖了具有主/备架构的PostgreSQL数据库集群的整个生命周期。在数据库高可用架构中,主备之间的复制稳定性直接影响业务连续性,而TCP_USER_TIMEOUT配置正是确保这一稳定性的关键优化项。 ## 📊 为什么TCP_USER_TIMEOUT对PostgreSQL复制至关重要? 在Kube

gitblog_00962的博客 474

setsockopt

在TCP连接中,recv等函数默认为阻塞模式(block),即直到有数据到来之前函数不会返回,而我们有时则需要一种超时机制使其在一定时间后返回而不管是否有数据到来,这里我们就会用到setsockopt()函数:     int  setsockopt(int  s, int level, int optname, void* optval, socklen_t* optlen);     这里我们...

小时候挺菜的博客 1万+

TCP 协议的 time_wait 超时时间

TIME_WAIT状态是 TCP 连接管理中一个关键环节,其超时时间通常是 240 秒。合理的管理和调整可以帮助提高网络应用的性能,尤其是在高负载环境中。

小蜗牛的珍贵百宝箱 2072

TCP连接connect等待时长控制的另一种方法

原文地址:http://blog.youkuaiyun.com/slin000/article/details/3971644 在TCP网络应用开发中,作为客户端的程序经常需要主动连接服务器,这时你就需要建立一个Socket,然后调用connect函数连接到服务器地址。正常情况下,这并没有什么问题,但当服务器主机不存在的时候,connect函数可能会等待一分多钟才能返回。如果在主线程中调用connect函数...

weixin_33924770的博客 645

5.6、TCP超时重传时间的选择

超时重传时间的选择是TCP最复杂的问题之一。

qq_67720621的博客 2238

解决使用lettuce连接Redis超时的问题(tcpUserTimeout 参数失效问题)

lettuce 连接Redis的主从实例,当主节的主机异常下电重启后,由于没有发送RST 包,导致 lettuce 一直在复用之前的TCP链接,然后会出现连接超时的情况。就可以不再等待15分钟。但是由于影响较大,也会影响主机上其他的TCP连接,此方案被排除。的错误,直到约15分钟后,TCP不再重传,断开连接才恢复。,应用日志显示参数不生效,同时验证后确实无效,问题依然存在。),升级 lettuce 的依赖到 6.3.0,同时设置。应用启动不再提示,并且在故障后30s出现重连的日志,说明。

qq_21047625的博客 2740
上一篇: 数据库修仙炼气篇五——pg_walreceiver
下一篇: 数据库修仙炼气篇十二——数据库数据完整性问题(块折断)
我在数据库世界里修仙
博客等级 码龄10年 2844粉丝 61原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我在数据库世界里修仙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值