从图中可以看出,如果客户端被动关闭连接,且没有向服务器端发送FIN,则会一直处于CLOSE_WAIT状态。

处理服务器在处理完请求,与后端Nginx之间的连接仍然保持着CLOSE_WAIT状态,个数为256(最大连接数)。

原因:后端Nginx设置keep-alive长连接,在处理完处理服务器请求后,由于keep-alive长连接超时设置Nginx服务器主动关闭了连接,处理服务器端被动关闭,与后端Nginx间的连接处于CLOSE_WAIT状态。根据查阅资料,大量的CLOSE_WAIT连接会占用系统资源,会造成连接阻塞,当新的请求到达时无法建立新的连接,真的是这样吗?为了验证这一说法,做了以下实验:

(1)为了便于观察端口的变化,将后端Nginx keep-alive最大连接数设置为10。

(2)向系统发起10个请求,如图所示建立起10个连接后处于CLOSE_WAIT状态。

(3)再向系统发起第11个请求时,原来的62454端口的连接断开。

(4)分配新的端口62470建立新的连接。

验证结论:系统虽然存在大量的CLOSE_WAIT,但它并不会造成连接阻塞,在新的请求到达时,旧的CLOSE_WAIT连接会断开。这是因为HttpClient有这样的机制,会自动清理CLOSE_WAIT状态的连接。

然而,在测试中还遇到了另外一个CLOSE_WAIT问题却造成了连接阻塞,这是为什么呢?请看接下来问题2的分析。

向处理服务器发起大量对象名不存在的请求,处理服务器与后端Nginx之间也保持CLOSE_WAIT状态,但是新的请求发起时,原来CLOSE_WAIT连接并没有断开,当达到Nginx设置的最大连接数256时,系统将不能再建立连接处理新的请求。为了定位原因,做了以下实验。

(1) 向系统发起对象名不存在的一个错误请求,处理服务器与后端Nginx之间的建立连接

(2)Nginx在keep-alive超时后主动关闭连接,处理服务器与Nginx连接状态变为CLOSE_WAIT

(3)再次向系统发起对象名不存在的错误请求,旧的连接一直保持CLOSE_WAIT状态

根据以上结果可以看出,CLOSE_WAIT状态的连接并没有被断开,这和问题1的验证结果是相悖的。它们的区别是什么呢?

(4)向NOS服务器再发起一个正确请求,如下所示,处理服务器与Nginx之间的连接由ESTABLISHED状态最后变为CLOSE_WAIT。

(5)再发起新的正确请求,原来的57826端口的连接断开,在57846端口建立新的连接。

HttpClient有清理CLOSE_WAIT状态的机制,那为什么错误的请求产生的CLOSE_WAIT不能被清理呢?查看处理服务器使用HttpClient代码,发现在处理异常请求部分的代码中,没有读取后端tobie处理结果返回body的操作,而根据Httpclient的处理机制,只有在读body操作后才会触发HttpClient Manager回收连接,否则会被认为该连接一直在处理请求。因此在处理异常请求部分的代码中增加response. getEntity().consumeContent()方法读body操作。

(干货)一次httpclient的close_wait问题的探讨的更多相关文章

  1. Atitit.http httpclient实践java c# .net php attilax总结

    Atitit.http httpclient实践java c# .net php attilax总结 1. Navtree>> net .http1 2. Httpclient理论1 2. ...

  2. Apache HttpClient使用之阻塞陷阱

    前言: 之前做个一个数据同步的定时程序. 其内部集成了某电商的SDK(简单的Apache Httpclient4.x封装)+Spring Quartz来实现. 原本以为简单轻松, 喝杯咖啡就高枕无忧的 ...

  3. 第三节:总结.Net下后端的几种请求方式(WebClient、WebRequest、HttpClient)

    一. 前言 前端调用有Form表单提交,ajax提交,ajax一般是用Jquery的简化写法,在这里不再过多介绍: 后端调用大约有这些:WebCient.WebRequest.Httpclient.W ...

  4. 怎么将ETL技术落地

    ETL概述 ETL(Extraction-Transformation-Loading)是将业务系统的数据经过抽取.清洗转换之后加载到数据仓库的过程,目的是将企业中的分散.零乱.标准不统一的数据整合到 ...

  5. Groovy脚本基础全攻略

    1 背景 Groovy脚本基于Java且拓展了Java,所以从某种程度来说掌握Java是学习Groovy的前提,故本文适用于不熟悉Groovy却想快速得到Groovy核心基础干货的Java开发者(注意 ...

  6. 解决:HttpClient导致应用出现过多Close_Wait的问题

    最近发现一个问题,在服务器上通过netstat命令发现有大量的Close_Wait长时间存在,甚至有时候数量接近1000: 查看服务器参数(etc/sysctl.conf): net.ipv4.tcp ...

  7. Using HttpClient properly to avoid CLOSE_WAIT TCP connections

    Apache的HttpComponent组件,用的人不在少数.但是能用好的人,却微乎其微,为什么?很简单,TCP里面的细节实现不是每个人都能捕获到的(细节是魔鬼),像并发请求控制&资源释放,N ...

  8. HttpClient当HTTP连接的时候出现大量CLOSE_WAIT连接(转)

    ESTABLISHED 表示正在进行网络连接的数量 TIME_WAIT 表示表示等待系统主动关闭网络连接的数量 CLOSE_WAIT 表示被动等待程序关闭的网络连接数量 上篇文章给出了解决TIME_W ...

  9. CLOSE_WAIT?项目上线之际遇到这样的烦心事

    项目内测中,马上就要发布了,如今内测,所以很忙,今天运维那发来一堆状态,忘记截图了,简单来讲就是HTTP发送请求的时候有连接等待关闭,导致CLOSE_WAIT这个状态一直累加,没有释放,这样长时间下去 ...

随机推荐

  1. ubuntu 设置vpn

    百度了资料 http://jingyan.baidu.com/article/fa4125aca7f1b628ad709271.html 1. 设置 VPN CONNECTION 2.configur ...

  2. c++11 对象池的实现

    ; template <typename T> class ObjectPool { template <typename... Args> using Constructor ...

  3. C++左值

    C++左值 左值参数是可被引用的数据对象.比如,变量,数组元素,结构成员,引用和解引用指针 非左值包含字面常量(用引号括起的字符串除外,它们是由地址表示的)和包含多项的表达式 在C语言里面左值最初指的 ...

  4. NSFileManager创建文件夹

    NSFileManager*fileManager = [[NSFileManager alloc] init]; NSString *pathDocuments = [NSSearchPathFor ...

  5. 动画——animation部分

    动画部分是HTML5的新增部分,其特性是可以不借助js代码就可以单单凭借着css部分完成部分动态效果.其效果华丽,强大,炫酷无比,只要你想得到的动态效果都可以通过css3来完成. <style& ...

  6. Git学习 -- 远程仓库

    第1步:创建SSH Key 在用户目录下的.ssh目录中,查看是否有id_rsa和id_rsa.pub两个文件,若没有则通过以下命令生成秘钥对: $ ssh-keygen -t rsa 第2步:登陆G ...

  7. Linux设置某软件开机自动启动的方法

    方法一 将启动命令写到系统启动时会自动调用的脚本中 echo "/usr/local/apache2/bin/apachectl start" >> /etc/rc.d ...

  8. android--listview设置高度

    android:layout_height="25dp"这么设置根本就没有用. 我们必须要设置android:minHeight="25dp"这样才行.

  9. [转]Linux下CodeBlocks的交叉编译

    原文链接:http://blog.sina.com.cn/s/blog_602f87700100kujh.html Sam一直是Makefile流,这些天需要移植一些游戏引擎模块.这些模块在其它嵌入式 ...

  10. MySQL解决"is marked as crashed and should be repaired"故障

    具体报错如下: Table '.\Tablename\posts' is marked as crashed and should be repaired 提示说论坛的帖子表posts被标记有问题,需 ...