2011-03-15 2 views
1

응답이없는 웹 응용 프로그램의 스택 추적을 검토 한 결과, 일부 데이터는 어떻게 생각했는지와 일치하지 않음을 알았습니다."Tomcat Endpoint"Waiting On Object Monitor의 의미는 무엇입니까?

상황은

응용 프로그램이 느린 URL을 연속해서 타격을 받고있다. 이러한 요청이 쌓여서 앱 서버에 교통 체증을 일으키는 것으로 보입니다. 로깅은 스레드 수/http 커넥터가 최대 값을 초과했음을 나타냅니다 (사용중인 스레드 수가 maxThreads 값인 120까지 올라갔습니다).

  • 제이 보스 4.2.2
  • 은 '제이보스 - 웹'

질문

스레드의 대부분은 "뭔가를하고"있다라고 바람둥이 6.0의 변형을 사용합니다 - 즉 데이터베이스에서 읽기, 출력 스트림에 쓰기 등등. 스레드 중 50 개 이상은 "새 소켓을 제공하기 위해 커넥터에서 대기 중"입니다 (주석에서)

정확히 비 - 소켓 프로그래머? - 응답을 요청을 얻을 몇 가지 작업을 수행하고 쓰기 - 그리고 하지 필요

잘못된 나는 각 HTTP 스레드가 '자신의 일을'것이라고 가정했다 :

내 전 가정

아무것도 기다리지.

그래서 ...

  • 을 무슨 일이야? 누군가가 소켓 같은 것을 분명히 할 수 있을까요?
  • 바람둥이 설정에 어떤 병목 현상이 있습니까? Tomcat의 org.apache.tomcat.util.net.JIOEndpoint

    에서 **

    "http-0.0.0.0-80-90" daemon prio=6 tid=0x695e1400 nid=0x24c in Object.wait() [0x6e8cf000] 
        java.lang.Thread.State: WAITING (on object monitor) 
        at java.lang.Object.wait(Native Method) 
        - waiting on <0x09c34480> (a org.apache.tomcat.util.net.JIoEndpoint$Worker) 
        at java.lang.Object.wait(Object.java:485) 
        at org.apache.tomcat.util.net.JIoEndpoint$Worker.await(JIoEndpoint.java:416) 
        - locked <0x09c34480> (a org.apache.tomcat.util.net.JIoEndpoint$Worker) 
        at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:442) 
        at java.lang.Thread.run(Thread.java:619) 
        Locked ownable synchronizers: 
        - None 
    

    코드 조각을

** 스택 추적을 (예 : 등, 하나 감소,이 설정을 증가)

 /** 
    * Process an incoming TCP/IP connection on the specified socket. Any 
    * exception that occurs during processing must be logged and swallowed. 
    * <b>NOTE</b>: This method is called from our Connector's thread. We 
    * must assign it to our own thread so that multiple simultaneous 
    * requests can be handled. 
    * 
    * @param socket TCP socket to process 
    */ 
    synchronized void assign(Socket socket) { 

     // Wait for the Processor to get the previous Socket 
     while (available) { 
      try { 
       wait(); 
      } catch (InterruptedException e) { 
      } 
     } 

     // Store the newly available Socket and notify our thread 
     this.socket = socket; 
     available = true; 
     notifyAll(); 

    } 

감사

답변

4

maxNumThreads 설정은 서블릿 컨테이너의 PERFO에 영향을주지 않습니다 (스레드가 활성화 된 경우) 더 큰 힙과 CPU 사이클이 필요하지 않습니다. 그러나 설정을 150보다 큰 숫자로 수정할 때마다 응용 프로그램의 병목 현상이 발생할 수 있습니다.

웹 서버는 100 개가 넘는 동시 요청을 처리하도록 설계되지 않았습니다. 이러한 상황에 처한 경우 클러스터링을 고려하십시오. 난 당신이 jbossweb를 사용하고보고 정말 좋은 기사는 여기에 있습니다 :

http://refcardz.dzone.com/refcardz/getting-started-jboss

을하지만, 난 당신이 100 개 이상의 동시 요청을 생각하지 않는 한, 나는 그것이 응용 프로그램에서 병목 현상이라고 생각합니다.확인할 사항은 jdbc 드라이버, 사용하는 jdk 버전, tomcat 버전 (경우 6.0)입니다. 응용 프로그램에 대한 요청은 1 초 이내에 완료되어야합니다 (네트워크 대기 시간이 너무 길어서 지연이 너무 길 것입니다). 더 많은 정보를 얻는다면 아마 코드 어딘가에있을 것입니다. 수동으로 데이터베이스 연결을 닫거나 열지는 않습니까? 백그라운드에서 효율적인 스레딩을 사용합니까? JMS를 사용합니까? 그것이 보통 보는 것입니다. 다른 하나는 특정 서블릿 컨테이너 버전의 버그 일 수 있습니다.

P.S 최대 스레드 수를 늘리려면 스레드 스택 크기를 줄이거 나 늘리면 성능에 어떤 영향을 미치는지보십시오. 스레드가 오랫동안 살아 있다면 (그러지 않아야 함) 스택 크기를 늘려야 할 수 있습니다. 수명이 짧은 스레드가있는 경우 비트 메모리를 보존하려면 스택 크기를 줄이십시오. -Xss가 플래그입니다.

또한 jboss AS 버전을 사용하고 있습니다. 그것도 확인하십시오. 이제 증상을 살펴 보았습니다. 문제가 구성 파일의 어딘가에 있다고 생각합니다.