背景

公司群里,运维发现一个问题,task服务报错(如下)

The stream or file \"/data/logs/adn_task/offer_service.log\" could not be opened:

failed to open stream: Too many open files

测试老大看到了,根据经验就推测是应该是文件句柄使用完了,应该有TCP连接很多没释放,果真发现是很多CLOSE_WAIT的状态

简单认知

短链接,一次链接就会占用一个端口,一个端口就是一个文件描述符;

文件描述符 又称 句柄,linux系统最大的句柄数是65535,可以通过ulimit -a 查看

三次握手

TCP建立连接需要经过三次握手;

通俗版本:

A: 你好,你能听见我说话吗?

B: 能听到,你能听到我说话吗?

A:我也能听到,我们开始通信吧

专业版本:

建立TCP连接时,需要客户端和服务器共发送3个包。

第一次:客户端发送初始序号x和syn=1请求标志

第二次:服务器发送请求标志syn,发送确认标志ACK,发送自己的序号seq=y,发送客户端的确认序号ack=x+1

第三次:客户端发送ACK确认号,发送自己的序号seq=x+1,发送对方的确认号ack=y+1

四次挥手

TCP连接断开需要经过四次挥手;

通俗版本:

前提A和B在通话

A:好的,我的话就说完了(FIN);

B:哦哦,我知道你说完啦(ACK),我还有说两句哈;A: (没说话,一直听着)

B:哦了,我也说完了(FIN)

A:好的,我也知道你说玩了(ACK),挂电话吧

专业版本:

第一次挥手:客户端发出释放FIN=1,自己序列号seq=u,进入FIN-WAIT-1状态

第二次挥手:服务器收到客户端的后,发出ACK=1确认标志和客户端的确认号ack=u+1,自己的序列号seq=v,进入CLOSE-WAIT状态

第三次挥手:客户端收到服务器确认结果后,进入FIN-WAIT-2状态。此时服务器发送释放FIN=1信号,确认标志ACK=1,确认序号ack=u+1,自己序号seq=w,服务器进入LAST-ACK(最后确认态)

第四次挥手:客户端收到回复后,发送确认ACK=1,ack=w+1,自己的seq=u+1,客户端进入TIME-WAIT(时间等待)。客户端经过2个最长报文段寿命后,客户端CLOSE;服务器收到确认后,立刻进入CLOSE状态。

状态流转图

实际例子

建立连接

linux上起了一个redis服务

本地起的6379端口

还是同一台机器上,通过python脚本连接该redis服务:

此时网络连接如下:

关注这两个网络连接,第一个是redis-server的,第二是python脚本的,此时都是ESTABLISHED状态,表示这两个进程建立了连接

TIME_WAIT情况

现在断掉python

之前的python的那个连接,是TIME_WAIT状态

客户端(主动方)主动断开,进入TIME_WAIT状态,服务端(被动方)进去CLOSE状态,就是没有显示了

等待2MSL(1分钟)后,如下:

TIME_WAIT状态的连接也消失了,TIME_WAIT回收机制,系统ing过一段时间会回收,资源重利用

CLOSE_WAIT情况

先建立连接,如下:

关掉redis服务,service redis stop

之前的redis-server的45370端口连接 进入了FIN_WAIT2状态,而python端(被动关闭方)就进去了CLOSE_WAIT状态

等待30s后,在看连接

只有python的那条CLOSE_WAIT了

再次操作python端的脚本,再次get

关于6379端口(redis端口)的网络连接都没有了

TCP参数设置

如何快速回收TIME_WAIT和FIN_WAIT

/etc/sysctl.conf 包含以下配置项

net.ipv4.tcp_timestamps = 1

net.ipv4.tcp_tw_recycle = 1

net.ipv4.tcp_tw_reuse = 1

net.ipv4.tcp_fin_timeout = 30

root权限 执行/sbin/sysctl -p使之生效

经验之谈

个人经验,不一定对,如有错误,请指正

当出现了CLOSE_WAIT大概率是业务代码问题,代码中没有处理服务异常的情况,如上面的例子,python再次请求redis的时候,发现redis挂了,就会主动干掉CLOSE_WAIT状态

出现大量TIME_WAIT的情况,一般是服务端没有及时回收端口,linux内核参数需要调整优化

参考资料

python close_wait_TCP time_wait close_wait问题(可能是全网最清楚的例子)相关推荐

  1. Python与Seo工具源码,全网搜录查询助手exe

    Python与Seo工具源码,全网搜录查询助手exe 很多人都说,seo是一个玄学,诚然,一方面是排名,另一方面是收录,尤其是对于渣渣而言,当然收录和排名都需要去验证,去查询,乃至去监控,大批量的话, ...

  2. python输入任意多个成绩-Python 实现输入任意多个数,并计算其平均值的例子

    学习了Python相关数据类型,函数的知识后,利用字符串的分割实现了输入任意多个数据,并计算其平均值的小程序.思路是接收输入的字符串,以空格为分隔符,将分割的数据存入列表(lst1)中,将lst1中的 ...

  3. Linux记录-TCP状态以及(TIME_WAIT/CLOSE_WAIT)分析(转载)

    1.TCP握手定理 2.TCP状态 l  CLOSED:初始状态,表示TCP连接是"关闭着的"或"未打开的". l  LISTEN :表示服务器端的某个SOCK ...

  4. linux表示文件连接数,linux中连接数过多(TIME_WAIT/CLOSE_WAIT)读这一篇就够了

    根据TCP/IP介绍,socket大概包含10个连接状态.我们平常工作中遇到的,除了针对SYN的拒绝服务攻击,如果有异常,大概率是TIME_WAIT和CLOSE_WAIT的问题.TIME_WAIT一般 ...

  5. 【排序算法】python 十大经典排序算法(全网最详)

    排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存.常见的内部排序算法有:插入排序.希尔排序.选 ...

  6. python笔记小白入门_Python 笔记:全网最详细最小白的Class类和实例详解

    面向对象最重要的概念就是类(class)和实例(instance),类是抽象,而实例(Instance)则是一个个具体的对象 面向对象三大特点:封装.继承和多态 class Animal(object ...

  7. python列表所有元素平均值_【全网最简单Python教程】--10.列表元素的索引和返回索引值(Index函数使用)...

    在练习日4中,小鱼给大家讲述了神秘的ASCII码编译及解密过程. 在ASCII码中,字符与十进制数字的互相转换是通过 ord()函数 和 chr()函数. 今天小鱼要给大家介绍另一种在影视剧.侦探小说 ...

  8. 【从零开始玩量化17】如何python+QMT完成自动化交易?(全网最详细入门教程)

    一.什么是QMT 此部分为扫盲内容,有一定了解者可以跳过. 概念 它是一款量化交易客户端软件,由一家叫做迅投公司出品,可以直接登录你的券商账号进行股票交易,但与同花顺/通信达不同的是,它暴露了基于py ...

  9. python github 12306 文贤平_全网最牛掰的12306抢票神器,助力抢到春节回家的票

    ↑↑↑点击上方"蓝字",关注"极客猴" 如果你喜欢极客猴,可以把我置顶或加为星标 选自<量子位> 作者:车栗子 来源:凹非寺 阅读文本大概需要 3 ...

最新文章

  1. Centos 7使用vsftpd搭建FTP服务器
  2. Delphi V7.0企业汉化版及注册码
  3. QT的QMediaPlayer类的使用
  4. python统计分析--2.预分析:异常值、缺失值处理
  5. 后端JAVA:说说你对【注解】的理解
  6. python接口自动化(三十七)-封装与调用--读取excel 数据(详解)
  7. 深度学习基础(五)—— rectifier function and softplus
  8. 14.高性能MySQL --- 应用层优化
  9. arduino 读取串口信息hex_进阶教程1:Arduino串口通信与电脑控制LED
  10. Windows XP64位系统与语言包下载
  11. 1.7-工控上位机软件开发平台介绍
  12. 马王堆出土道德经原文(非删改本)
  13. JavaWeb随手笔记
  14. 云计算机到底是啥来的,啥叫云计算(云计算究竟是什么)
  15. 动词ing基本用法_动词ing的用法
  16. 如何编写好的代码/成为一个更好的程序员
  17. Bernoulli Number
  18. 计算机在艺术娱乐的应用,计算机技术在艺术领域的应用
  19. 因果,因果推断,因果关系是什么?
  20. 一个算法工程师的日常是怎样的?

热门文章

  1. 利用百度地图API,在浏览器中找到自己的位置
  2. List特有迭代器--ListIterator的特殊功能
  3. 【解决方案】jquery live的change事件在IE下失效
  4. Java程序员从笨鸟到菜鸟之(五十八)细谈Hibernate(九)hibernate一对一关系映射...
  5. 软件过程评估和软件能力评价的方法与步骤
  6. WCF 第一章 基础 为一个ASMX服务实现一个WCF客户端
  7. C++ 构造函数体内赋值与初始化列表的区别
  8. postman-SSL证书问题-支持HTTPS请求
  9. jave 逻辑运算 vs 位运算 + Python 逻辑运算 vs 位运算
  10. SpringBoot与JdbcTemplate的完美结合