1. bug描述

前段时间遇到这样的一个问题,openstack一个控制节点宕机后,在宕机后一段时间内创建的虚拟机,一直卡在创建中的状态。有的甚至要等到16分钟之后虚拟机才会切换到下一个状态,创建成功。

2. 问题分析

  1. 看现象,像是调度器没有接收到这个创建请求,直到16分钟后,api服务重新发送这个请求,才开始进行处理。
  2. 但是我们配置的各种参数,rpc的超时设置,都没有到16分钟这么久,按理说,应该控制器1宕机后几秒钟,api就应该发现,他连接到的消息队列服务死掉了,应该尝试重新发送。
  3. 仔细观察控制器1宕机后,控制器2上的tcp连接情况,发现控制器2上还是有很多连接到控制器1消息队列服务的连接,并且有未发送的数据包。

3. 结论

  1. 将控制器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
  2. 但是如果在这10秒内,控制器使用长连接往01发消息,那被使用的长连接,就不会触发keepalive的断开,而是会因为发送不成功,不断尝试重新发送,直到连续net.ipv4.tcp_retries2次发送失败后,才放弃发送。

  3. tcp_retries2的值默认是15,15次retry发送大约需要15分钟(取决于当时的网络rto).因为连接数很多,所以几乎一定会出现10秒内有消息发送的情况。

  4. openstack oslo_messaging 2.5.0-1会在消息发送失败后重连,但是在消息发送的这个动作,它没有超时放弃的逻辑。

4. 解决

  1. 由于我们的平台对外隔离,仅仅提供再同一个二层网络内通信,所以在我们的场景下,可以将net.ipv4.tcp_retries2调小,oracle在类似的场景中,建议的值是3。

  2. 将这个值调到3之后,进行测试,发现虚拟机卡在创建中的时间大幅度缩小了,但是仍以分钟计,达不到我们的要求

  3. 在stackoverflow上发现了这样一个问题:keepalive-does-not-work。这个问题里面提到了TCP_USER_TIME_OUT参数,这个参数是tcp链接的参数,用来在3-2中描述的情况下,让tcp不用等到15次重试完成,就断开链接的超时时间,在linux kernel 2.6.37后提供支持。

  4. 在openstack 中搜索TCP_USER_TIME_OUT,发现在这个patch中:patch,openstack添加了对这个参数的支持。

  5. backport相关代码到我们的版本,测试通过

设置TCP_USER_TIMEOUT参数来判断tcp连接是否断开的更多相关文章

  1. TCP连接异常断开检测(转)

    TCP是一种面向连接的协议,连接的建立和断开需要通过收发相应的分节来实现.某些时候,由于网络的故障或是一方主机的突然崩溃而另一方无法检测到,以致始终保持着不存在的连接.下面介绍一种方法来检测这种异常断 ...

  2. (转)TCP连接异常断开检测

    TCP是一种面向连接的协议,连接的建立和断开需要通过收发相应的分节来实现.某些时候,由于网络的故障或是一方主机的突然崩溃而另一方无法检测到,以致始终保持着不存在的连接.下面介绍一种方法来检测这种异常断 ...

  3. 4个实验,彻底搞懂TCP连接的断开

    前言 看到这个标题你可能会说,TCP 连接的建立与断开,这个我熟,不就是三次握手与四次挥手嘛.且慢,脑海中可以先尝试回答这几个问题: 四次挥手是谁发起的? 如果断电/断网了连接会断开吗? 什么情况下没 ...

  4. wireshark抓包分析tcp连接与断开

    其实对于网络通信的学习,最好还是能够自己抓到包详细地一下,不然只单单通过文字和图的描述印象不够深刻.本文通过实际的抓包操作来看一下tcp的连接与断开是怎样的. 首先需要去https://www.wir ...

  5. TCP连接与断开详解(socket通信)

    http://blog.csdn.net/Ctrl_qun/article/details/52518479 一.TCP数据报结构以及三次握手 TCP(Transmission Control Pro ...

  6. 针对TCP连接异常断开的分析

    我们知道,一个基于TCP/IP的客户端-服务器的程序中,正常情况下,我会是启动服务器使其在一个端口上监听请求,等待客户端的连接:通过TCP的三次握手,客户端能够通过socket建立一个到服务器的连接: ...

  7. 【转】TCP连接突然断开的处理方法

    TCP是因特网中的传输层协议,使用三次握手协议建立连接,下面是TCP建立连接的全过程. TCP断开连接的过程:TCP四次挥手. TCP/IP 协议簇分层结构 数据链路层主要负责处理传输媒介等众多的物理 ...

  8. TCP连接与断开

    两台宿主机 一台:作为服务器 另一台:作为客户端 服务器的步骤: 打开[控制面板]----点击[程序]---点击程序和功能中[打开或关闭Windows功能]---点击[Telnet服务器]--点击[确 ...

  9. Tcp连接和断开

    三次握手:客户端为a,服务端为b:开始都是closed状态:a主动打开进入到syn_sent状态,b被动打开进入listen状态:第一次握手,a向b发送SYN=1,seq为x的包,b收到以后进入syn ...

随机推荐

  1. MOOC网视频下载并视频倍速播放,超简单哒,亲测可用,( •̀ ω •́ )y

    由于视频在线播放太卡,想着下载看吧~~可是这个坑爹的网站没有下载按钮,难道就不可以下载视频了吗? 小白不甘心~ 于是动手查了一下,实验很成功,估计如果会爬虫的都不用像我一样一个一个自己去下了,奈何我知 ...

  2. python字符串问题

    相关知识点: 字符串在Python内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unico ...

  3. 企业级Docker私有仓库部署(https)

    部署环境 Centos7.3 x64 docker-ce-17.06.0 docker-compose-1.15.0 Python-2.7.5(系统默认) 部署目标 使用HTTPS协议 支持Clair ...

  4. MongoDB 基本操作学习笔记

    // 查看所有数据库 show dbs // amdin 0.000GB // local 0.000GB // 使用数据库 use admin // switched to db admin // ...

  5. 使用mybatis从mysql里进行模糊查询的编码问题

    关于这个问题,记录下我的解决方法,希望对有同样困惑的朋友,有所帮助. 问题描述: 我在做mybatis从mysql里模糊查询时,如果模糊的关键词是字母的话,可以查出来.如果模糊的关键词是汉字的话,查不 ...

  6. Tomcat学习

    一:项目默认部署路径: eclipse中,默认new一个server,项目默认会部署在:workspace\(工作空间)\.metadata\.plugins\org.eclipse.wst.serv ...

  7. bzoj 4830: [Hnoi2017]抛硬币 [范德蒙德卷积 扩展lucas]

    4830: [Hnoi2017]抛硬币 题意:A投a次硬币,B投b次硬币,a比b正面朝上次数多的方案数,模\(10^k\). \(b \le a \le b+10000 \le 10^{15}, k ...

  8. 【转】如何解决plsql查询oracle数据库语句where条件带有中文无法匹配结果

    一.问题描述 之前使用PLSQL查询oracle数据库可以正常查询统计结果,由于换了个电脑,重新安装之后,同样的sql查询语句同一个数据库,无法正常查询结果,如下图所示 二.解决办法 1. 查询数据当 ...

  9. SDN第二次上机作业

    作业链接 安装floodlight 生成拓扑并连接控制器floodlight,利用控制器floodlight查看图形拓扑 from mininet.topo import Topo class MyT ...

  10. .vue文件在webstorm中es6语法报错解决方法

    1 语法支持es6设置 Preferences > Languages & Frameworks > JavaScript 把 Javascript Language versio ...