设置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 ...
随机推荐
- apache编译安装参数说明
apache编译安装参数说明 ./configure //配置源代码树--prefix=/usr/local/apache2 //体系无关文件的顶级安装目录prefix ,也就apache的安装目录. ...
- 【转】用Linux命令行获取本机外网IP地址
$ curl ifconfig.me $ curl icanhazip.com $ curl ident.me $ curl ipecho.net/plain $ curl whatismyip.ak ...
- iometer测试工具
简介 Iometer 为计算机I/O子系统所作的工作就如同测力计为引擎所作的工作一样:它测定在可控制的负荷下系统的性能.Iometer 以前被称为"伽利略". Iometer 既是 ...
- iozone测试磁盘性能
什么是iozone? iozone是一个文件系统的benchmark工具,可以测试不同的操作系统中文件系统的读写性能. 可以测试 Read, write, re-read,re-write, read ...
- 邮件报警(postfix)
postfix是Wietse Venema在IBM的GPL协议之下开发的MTA(邮件传输代理)软件.postfix是Wietse Venema想要为使用最广泛的sendmail提供替代品的一个尝试.在 ...
- 布隆过滤器(Bloom Filter)详解
直观的说,bloom算法类似一个hash set,用来判断某个元素(key)是否在某个集合中.和一般的hash set不同的是,这个算法无需存储key的值,对于每个key,只需要k个比特位,每个存储一 ...
- Linux CentOS 7 下 JDK 1.7 安装与配置
前言 简单记录一下在CentOS 7中安装配置JDK 1.7的全过程~ 下载 首先是jdk 1.7 64bit & 32bit的下载地址: jdk-7u79-linux-x64.tar.gz ...
- Nmap简单扫描
Nmap所识别的6个端口状态. open(开放的) 应用程序正在该端口接收TCP 连接或者UDP报文.发现这一点常常是端口扫描 的主要目标.安全意识强的人们知道每个开放的端口 都是攻击的入口.攻击者或 ...
- 洛谷 [P2486] 染色
树剖+线段树维护连续相同区间个数 注意什么时候长度要减一 #include <iostream> #include <cstdio> #include <cstdlib& ...
- (python功能定制)复杂的xml文件对比,产生HTML展示区别
功能的设计初衷: 处理复杂的xml对比,屏蔽同节点先后顺序的影响 主要涉及知识点: 1.xml解析 ------- ElementTree库 2.文件比对差别 ------- difflib库 3.获 ...