记一次Time-Wait导致的问题

  去年(2014年)公司决定服务框架改用Finagle(后续文章详细介绍),but 公司业务系统大部分是C#写的,然后 finagle只提供了 scala/java 的Client 于是 只能自己动手丰衣足食了,项目中使用了 zookpeerClient+ThriftClient 然后自己封装了 client loadBlance 部分 和 failover 部分.

  使用场景:web服务器 (window iis 挂载 mvc4的网站,mvc4中使用封装的Client)访问 finagle服务器(linux集群)

  现象:web服务大量的通讯端口time-wait 使用导致web用户无法访问(端口不够)

  分析: time-wait 产生原因是 tcp短链接时 主动关闭的一方 ,然后看下封装的finagle client中的thrift client 底层使用tcpclient 然后每次 都是 open close 导致整个问题。

  解决:1:window服务器修改 time-wait 时间 but 不靠谱 (万一以后新部署的服务器忘了修改怎么办)

     2: 修改client 改后pool 模式 正好 最近阅读 redis client 有感觉 https://github.com/ServiceStack/ServiceStack.Redis

  补充:根据TCP协议定义的3次握手断开连接规定,发起socket主动关闭的一方 socket将进入TIME_WAIT状态,TIME_WAIT状态将持续2个MSL(Max Segment Lifetime),在Windows下默认为4分钟,即240秒,TIME_WAIT状态下的socket不能被回收使用. 具体现象是对于一个处理大量短连接的服务器,如果是由服务器主动关闭客户端的连接,将导致服务器端存在大量的处于TIME_WAIT状态的socket, 甚至比处于Established状态下的socket多的多,严重影响服务器的处理能力,甚至耗尽可用的socket,停止服务. TIME_WAIT是TCP协议用以保证被重新分配的socket不会受到之前残留的延迟重发报文影响的机制,是必要的逻辑保证

  补充2:linux服务器 也会存在问题,很多人通过修改 核心参数解决 but 也会引发其他问题。 连接:http://blog.csdn.net/dog250/article/details/13760985

  补充3: 开起 keep-alive 解决 nginx time-wait 问题 http://www.cnblogs.com/QLeelulu/p/3601499.html

  写在最后:1年前的事 最近才找到原因。而且已经从公司离职了惭愧啊。

时间: 2024-11-01 16:31:34

记一次Time-Wait导致的问题的相关文章

记一次存储故障导致数据库坏块处理过程

记一次存储故障导致数据库坏块处理过程 线上架构说明:     IBM DS4800存储一套     P560小机HA架构一套     两个数据库资源组平时run在HA架构中的任意一台中,资源组全部使用共享存储 问题描述: 由于存储在数据库运行过程中发生了异常宕机,导致两个库存在不同程度的坏块 错误信息及解决过程 数据库A: A:root:/db2dumph/istclhis > 2016-04-09-04.26.10.787138   Instance:istclhis   Node:000 P

记一次redis挂机导致的服务雪崩事故,不对,是故事~

事故时常有,最近特别多!但每次事故总会有人出来背锅!如果不是自己的锅,解决了对自己是一种成长,如果是自己的锅,恐怕锅大了,就得走人了,哈哈哈... 这不,最近又出了一个锅:从周五开始,每天到11点就不停的接到服务器报警,对于一般的报警,我们早已见怪不怪了,然后作了稍微排查(监控工具: CAT),发现是redis问题,没找到原因,然后过了一会自己就好了,所以刚开始也没怎么管他.然后,第二天报警,第三天报警,领导火了,然后只好说,要不等到周一上班咱们再解决吧! 周一,开发同学还没去找运维同学查问题,

记一次Laravel定时任务导致日志没有写入权限的坑

问题:用laravel开发定时任务时,发生了日志没有写入权限导致项目打不开的问题 原因:linux的添加定时任务时默认是当前登录用户,我定时任务会生成日志 crontab: kernel: 生成日志的文件所有者是当前用户yang,其他用户没有写入权限 而php的执行用户是apche 经过一番研究,这里给crontab 指定的用户与php执行的用户一致: crontab -u apache -e 写入定时执行的任务并删除之前的定时任务 亲测解决 原文地址:https://www.cnblogs.c

vagrant故障记--升级虚拟机linux内核导致无法挂载共享文件夹

i'm new to use vagrant,今天升级了下vbox里的ubuntu12.04内核,结果vagrant reload后出现报错. Failed to mount folders in Linux guest. This is usually because the "vboxsf" file system is not available. Please verify that the guest additions are properly installed in t

记一次PAM failure导致的ssh登录VPS失败

今天想在VPS上装一个monit做监控.没想到出了点问题折腾了差不多一天. 问题的起源是monit依赖于LinuxPAM.这个东西我以前是一点都没怎么了解过,还以为只是个普通的依赖库,所以就没怎么注意.没想到一时的大意白白浪费了一天时间. 在安装完PAM后,monit顺利地安装成功了.可是我突然发现,ssh不能连到VPS了!我以为是我本地的xshell有问题,就把当前的连接断掉(为什么要断啊T_T),试着连了连其他的服务器.试了几个都可以,就是VPS不行.于是就开始了断断续续差不多一天的折腾-

记一次低级错误导致的mysql(111)

今天下午配好的双主多从服务器,两台主机+主机内安装好的6台虚拟机,两台Mysql master各授权好其slave的远程登录,原本好端端的能远程登录,晚上回来时候就发现其中一台master登录不上其slave(有2个), [[email protected] ~]# telnet 192.168.1.135 3306 Trying 192.168.1.135... telnet: connect to address 192.168.1.135: Connection refused [[ema

记一次强制关机导致的mysql灾难

mysql版本:5.5 笔记本又一次死了,只有屏幕活着,应该是内存盘的问题. 总之,我开了mysql服务并强制关机了,再次打开电脑的时候,mysql服务启动失败. 首先查看windows日志,日志提示一些错误,但是不具体. 1.于是把 主目录下面的data目录保存下来(这里面存的是所有表格的基本信息),下面的 ibdata1 文件存储的是数据信息 ,因此也需要保存下来. 2.然后重装mysql,这里使用mysql安装软件来卸载和重装,自行安装有些信息删不完全. 3.最后把 data目录复制回去即

记一次php curl导致的故障

情景描述 本地和alpha环境curl请求第三方接口正常beta环境curl请求失败 代码如下 public static function getCurl($url, $type = 'get', $data = '', $decode = true, $header = array()) { $ch = curl_init(); // 初始化CURL句柄 curl_setopt($ch, CURLOPT_TIMEOUT, 5);//设置超时3秒钟 curl_setopt($ch, CURLO

捉虫记(四)线程安全导致的HighCpu

一个朋友QQ群里说网站启动后会cpu很高,想要帮忙看一下dump. 1.打开windbg加载dump文件后第一个命令lmf,这个命令显示加载的dll以及路径,这样子可以找个dll来帮忙加载sos,(额,我记不住load那么长的路径啊) 0:000> lmf start end module name …… 00007ffb`a3750000 00007ffb`a375a000 version C:\Windows\System32\version.dll 00007ffb`a37e0000 00

final发布评语

final发布评语: 1.约跑(nice!)发布者:组长李权以及组员刘芳芳和于淼,对于约跑APP,final发布主要完成对于用户提出的(1.对话字数多导致头像被挤掉2.返回时没有完全退出)问题修改成功, 以及界面美化,投影仪发布.不足之处:视频投影不清晰,发布时组员对于产品解说存在欠缺,对于沈柏杉同学提出发布时可以将产品展示的更具有趣味性,以后需要改进. 2.礼物挑选(飞天小女警)发布者:杨钰宁,首先杨钰宁对于产品的发布个人觉得还是很不错,在黑板上画了人以及文字说明,可以有理有据的展示自己产品,