tcp连接是网络编程中最基础的概念,基于不同的使用场景,我们一般区分为“长连接”和“短连接”,
长短连接的优点和缺点这里就不详细展开了,有心的同学直接去google查询,本文主要关注如何解决tcp短连接的TIME_WAIT问题。

短连接最大的优点是方便,特别是脚本语言,由于执行完毕后脚本语言的进程就结束了,基本上都是用短连接。
但短连接最大的缺点是将占用大量的系统资源,例如:本地端口、socket句柄。
导致这个问题的原因其实很简单:tcp协议层并没有长短连接的概念,因此不管长连接还是短连接,连接建立->数据传输->连接关闭的流程和处理都是一样的。

正常的TCP客户端连接在关闭后,会进入一个TIME_WAIT的状态,持续的时间一般在1~4分钟,对于连接数不高的场景,1~4分钟其实并不长,对系统也不会有什么影响,
但如果短时间内(例如1s内)进行大量的短连接,则可能出现这样一种情况:客户端所在的操作系统的socket端口和句柄被用尽,系统无法再发起新的连接!

举例来说:假设每秒建立了1000个短连接(Web场景下是很常见的,例如每个请求都去访问memcached),假设TIME_WAIT的时间是1分钟,则1分钟内需要建立6W个短连接,
由于TIME_WAIT时间是1分钟,这些短连接1分钟内都处于TIME_WAIT状态,都不会释放,而Linux默认的本地端口范围配置是:net.ipv4.ip_local_port_range = 32768    61000
不到3W,因此这种情况下新的请求由于没有本地端口就不能建立了。

可以通过如下方式来解决这个问题:
1)可以改为长连接,但代价较大,长连接太多会导致服务器性能问题,而且PHP等脚本语言,需要通过proxy之类的软件才能实现长连接;
2)修改ipv4.ip_local_port_range,增大可用端口范围,但只能缓解问题,不能根本解决问题;
3)客户端程序中设置socket的SO_LINGER选项;
4)客户端机器打开tcp_tw_recycle和tcp_timestamps选项;
5)客户端机器打开tcp_tw_reuse和tcp_timestamps选项;
6)客户端机器设置tcp_max_tw_buckets为一个很小的值;

在解决php连接Memcached的短连接问题过程中,我们主要验证了3)4)5)6)几种方法,采取的是基本功能验证和代码验证,并没有进行性能压力测试验证,
因此实际应用的时候需要注意观察业务运行情况,发现丢包、断连、无法连接等现象时,需要关注是否是因为这些选项导致的

虽然这几种方法都可以通过google查询到相关信息,但这些信息大部分都是泛泛而谈,而且绝大部分都是人云亦云,没有很大参考价值。
我们在定位和处理这些问题过程中,遇到一些疑惑和困难,也花费了一些时间去定位和解决,以下就是相关的经验总结。

最新文章

  1. 安装redis以windows服务形式
  2. 同步github上fork出来的分支
  3. 从零开始学习Node.js例子四 多页面实现数学运算
  4. Codeforces 687C. The Values You Can Make (dp)
  5. hdu 5565 Clarke and baton 二分
  6. uva 10881 - Piotr's Ants
  7. Service的两种启动方法
  8. 采购术语PR、PO、RFQ、RFI、SOW、BOM、JIT、VMI、MRO 是什么意思
  9. rhel5.8-LAMP环境搭建
  10. HNCU1323:算法2-1:集合union (线性表)
  11. HI3531的DDR3配置流程
  12. [Luogu3377]【模板】左偏树(可并堆)
  13. 怎样删除C/C++代码中的所有注释?浅谈状态机的编程思想
  14. LeetCode_7.Reverse Integer
  15. node.js学习(一)
  16. 《Blue Flke》第一次作业:团队亮相
  17. 一次性选中word中全部Table
  18. Git使用教程(一)---本地git管理
  19. Codeforces 798C - Mike and gcd problem(贪心+数论)
  20. Spring MVC 向前台页面传值-ModelAndView

热门文章

  1. Dos代码
  2. 一个支持FMX.Win框架的托盘控件
  3. js 除法 取整
  4. http协议 301和302的原理及实现
  5. Talend 从Excel导入Saleforce数据(一) 直接从salesforce lookup 性能的噩梦
  6. c# winForm使用Aspose.Cells读取CSV文件中文乱码问题
  7. Visual C++ 2008进行MySQL编程
  8. visual studio code + Nodejs + Typescritpt + angularjs2 + bootstrap 环境搭建/Elementary os
  9. JQ 操作 radio、checkbox 、select
  10. 如何修改VPN连接的MTU,解决频繁断线和页面打不开的问题