之前使用的是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)
不知道是不是和版本升级有关系,请各位达人帮忙看看,非常感谢!
PHP中文网2017-04-17 15:30:19
먼저 close_wait가 무엇인지 알아야 합니다. 둘 다 일정 시간 동안 연결을 유지합니다. 거의 모든 운영 체제에는 단일 프로세스의 핸들 수(연결 수)에 대한 제한이 있습니다. 예를 들어 대부분의 Linux 시스템의 기본 제한은 1024입니다.
예
어느 날 성격이 폭발하여 갑자기 1,000명의 사람들이 웹 사이트를 방문하면 Tomcat은 이러한 요청을 처리하기 위해 1,000개의 연결을 소비합니다
요청이 반환되면 이 1000개의 연결은 즉시 삭제되지 않지만 모두 대기 상태
이때 또 1,000명이 귀하의 웹사이트를 방문했지만(귀하의 캐릭터가 계속해서 폭발하고 있습니다), 이전 1,000명의 연결이 새로운 요청을 수락할 수 없어(모두 대기 상태), 이제 24개의 연결만 남았습니다. 이용 가능하니 나머지 976명은 오랜 기다림에 갇혀있습니다. . . .
5분 후 처음 1000개의 연결이 점차적으로 해제되고 이제 1000개의 연결을 더 사용할 수 있습니다
안타깝게도 기다리던 976명이 거의 떠나고 3명만 남았습니다. 하지만 좋은 소식은 연결이 가능하기 때문에 모두 즐겁게 플레이할 수 있다는 것입니다.
이 시점에서는 대기 중인 연결이 너무 많아 사용 가능한 연결이 압도되기 때문에 문제가 발생한 원인도 이해했다고 생각합니다.
그러므로 최적화 방법에 대한 답은 매우 간단합니다. 대기를 비활성화하고 반환 후 즉시 연결을 닫아 사용 가능한 연결이 되도록 하십시오.
Tomcat을 예로 들어
으아아아keepAliveTimeout="0"이 핵심입니다. 다른 서버에도 관련 구성이 있을 것입니다. 관심이 있으시면 직접 문서를 확인하세요.