之前使用的是apache-tomcat-7.0.26+jdk1.6.0_31运行很久了,算是正常,因为有时候也会出现close_wait过多问题,大约2-3千吧,然后就自动恢复了。
现在升级版本到apache-tomcat-8.0.9+jdk1.7.0_72运行7-8个小时就要重启,不然就报close_wait超高一万多个,然后就报socket connect timeout,必须重启,时间也不确定就是7-8个小时,有时长点十多个小时,不一定。查看tomcat的catalina.out有大量下面错误:
27-Oct-2015 22:25:33.621 INFO [pool-1300-thread-1] org.apache.coyote.AbstractProcessor.setErrorState An error occurred in processing while on a non-container thread. The connection will be closed immediately
java.io.IOException: APR error: -32
at org.apache.coyote.http11.InternalAprOutputBuffer.writeToSocket(InternalAprOutputBuffer.java:292)
at org.apache.coyote.http11.InternalAprOutputBuffer.writeToSocket(InternalAprOutputBuffer.java:245)
at org.apache.coyote.http11.InternalAprOutputBuffer.flushBuffer(InternalAprOutputBuffer.java:214)
at org.apache.coyote.http11.AbstractOutputBuffer.flush(AbstractOutputBuffer.java:306)
at org.apache.coyote.http11.AbstractHttp11Processor.action(AbstractHttp11Processor.java:763)
at org.apache.coyote.Response.action(Response.java:177)
at org.apache.catalina.connector.OutputBuffer.doFlush(OutputBuffer.java:345)
at org.apache.catalina.connector.OutputBuffer.flush(OutputBuffer.java:313)
at org.apache.catalina.connector.CoyoteOutputStream.flush(CoyoteOutputStream.java:110)
at net.bull.javamelody.FilterServletOutputStream.flush(FilterServletOutputStream.java:52)
at sun.nio.cs.StreamEncoder.implFlush(StreamEncoder.java:297)
at sun.nio.cs.StreamEncoder.flush(StreamEncoder.java:141)
at java.io.OutputStreamWriter.flush(OutputStreamWriter.java:229)
at java.io.PrintWriter.flush(PrintWriter.java:320)
at com.iyd.commons.bigpipe.Pagelet.writeValue(Pagelet.java:86)
at com.iyd.commons.bigpipe.Pagelet.call(Pagelet.java:78)
at com.iyd.commons.bigpipe.Pagelet.call(Pagelet.java:1)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
不知道是不是和版本升级有关系,请各位达人帮忙看看,非常感谢!
まず、close_wait が何であるかを理解する必要があります。この状態は time_wait に似ています。 どちらも一定期間接続を保持します。。ほとんどすべてのオペレーティング システムには、単一プロセスのハンドル数 (接続数) に制限があることがわかっています。たとえば、ほとんどの Linux システムのデフォルト制限は 1024 です。
例
ある日、あなたの個性が爆発して、突然 1,000 人が Web サイトにアクセスすると、Tomcat はこれらのリクエストを処理するために 1,000 の接続を消費します
リクエストが返されると、これら 1000 の接続はすぐには破棄されませんが、すべて待機状態になります
この時点で、さらに 1,000 人があなたの Web サイトにアクセスしています (キャラクターは爆発し続けています)。しかし、前の 1,000 人の接続は新しいリクエストを受け入れることができず (すべて待機状態になっています)、現在、接続は 24 つだけです。空いているので、残りの 976 人は長い待ち時間に陥っています。 。 。 。
5 分後、最初の 1,000 個の接続が徐々に解放され、さらに 1,000 個の接続が使用可能になります
残念ながら、待機中だった 976 人はほとんど退席しており、残っているのは 3 人だけです。しかし、良いニュースは、利用可能な接続があるため、全員が楽しくプレイできるということです。
この話のこの時点で、待機中の接続が多すぎて利用可能な接続が過剰になっていることが問題の原因であることも理解できたと思います。
では、どのように最適化するかというと、答えは非常に簡単です。待機を無効にし、戻った直後に接続を閉じて、使用可能な接続にします。
Tomcat を例に挙げます
リーリーkeepAliveTimeout="0" が重要であることに注意してください。興味がある場合は、ドキュメントを参照してください。
システム ハンドル制限を変更し、システム TCP タイムアウトを設定します