记一次由tcp_tw_recycle参数引发的血案

一,故障描述:

从昨天开始,在值班群中陆续值班人员反映系统后台存在卡顿问题,如下图:

而且在卡顿的同时登陆服务器也会卡好久。此现象只在一台服务器有出现。

二,故障分析:

1,登陆服务器查看资源使用top,vmstat等命令查看了一番发现服务器各项指标都没有异常。于是将问题转向了网络层。
2,客户端端值班人员反映只有在访问系统后台的时候才会出现卡顿,访问其他网站正常。
3,本地使用ping服务器外网ip正常返回,无丢包,延迟也正常。
4,使用http-ping工具时,问题出现了,会经常性的出现连接失败:
(http-ping工具下载地址https://www.softpedia.com/get/Network-Tools/IP-Tools/http-ping.shtml)

为什么会连接失败呢?
5,使用tcpdump抓包在卡顿的时候会抓到大量的syn请求,但服务器没有响应:

6,登录服务器查看tcp相关数据

$ netstat -s | grep -i listen
    326 times the listen queue of a socket overflowed
    751346 SYNs to LISTEN sockets dropped

发现在卡顿时有大量tcp syn包被丢弃,数值一直在增长。

三,故障处理:

在查阅资料并结合实际情况后,发现该服务器同时启用了 tcp_timestamps和tcp_tw_recycle参数。
后想起,之前同事为改善time_wait连接数过多问题曾改过该内核参数。
解决办法是,关闭tcp_tw_recycle:

$ vi  /etc/sysctl.conf
#修改为如下
net.ipv4.tcp_tw_recycle = 0
#保存退出,使之生效
$ sysctl -p

再观察,发现服务已正常,卡顿现象消失。

四,总结:

我们先来man一下这两个参数(man tcp):

 tcp_timestamps (Boolean; default: enabled; since Linux 2.2)
              Enable RFC 1323 TCP timestamps.

tcp_timestamp 是 RFC1323 定义的优化选项,主要用于 TCP 连接中 RTT(Round Trip Time) 的计算,开启 tcp_timestamp 有利于系统计算更加准确的 RTT,也就有利于 TCP 性能的提升。(默认开启)

 tcp_tw_recycle (Boolean; default: disabled; since Linux 2.4)
              Enable fast recycling of TIME_WAIT sockets.  Enabling this option is not recommended since this causes problems when working with NAT (Network Address
              Translation).

开启tcp_tw_recycle会启用tcp time_wait的快速回收,这个参数不建议在NAT环境中启用,它会引起相关问题。

tcp_tw_recycle是依赖tcp_timestamps参数的,在一般网络环境中,可能不会有问题,但是在NAT环境中,问题就来了。比如我遇到的这个情况,办公室的外网地址只有一个,所有人访问后台都会通过路由器做SNAT将内网地址映射为公网IP,由于启用了tcp_timestamps,所以客户端会在头部中增加时间戳信息,而在服务器看来,同一客户端的时间戳必然是线性增长的,但是,由于我的客户端网络环境是NAT,因此每台主机的时间戳都是有差异的,在启用tcp_tw_recycle后,一旦有客户端断开连接,服务器可能就会丢弃那些时间戳较小的客户端的SYN包,这也就导致了网站访问极不稳定。
经过此次故障,告诫我们在处理线上问题时,不能盲目修改参数,一定要经过测试,确认无误后,再应用于生产环境。同时,也要加深对相关内核参数的认识和理解。

原文地址:http://blog.51cto.com/hld1992/2285410

时间: 2024-10-23 05:21:24

记一次由tcp_tw_recycle参数引发的血案的相关文章

一个MSS参数引发的“血案”

最近在玩一些淘汰下来的FW,在马云家淘了一些二手的玩玩,在家搭建了一台zabbix监控,配置了onealert的免费通知插件(支持微信.QQ.邮件.短信.电话等),用来监控我家小PP看动画片时长,时间过长就要远程断网或shutdown交换机接口,因为当着面关他电视后果很严重,断他网他会知道是"坏了",没那么闹腾. 回到正题,以前一直用无线路由器做NAT转发,发现即使是cisco 6900和网件R 7000等千元路由器级别都会用到死机.后来帮别人做项目发现juniper ssg和SRX这

一个参数引发的血案

天天写代码出bug解bug,真得有很low的感觉,但也有happy的感觉,因此我认为它是有价值的. 这类bug遇到无数次,每次解决就过去了,再次遇到又是惊出一身冷汗,这就是乐趣啊. 过程如下: 程序无响应 ps查看进程,发现进程已经退出 怎么办 发现大概的问题代码块 重启进程 gdb attach之 在问题代码块处密集断点 continue 制造触发条件 入断点 c c 崩溃 bt看调用栈 定位 是他:tg_log_fce("dpl_hlist_search(%s).In(%s)[%d], fi

中文参数引发的乱码问题

新手一枚,使用spring MVC框架开发项目 路径中文传输变乱码 找到的解决方法 JS URL传中文参数引发的乱码问题 解决方法如下: 1.在JS里对中文参数进行两次转码  代码如下: var login_name = document.getElementById("loginname").value; login_name = encodeURI(login_name); login_name = encodeURI(login_name);//必须加密两次 或 window.l

Objc中2维指针作为输出参数时由ARC及@autoreleasepool引发的血案

先看下面一个例子 #import <UIKit/UIKit.h> #import "AppDelegate.h" @interface Something : NSObject - (void)doWithError:(NSError **)outError; @end @implementation Something - (void)doWithError:(NSError **)outError { @autoreleasepool { *outError = [NS

记两个版本Python共存引发的玄学事件

记两个版本Python共存引发的玄学事件 2020.02.21 ? 今天由于他人特殊需求,需要将某个脚本打包为无需依赖的可执行文件,好在对方的系统是win7使得不用考虑太多跨平台编译的问题.我打算使用pyinstaller进行打包. ? 然而,当我调试完成,py main.py可以正常运行后,pyinstaller -F main.py生成的程序却一闪而过,不知出了什么问题.在控制台运行才发现竟然是No module named win32api,查看warning log得知,三个属于pywi

git 填坑记录----记一次git低版本引发的问题

git版本略低,引发的血案 原本部署在阿里云上的项目,准备放到内网jenkins上发布,配置完成后发版,jenkins变红了,详细错误信息如下 ERROR: Error cloning remote repo 'origin' hudson.plugins.git.GitException: Command "git fetch --tags --progress https://gitlab.kingtool.top/admin-public/cshopfront.git +refs/head

一个无锁消息队列引发的血案:怎样做一个真正的程序员?(二)——月:自旋锁

前续 一个无锁消息队列引发的血案:怎样做一个真正的程序员?(一)——地:起因 一个无锁消息队列引发的血案:怎样做一个真正的程序员?(二)——月:自旋锁 平行时空 在复制好上面那一行我就先停下来了,算是先占了个位置,虽然我知道大概要怎么写,不过感觉还是很乱. 我突然想到,既然那么纠结,那么混乱,那么不知所措,我们不如换个视角.记得高中时看过的为数不多的长篇小说<穆斯林的葬礼>,作者是:霍达(女),故事描写了两个发生在不同时代.有着不同的内容却又交错扭结的爱情悲剧,一个是“玉”的故事,一个是“月”

一个无锁消息队列引发的血案(六)——RingQueue(中) 休眠的艺术 [续]

目录 (一)起因 (二)混合自旋锁 (三)q3.h 与 RingBuffer (四)RingQueue(上) 自旋锁 (五)RingQueue(中) 休眠的艺术 (六)RingQueue(中) 休眠的艺术 [续] 开篇 这是第五篇的后续,这部分的内容同时会更新和添加在 第五篇:RingQueue(中) 休眠的艺术 一文的末尾. 归纳 紧接上一篇的末尾,我们把 Windows 和 Linux 下的休眠策略归纳总结一下,如下图: 我们可以看到,Linux 下的 sched_yield() 虽然包括了

一个脚本引发的血案

我们本身是一家互联网金融公司,公司的主流业务就是p2p,因为各种原因吧,15年底启动建设众筹平台.考虑到前期开发过程中的一些弊端和架构经验,本次架构引用了dubbo做soa服务的治理,web容器nginx+tomcat,后端语言采用java,框架选择spring+mybaits,前端模板引擎使用的是btl,app采用原生+h5的模式.这个架构可以参考我之前写的文章从零到百亿互联网金融架构发展史中的第三代系统架构,之前的文章主要介绍了架构的变迁,本篇文章主要介绍在第三代平台中遇到的问题以及解决方法