场景回放

A机器的服务请求B机器的服务

短连接请求,动态创建连接端口

A机器服务会主动关闭连接

短时间内高并发请求

A机器的tcpssports被耗尽了

大部分网络连接处time_wait状态

内核配置

net.ipv4.ip_local_port_range = 1024 65000

net.ipv4.ip_local_reserved_ports = 5710-5739,15710-15739

端口耗尽

主动调用close()/shutdown()断开连接,收到对方确认后状态变为TIME_WAIT。

TCP协议TIME_WAIT状态会一直持续2MSL,TIME_WAIT有时间窗口,Linux默认是60秒

TIME_WAIT状态的连接占用的资源不会被内核释放

TIME_WAIT状态转换到CLOSE状态后资源才会真正被系统收回。

内核参数优化

客户端内核参数优化

#开启TCP连接中TIME-WAIT套接字的快速回收

net.ipv4.tcp_tw_recycle=1

#开启重用,表示是否允许将处于TIME-WAIT状态的socket(TIME-WAIT的端口)用于新的TCP连接 。

net.ipv4.tcp_tw_reuse=1

#对于本端断开的socket连接,TCP保持在FIN-WAIT-2状态的时间(秒)。

#对方可能会断开连接或一直不结束连接或不可预料的进程死亡。

net.ipv4.tcp_fin_timeout=5

#TCP时间戳(会在TCP包头增加12个字节),以一种比重发超时更精确的方法(参考RFC 1323)

#来启用对RTT 的计算,为实现更好的性能应该启用这个选项。

net.ipv4.tcp_timestamps=1

#收缩TIME_WAIT状态socket的回收时间窗口

net.ipv4.tcp_tw_timeout=3

服务端内核参数优化

#定义了系统中每一个端口最大的监听队列的长度,这是个全局的参数。

sysctl net.core.somaxconn=1024

#传输缓区长度大小

ifconfig eth0 txqueuelen 5000

echo "/sbin/ifconfig eth0 txqueuelen 5000" >> /etc/rc.local

#在每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目

sysctl net.core.netdev_max_backlog=2000

#对于还未获得对方确认的连接请求,可保存在队列中的最大数目。如果服务器出现过载,可以尝试增加这个数字。

sysctl net.ipv4.tcp_max_syn_backlog=2048

参考资料:

https://en.wikipedia.org/wiki/Transmission_Control_Protocol?spm=5176.100239.blogcont52884.5.JrKkjE

http://www.medianet.kent.edu/techreports/TR2005-07-22-tcp-EFSM.pdf

http://stackoverflow.com/questions/410616/increasing-the-maximum-number-of-tcp-ip-connections-in-linux/3923785#3923785

http://www.cnblogs.com/fczjuever/archive/2013/04/05/3000680.html

http://www.cnblogs.com/fczjuever/archive/2013/04/17/3026694.html

linux 端口耗尽,短连接以致端口耗尽相关推荐

  1. netstat 在windows下和Linux下查看网络连接和端口占用

    假设忽然起个服务,告诉我8080端口被占用了,OK,我要去看一下是什么服务正在占用着,能不能杀 先假设我是在Windows下: 第一列: Proto 协议 第二列: 本地地址[ip+端口] 第三列:远 ...

  2. Linux系统修改远程连接22端口

    1.检查Linux系统是否安装SSH软件包,rpm -qa| grep ssh 如果没有安装使用yum安装ssh服务 :yum install -y openssh-server 查看安装的 ssh服 ...

  3. tcp 服务器响应端口,TCP/HTTP连接/Socket/端口

    一.TCP连接与端口 web服务器只开启了一个端口,他是如何为多用户服务的? 问题描述 不同主机之间通讯,必须依赖套接字,而端口号是套接字的标识(开始是这样认为的),那么假设web服务器进程,开启了8 ...

  4. Linux:使用 redis 连接指定端口的 redis 数据库

    步骤如下: 下载 redis wget http://download.redis.io/releases/redis-4.0.2.tar.gz 解压下载的文件 tar xzf redis-4.0.2 ...

  5. linux怎么看tty连接哪个端口,Linux TTY framework(4)_TTY driver

    Linux TTY framework(4)_TTY driver 作者:wowo 发布于:2016-10-25 22:40 分类:TTY子系统 1. 前言 本文将从驱动工程师的角度去看TTY fra ...

  6. linux下短链接出现TIME_WAIT耗尽端口号的解决方法

    最近使用C++开发libcurl库访问OpenSearch程序,出现"Cannot assign requested address"错误,大量请求错误.Google后问题集中在l ...

  7. linux1521端口不通,Linux开放1521端口允许网络连接Oracle Listene

    症状: 1. TCP/IP连接是通的.可以用ping 命令测试. 2. 服务器上Oracle Listener已经启动. lsnrctl status  查看listener状态 lsnrctl st ...

  8. Linux FTP 21端口始终无法连接的问题

    记录一下出现的问题 环境如下 环境如下 软件 版本 Linux Centos7.5 ftp软件 Pure-ftpd 宝塔Panel 6.9.9 安装完下面这个插件之后吧,进行了一系列常规设置 1.首先 ...

  9. linux查看80端口连接ip,Linux通过netstat命令查看80端口连接数的方法

    服务器上的一些统计数据: 1)统计80端口连接数 netstat -nat|grep -i "80"|wc -l 2)统计httpd协议连接数 ps -ef|grep httpd| ...

最新文章

  1. Python 之 pip拒绝访问
  2. 拥抱大家庭,nodejs走thrift
  3. 机器学习线性回归_机器学习-线性回归
  4. Java学习之约瑟夫环的两中处理方法
  5. anaconda新建python2环境安装不了jupyterlab_在Mac下安装anaconda及配置jupyterLab和PyTorch的方法...
  6. Spring boot 项目目录结构详解
  7. -6dB的效果也不错
  8. 优酷《女心理师》热播 产后抑郁等话题引热议
  9. adobe blueprint
  10. jackson用法,json转换
  11. ubuntu-桌面菜单栏、任务栏、标题栏都不见了-解决办法
  12. 微积分知识总览(0)
  13. 线程池(python)
  14. 【教程】安卓7.0-11.0高版本 fiddler抓包失败的解决方案
  15. 维基百科的语料库下载以及信息提取笔记
  16. 计算机竞赛制作机器人,电脑制作活动机器人项目详细说明
  17. python系统开发_证券交易系统设计与开发
  18. 痴迷技术,青春无悔,我那不务正业的大学时光!
  19. 魔兽对战平台官网地图《小兵合成》 最强攻略+合成表+隐藏合成+隐藏英雄+
  20. 零预算引爆个人和企业品牌

热门文章

  1. 你知道吗?U盘插入速度决定读写速度,看完别再用错了
  2. LinuxMint安装后的简单配置
  3. python中的标准输入设备_从MIDI设备获取输入(Python)
  4. 让脂肪起内讧?从内部全面瓦解脂肪
  5. win10下速腾聚创RS-Lidar-32配置教程
  6. Word中表格相关的操作
  7. 坐标系旋转后的点坐标、坐标点旋转后的点坐标
  8. 【转载】Python第三方库资源
  9. 什么是HTTP状态码 常见状态码集合
  10. html css齿轮滚动特效,CSS_纯CSS3实现滚动的齿轮动画效果,纯CSS写的齿轮效果。支持chrome - phpStudy...