(干货)一次httpclient的close_wait问题的探讨
从图中可以看出,如果客户端被动关闭连接,且没有向服务器端发送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问题的探讨的更多相关文章
- Atitit.http httpclient实践java c# .net php attilax总结
Atitit.http httpclient实践java c# .net php attilax总结 1. Navtree>> net .http1 2. Httpclient理论1 2. ...
- Apache HttpClient使用之阻塞陷阱
前言: 之前做个一个数据同步的定时程序. 其内部集成了某电商的SDK(简单的Apache Httpclient4.x封装)+Spring Quartz来实现. 原本以为简单轻松, 喝杯咖啡就高枕无忧的 ...
- 第三节:总结.Net下后端的几种请求方式(WebClient、WebRequest、HttpClient)
一. 前言 前端调用有Form表单提交,ajax提交,ajax一般是用Jquery的简化写法,在这里不再过多介绍: 后端调用大约有这些:WebCient.WebRequest.Httpclient.W ...
- 怎么将ETL技术落地
ETL概述 ETL(Extraction-Transformation-Loading)是将业务系统的数据经过抽取.清洗转换之后加载到数据仓库的过程,目的是将企业中的分散.零乱.标准不统一的数据整合到 ...
- Groovy脚本基础全攻略
1 背景 Groovy脚本基于Java且拓展了Java,所以从某种程度来说掌握Java是学习Groovy的前提,故本文适用于不熟悉Groovy却想快速得到Groovy核心基础干货的Java开发者(注意 ...
- 解决:HttpClient导致应用出现过多Close_Wait的问题
最近发现一个问题,在服务器上通过netstat命令发现有大量的Close_Wait长时间存在,甚至有时候数量接近1000: 查看服务器参数(etc/sysctl.conf): net.ipv4.tcp ...
- Using HttpClient properly to avoid CLOSE_WAIT TCP connections
Apache的HttpComponent组件,用的人不在少数.但是能用好的人,却微乎其微,为什么?很简单,TCP里面的细节实现不是每个人都能捕获到的(细节是魔鬼),像并发请求控制&资源释放,N ...
- HttpClient当HTTP连接的时候出现大量CLOSE_WAIT连接(转)
ESTABLISHED 表示正在进行网络连接的数量 TIME_WAIT 表示表示等待系统主动关闭网络连接的数量 CLOSE_WAIT 表示被动等待程序关闭的网络连接数量 上篇文章给出了解决TIME_W ...
- CLOSE_WAIT?项目上线之际遇到这样的烦心事
项目内测中,马上就要发布了,如今内测,所以很忙,今天运维那发来一堆状态,忘记截图了,简单来讲就是HTTP发送请求的时候有连接等待关闭,导致CLOSE_WAIT这个状态一直累加,没有释放,这样长时间下去 ...
随机推荐
- Inno Setup入门(二十一)——Inno Setup类参考(7)
Install Setup 2013-02-02 11:31 378人阅读 评论(0) 收藏 举报 复选框 复选框(CheckBox)用于多个并不互斥的几个选项中作出一个或者多选择,例如字体可以有粗体 ...
- 1*Json对象声明简单,复合,对象数组
//简单JSON对象 function btn1_click() { var json = { "id": 1001, "name": "张三&quo ...
- Django 用户认证及OneToOneField
Django 用户认证如果自己不想写 就可以用django自带的认证 首选导入模块 models.py #!/usr/bin/env python #_*_ coding:utf8 _*_ from ...
- 自己开发的轻量级gif动画录制工具
虽然网上已经有LICEcap.GifCam等gif录制工具,但我仍然觉得对于我个人使用还是不够方面,所以自己又写了一个,功能相对简洁一些. Gif Recorder 支持全屏录制和区域录制,可自 ...
- MySql-时间格式转换之转换为时分秒格式的日期
select date_format(create_datetime,'%Y-%m-%d %k:%i:%s') from busi_repairitem_category MySQL毫秒值和日期的指定 ...
- TexturePacker license Key免费获取方式
TexturePacker是一款功能非常强大的图片制作工具.是一款付费软件,但是TexturePacker的作者Andreas Löw先生也给出获得免费key 的方法...大家可以到这个网站去申请 h ...
- USB鼠标线序
鼠标线断了,找了个废弃的手机充电线接上,特记录线序如下: 红————白 白————橙绿————绿黑————蓝
- AI 人工智能 探索 (八)
绑定下,用来释放内存 布局框架.链接:http://pan.baidu.com/s/1eQzSXZO 密码:25ir 这次 我采用 ngui 来设定界面.除工具栏模块外,其他各类ui模块都是 内存池动 ...
- #ifndef 和 #endif
文件中的#ifndef 头件的中的#ifndef,这是一个很关键的东西.比如你有两个C文件,这两个C文件都include了同一个头文件.而编译时,这两个C文件要一同编译成一个可运行文件,于是问题来了, ...
- Mysql笔记3数据库基本操作
1 创建数据库 create database 数据名称 default character set 编码; 2查看常用的编码校验规则 mysql> show character set; 3删 ...