java - tomcat不定期close_wait过多
天蓬老师
天蓬老师 2017-04-17 15:28:19
0
2
860

之前使用的是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)

不知道是不是和版本升级有关系,请各位达人帮忙看看,非常感谢!

天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

모든 응답(2)
Ty80

먼저 close_wait가 무엇인지 알아야 합니다. 둘 다 일정 시간 동안 연결을 유지합니다. 거의 모든 운영 체제에는 단일 프로세스의 핸들 수(연결 수)에 대한 제한이 있습니다. 예를 들어 대부분의 Linux 시스템의 기본 제한은 1024입니다.

  1. 어느 날 성격이 폭발하여 갑자기 1,000명의 사람들이 웹 사이트를 방문하면 Tomcat은 이러한 요청을 처리하기 위해 1,000개의 연결을 소비합니다

  2. 요청이 반환되면 이 1000개의 연결은 즉시 삭제되지 않지만 모두 대기 상태

  3. 이때 또 1,000명이 귀하의 웹사이트를 방문했지만(귀하의 캐릭터가 계속해서 폭발하고 있습니다), 이전 1,000명의 연결이 새로운 요청을 수락할 수 없어(모두 대기 상태), 이제 24개의 연결만 남았습니다. 이용 가능하니 나머지 976명은 오랜 기다림에 갇혀있습니다. . . .

  4. 5분 후 처음 1000개의 연결이 점차적으로 해제되고 이제 1000개의 연결을 더 사용할 수 있습니다

  5. 안타깝게도 기다리던 976명이 거의 떠나고 3명만 남았습니다. 하지만 좋은 소식은 연결이 가능하기 때문에 모두 즐겁게 플레이할 수 있다는 것입니다.

이 시점에서는 대기 중인 연결이 너무 많아 사용 가능한 연결이 압도되기 때문에 문제가 발생한 원인도 이해했다고 생각합니다.
그러므로 최적화 방법에 대한 답은 매우 간단합니다. 대기를 비활성화하고 반환 후 즉시 연결을 닫아 사용 가능한 연결이 되도록 하십시오.

Tomcat을 예로 들어

으아아아

keepAliveTimeout="0"이 핵심입니다. 다른 서버에도 관련 구성이 있을 것입니다. 관심이 있으시면 직접 문서를 확인하세요.

刘奇

시스템 핸들 제한 수정 및 시스템 TCP 시간 초과 설정

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿