<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule">

<channel>
	<title>wolfg&#039;s Weblog &#187; tcp</title>
	<atom:link href="http://guoyong.org/tag/tcp/feed" rel="self" type="application/rss+xml" />
	<link>http://guoyong.org</link>
	<description>wolfg&#039;s journey with open source, linux, programming, sysadm ...</description>
	<lastBuildDate>Thu, 04 Aug 2011 15:02:53 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.1</generator>
<creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/2.5/cn/</creativeCommons:license>		<item>
		<title>再谈使用Commons HttpClient产生大量CLOSE_WAIT</title>
		<link>http://guoyong.org/2010/02/02/572</link>
		<comments>http://guoyong.org/2010/02/02/572#comments</comments>
		<pubDate>Tue, 02 Feb 2010 07:16:12 +0000</pubDate>
		<dc:creator>wolfg</dc:creator>
				<category><![CDATA[Dev]]></category>
		<category><![CDATA[CLOSE_WAIT]]></category>
		<category><![CDATA[HttpClient]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[tcp]]></category>

		<guid isPermaLink="false">http://guoyong.org/?p=572</guid>
		<description><![CDATA[默认情况下(即用默认构造方法建立HttpClient对象)，httpMethod.releaseConnection()方法并不会关闭连接的Socket，目的是可以重用这个连接。网上有不少讨论： Re: CLOSE_WAIT, logging Re: [httpclient] CLOSE_WAIT sticking around Re: tcp connections left with CLOSE_WAIT apache httpclient与close_wait 这些讨论里提出了关闭Socket的方法，即在请求头里加上&#8221;Connection: close&#8221;，具体可见HTTP协议规范里的说明。 其实HttpClient 3.x 里还可以通过下面的方式建立HttpClient对象，来保证关闭Socket连接： HttpClient httpClient = new HttpClient(new SimpleHttpConnectionManager(true)); 具体可见HttpClient源码和API文档。 当然，使用HttpClient的多线程连接管理器时就不用这么做了。]]></description>
			<content:encoded><![CDATA[<p>默认情况下(即用默认构造方法建立HttpClient对象)，httpMethod.releaseConnection()方法并不会关闭连接的Socket，目的是可以重用这个连接。网上有不少讨论：</p>
<ul>
<li><a href="http://www.mail-archive.com/commons-httpclient-dev@jakarta.apache.org/msg04338.html">Re: CLOSE_WAIT, logging</a></li>
<li>
<a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec8.html">Re: [httpclient] CLOSE_WAIT sticking around</a></li>
<li>
<a href="http://www.mail-archive.com/httpclient-user@jakarta.apache.org/msg04467.html">Re: tcp connections left with CLOSE_WAIT</a></li>
<li><a href="http://swordinhand.javaeye.com/blog/149408">apache httpclient与close_wait</a></li>
</ul>
<p>这些讨论里提出了关闭Socket的方法，即在请求头里加上&#8221;Connection: close&#8221;，具体可见<a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec8.html">HTTP协议规范里的说明</a>。</p>
<p>其实HttpClient 3.x 里还可以通过下面的方式建立HttpClient对象，来保证关闭Socket连接：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Blue;">HttpClient</span><span style="color: Gray;"> </span><span style="color: Blue;">httpClient</span><span style="color: Gray;"> = </span><span style="color: Green;">new</span><span style="color: Gray;"> </span><span style="color: Blue;">HttpClient</span><span style="color: Olive;">(</span><span style="color: Green;">new</span><span style="color: Gray;"> </span><span style="color: Blue;">SimpleHttpConnectionManager</span><span style="color: Olive;">(</span><span style="color: Green;">true</span><span style="color: Olive;">))</span><span style="color: Gray;">;</span></li></ol></div>
<p>具体可见HttpClient源码和API文档。</p>
<p>当然，使用HttpClient的多线程连接管理器时就不用这么做了。</p>
]]></content:encoded>
			<wfw:commentRss>http://guoyong.org/2010/02/02/572/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>再次遭遇大量CLOSE_WAIT</title>
		<link>http://guoyong.org/2010/01/22/543</link>
		<comments>http://guoyong.org/2010/01/22/543#comments</comments>
		<pubDate>Fri, 22 Jan 2010 12:51:05 +0000</pubDate>
		<dc:creator>wolfg</dc:creator>
				<category><![CDATA[Dev]]></category>
		<category><![CDATA[SysAdmin]]></category>
		<category><![CDATA[CLOSE_WAIT]]></category>
		<category><![CDATA[HttpClient]]></category>
		<category><![CDATA[jetty]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[tcp]]></category>

		<guid isPermaLink="false">http://guoyong.org/?p=543</guid>
		<description><![CDATA[今天下午线上的Jetty服务又停止响应了。不过与上次不同的是，日志里没有Too many open files的问题（看来ulimit设置管用了），看不出任何问题。于是用netstat检查网络连接，发现了大量CLOSE_WAIT状态的连接，而且都是连接到同一个IP地址。联想到程序里有调用外部网站服务的部分，检查这个IP，正是其中的一个服务。检查代码，发现开发人员使用Commons HttpClient时出了问题，居然忘记关闭连接了(method.releaseConnection();)！！后果就是对方关闭了连接，连接不断地变成CLOSE_WAIT状态，直到耗尽所有的网络资源，没法再建立连接了。 从这个教训看出，项目的研发管理真是没有到位啊！快速反复的需求、几乎可以忽略的设计、缺少代码走查、没有单元测试，怎能保证上线前发现这样的问题！]]></description>
			<content:encoded><![CDATA[<p>今天下午线上的Jetty服务又停止响应了。不过与上次不同的是，日志里没有Too many open files的问题（看来ulimit设置管用了），看不出任何问题。于是用netstat检查网络连接，发现了大量CLOSE_WAIT状态的连接，而且都是连接到同一个IP地址。联想到程序里有调用外部网站服务的部分，检查这个IP，正是其中的一个服务。检查代码，发现开发人员使用Commons HttpClient时出了问题，居然忘记关闭连接了(method.releaseConnection();)！！后果就是对方关闭了连接，连接不断地变成CLOSE_WAIT状态，直到耗尽所有的网络资源，没法再建立连接了。</p>
<p>从这个教训看出，项目的研发管理真是没有到位啊！快速反复的需求、几乎可以忽略的设计、缺少代码走查、没有单元测试，怎能保证上线前发现这样的问题！</p>
]]></content:encoded>
			<wfw:commentRss>http://guoyong.org/2010/01/22/543/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

