从图中可以看出,如果客户端被动关闭连接,且没有向服务器端发送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. 登录验证的js;JS验证邮箱 验证密码

    var auth_email = 0, auth_pwd = 0, auth_captcha = 0, url_ajax = "/protected/user_ajax.php"; ...

  2. Lua 变长参数(variable number of arguments)

    lua变长参数 function add ( ... ) for i, v in ipairs{...} do print(i, ' ', v) end end add(1, 2, 'sdf') lu ...

  3. CodeIgniter 如何去掉 Index.php

    步骤; 1.打开你的WEB服务器的httpd.conf文件. 2.找到LoadModule rewrite_module modules/mod_rewrite.so这行,把该行前的#去掉.保存该文件 ...

  4. property函数

    __metaclass__=type class Rectangle:     def __init__(self):             self.width=0             sel ...

  5. Python基础学习8---list列表的操作

    a_list = ['hello','world',1,'shanghai',3.99] #列表添加操作的4种方法 #1. 通过+ 字符来拼接 a_list = a_list + [1,'wuhan' ...

  6. 多校 Babelfish

    题目链接:http://acm.hust.edu.cn/vjudge/contest/124435#problem/A 密码:acm Sample Input dog ogday cat atcay ...

  7. Java实现随意切换VPN改变上网地区

    http://www.jb51.net/article/69267.htm 这篇文章主要介绍了Java实现随意切换VPN改变上网地区,本文直接给出实例代码,需要的朋友可以参考下 在很多情况下,有些网络 ...

  8. linux文件分割(将大的日志文件分割成小的)【转载】

    linux文件分割(将大的日志文件分割成小的)linux下文件分割可以通过split命令来实现,可以指定按行数分割和安大小分割两种模式.Linux下文件合并可以通过cat命令来实现,非常简单. 在Li ...

  9. C#入门经典(3-窗体应用程序-第二章要点)

    新建一个窗体用用程序,拖一个按钮,加事件和Text属性.打开Form1Designer.cs.

  10. 51nod 区间中第K大的数

    区间中第K大的数 基准时间限制:1 秒 空间限制:131072 KB  一个长度为N的整数序列,编号0 - N - 1.进行Q次查询,查询编号i至j的所有数中,第K大的数是多少. 例如: 1 7 6 ...