设置TCP_USER_TIMEOUT参数来判断tcp连接是否断开
1. bug描述
前段时间遇到这样的一个问题,openstack一个控制节点宕机后,在宕机后一段时间内创建的虚拟机,一直卡在创建中的状态。有的甚至要等到16分钟之后虚拟机才会切换到下一个状态,创建成功。
2. 问题分析
- 看现象,像是调度器没有接收到这个创建请求,直到16分钟后,api服务重新发送这个请求,才开始进行处理。
- 但是我们配置的各种参数,rpc的超时设置,都没有到16分钟这么久,按理说,应该控制器1宕机后几秒钟,api就应该发现,他连接到的消息队列服务死掉了,应该尝试重新发送。
- 仔细观察控制器1宕机后,控制器2上的tcp连接情况,发现控制器2上还是有很多连接到控制器1消息队列服务的连接,并且有未发送的数据包。
3. 结论
将控制器01的网络中断之后,控制器02上大部分连接到控制器01 rabbitmq的长连接,都会因为10秒(5+1*5) 01内没有keepalive 响应而断开连接
我们的tcp keepalive设置:
net.ipv4.tcp_keepalive_intvl=1
net.ipv4.tcp_keepalive_time=5
net.ipv4.tcp_keepalive_probes=5
net.ipv4.tcp_retries2=15
但是如果在这10秒内,控制器使用长连接往01发消息,那被使用的长连接,就不会触发keepalive的断开,而是会因为发送不成功,不断尝试重新发送,直到连续net.ipv4.tcp_retries2次发送失败后,才放弃发送。
tcp_retries2的值默认是15,15次retry发送大约需要15分钟(取决于当时的网络rto).因为连接数很多,所以几乎一定会出现10秒内有消息发送的情况。
openstack oslo_messaging 2.5.0-1会在消息发送失败后重连,但是在消息发送的这个动作,它没有超时放弃的逻辑。
4. 解决
由于我们的平台对外隔离,仅仅提供再同一个二层网络内通信,所以在我们的场景下,可以将net.ipv4.tcp_retries2调小,oracle在类似的场景中,建议的值是3。
将这个值调到3之后,进行测试,发现虚拟机卡在创建中的时间大幅度缩小了,但是仍以分钟计,达不到我们的要求
在stackoverflow上发现了这样一个问题:keepalive-does-not-work。这个问题里面提到了TCP_USER_TIME_OUT参数,这个参数是tcp链接的参数,用来在3-2中描述的情况下,让tcp不用等到15次重试完成,就断开链接的超时时间,在linux kernel 2.6.37后提供支持。
在openstack 中搜索TCP_USER_TIME_OUT,发现在这个patch中:patch,openstack添加了对这个参数的支持。
backport相关代码到我们的版本,测试通过
设置TCP_USER_TIMEOUT参数来判断tcp连接是否断开的更多相关文章
- TCP连接异常断开检测(转)
TCP是一种面向连接的协议,连接的建立和断开需要通过收发相应的分节来实现.某些时候,由于网络的故障或是一方主机的突然崩溃而另一方无法检测到,以致始终保持着不存在的连接.下面介绍一种方法来检测这种异常断 ...
- (转)TCP连接异常断开检测
TCP是一种面向连接的协议,连接的建立和断开需要通过收发相应的分节来实现.某些时候,由于网络的故障或是一方主机的突然崩溃而另一方无法检测到,以致始终保持着不存在的连接.下面介绍一种方法来检测这种异常断 ...
- 4个实验,彻底搞懂TCP连接的断开
前言 看到这个标题你可能会说,TCP 连接的建立与断开,这个我熟,不就是三次握手与四次挥手嘛.且慢,脑海中可以先尝试回答这几个问题: 四次挥手是谁发起的? 如果断电/断网了连接会断开吗? 什么情况下没 ...
- wireshark抓包分析tcp连接与断开
其实对于网络通信的学习,最好还是能够自己抓到包详细地一下,不然只单单通过文字和图的描述印象不够深刻.本文通过实际的抓包操作来看一下tcp的连接与断开是怎样的. 首先需要去https://www.wir ...
- TCP连接与断开详解(socket通信)
http://blog.csdn.net/Ctrl_qun/article/details/52518479 一.TCP数据报结构以及三次握手 TCP(Transmission Control Pro ...
- 针对TCP连接异常断开的分析
我们知道,一个基于TCP/IP的客户端-服务器的程序中,正常情况下,我会是启动服务器使其在一个端口上监听请求,等待客户端的连接:通过TCP的三次握手,客户端能够通过socket建立一个到服务器的连接: ...
- 【转】TCP连接突然断开的处理方法
TCP是因特网中的传输层协议,使用三次握手协议建立连接,下面是TCP建立连接的全过程. TCP断开连接的过程:TCP四次挥手. TCP/IP 协议簇分层结构 数据链路层主要负责处理传输媒介等众多的物理 ...
- TCP连接与断开
两台宿主机 一台:作为服务器 另一台:作为客户端 服务器的步骤: 打开[控制面板]----点击[程序]---点击程序和功能中[打开或关闭Windows功能]---点击[Telnet服务器]--点击[确 ...
- Tcp连接和断开
三次握手:客户端为a,服务端为b:开始都是closed状态:a主动打开进入到syn_sent状态,b被动打开进入listen状态:第一次握手,a向b发送SYN=1,seq为x的包,b收到以后进入syn ...
随机推荐
- C# WinForm调用UnityWebPlayer Control控件 <学习笔记1>
工具 1.三维场景 Unity 5.0.2f1 2.开发环境Microsoft Visual Studio 2010 3.需要使用的控件 UnityWebPlayer Control 出现的问题及解决 ...
- dfs 与 dijkstra 总结
Dijkstra: //寻求加权图起始点到各个节点的最短路径 for i <- 1:n do distance[i] <- INF; distance[0] <- 0;//起始节点距 ...
- SQL Server判断小数位数
项目中需要写一规则,目的是判断数值的小数位数,可以分为2中情况. 1.直接以小数点为分界点,小数点后的数据表示小数的位数,此种情况比较简单,直接使用CHARINDEX函数就可以搞定 其中CHARIND ...
- C#常见问题总结(二)
1.erp系统可以在具有固定ip的拥有多层服务器的局域网中使用吗?如何使用 解决方法: 把ini.配置文件字符串中的服务器名改成服务器的,把debug文件夹拷到其他机器上就行,服务器上的服务器名是默认 ...
- Android图像处理 - 高斯模糊的原理及实现
欢迎大家前往云+社区,获取更多腾讯海量技术实践干货哦~ 由 天天P图攻城狮 发布在云+社区 作者简介:damonxia(夏正冬),天天P图Android工程师 前言 高斯模糊是图像处理中几乎每个程序员 ...
- getHibernateTemplate() VS getSession()
如题所示,对于这个问题,官网文档已给出答案,详见: /** * Obtain a Hibernate Session, either from the current transaction or * ...
- 测试SM图床
- eclipse CDT unresolved inclusion
原因:c\c++库未设置所导致的 解决办法:1.先配置环境变量:打开window->preference->c\c++bulid->environment->add-> ...
- ionic2+Angular web端 实现微信分享以及如何跳转回分享出去的页面
微信分享,首先参考微信JS-SDK开发文档. step1:在启动文件index.html中引入微信js文件: <script src="http://res.wx.qq.com/ope ...
- 02-Nginx+MySQL+PHP7
[安装Nginx] #先安装如下包 yum install gcc gcc-c++ kernel-devel yum -y install pcre-devel openssl openssl-dev ...