2014-09-19 2 views
0

기본적으로 Jetty의 스레드 풀은 스레드 풀이 채워지면 무제한 대기열로 구현됩니다. 대기열의 크기를 제한하고 싶습니다. BlockingArrayQueue에 대한 생성자가 있는데 maxCapacity 값이 있지만 jetty.xml을 사용하여 호출 할 방법이 없습니다. Jetty 9부터는 스레드 풀에 대한 설정자가 org.eclipse.jetty.server.Server인데 이미 인스턴스화 된 스레드 풀에 대한 참조 만 가져올 수 있습니다 (this answer 참조). QueuedThreadPool의 큐 필드 설정자는 UnsupportedOperationException을 던져 생성자 삽입을 사용합니다. 그러나 스레드 풀을 돌연변이시킬 수는 있지만 서버 인스턴스에 새 스레드 풀을 설정하지 않으면 불가능합니다. 스레드 풀을 생성자 arg로 정의하려고 시도하면 다음 경고가 발생합니다.Jetty 9의 jetty.xml을 통한 대기열 제한 설정 Maven Plugin

2014-09-22 13:15:13.688 : 경고 : oejx.XmlConfiguration : main : 무시 된 arg : | 200501000 | 6000 | 거짓 |

이것은 제티 메이븐 플러그인 v9.2.2.v20140723입니다. 여기 내 pom.xml 파일의 구성은 다음과 같습니다

<configuration> 
     <jettyXml>${basedir}/jetty.xml</jettyXml> 
     <stopKey>x</stopKey> 
     <stopPort>7999</stopPort> 
     <requestLog implementation="org.eclipse.jetty.server.NCSARequestLog"> 
     <append>true</append> 
     </requestLog> 
     <webApp> 
     <war>${basedir}/target/app</war> 
     <contextPath>/app</contextPath> 
     </webApp> 
     <scanTargets> 
     <scanTarget>${basedir}/src/main/webapp/WEB-INF/</scanTarget> 
     </scanTargets> 
     <reload>manual</reload> 
    </configuration> 

답변

3

업데이트 : [서버 생성자는 당신이 불행하게도, you cannot configure the Server constructor from within jetty-maven-plugin, 스레드 풀을 구성하는 방법입니다. 이것은 jetty-maven-plugin의 범위를 벗어납니다.


부두 9 스레드 풀

이제 Constructor of the Server 인스턴스의 설정입니다.

XML을 사용하면 다시 구성 할 수 있습니다. documented in the jetty.xml itself입니다.

자유롭게 변경할 수 있습니다. 한계가 너무 낮 으면 바운드 스레드 풀이 문제를 일으키는 것으로 알려져 있습니다.

다음은 편리한 냅킨 수식입니다.

최대 스레드 ((CPU 코어 (수) 4) * (커넥터 수) *) + (최대 동시 요청) 실제로

400에서 가장 값도 약간 당신에게 문제를 일으킬거야 = 바쁜 서버. 이 문구를 400을 시작하기 좋은 출발점으로 생각하지 마십시오. 이는 서버에 대한 행복한 가치를 찾을 때까지 매우 부적절하고, 테스트하고, 모니터링하고, 계속 조정해야합니다. (로드 스파이크를 테스트하는 것을 잊지 말고 데이터베이스가 실패 할 때 어떤 일이 발생하는지)

성능의 상한선을 설정해야한다고 생각하면 premature optimization의 형태가됩니다.

Jetty가 사용하는 QueuedThreadPool은 언 바운드 임에도 불구하고 자체적으로 정리되고 풀에서 스레드를 제거하므로 서버가 갑작스러운로드를 처리하고로드가 잠길 때 다시 백 오프 할 수 있습니다.

메모리 또는 기타 관련 리소스가 염려되는 경우 Android 2.3 (진저 브레드) (참고 : Jetty 7 w/QTP), Android 4.4 (Jetty 9) 및 Raspberry Pi (7 번에서 9 번).

마지막으로 허용 대기열 크기를 설정하는 방법입니다.

구성하십시오 ServerConnector

<Set name="acceptQueueSize">40</Set> 

기본값은 0이며, 가장 낮은 수준에서 ServerSocketChannel.bind(SocketAddress,int) 호출에서 backlog 매개 변수 관련 (보통 etc/jetty-http.xml에 있음).

+0

답장을 보내 주셔서 감사합니다. 나는 https://wiki.eclipse.org/Jetty/Howto/High_Load뿐만 아니라 내 dev에이 버그를 재현하려고 : https : //이 문서를 기반으로 대기열 크기를 설정의 가능성을 찾고 있었어 : // bugs.eclipse.org/bugs/show_bug.cgi?id=444031. 실제로 스레드 풀을 업데이트하는 것과 관련하여 jetty.xml에서 제안한 내용을 시도했지만 경고 메시지가 나타납니다. 경고 : oejx.XmlConfiguration : main : 무시한 arg : <새 ID Cameron

+0

wiki.eclipse.org는 부두 7과 8을위한 것입니다. 부두 9.이 아닙니다 (위키의 맨 위에 표시되어 있습니다). –

+0

그 무시 무시한 인수에 대한 유일한 이유는 xml이 실행되기 전에 서버를 구성하는 것이있는 경우입니다. (더 알고 싶다면 startup/configuration/$ {jetty.base}에 대한 세부 사항이 필요합니다.) 그러나 이제는이 논평 섹션의 범위를 벗어났습니다. jetty-users 메일 링리스트에 질문을하십시오. –

1

우리는 서버가 무한정 대기열에 대기하는 대신 모든 스레드가 사용 중이면 서버가 요청을 거부하기를 원할 때 비슷한 문제에 봉착했습니다.

저는 이것이 진짜라고 생각합니다. 다음은 접근 방식입니다.

기본 풀 크기를 오버라이드하거나 제티 서버에 입력 할 수 없기 때문에. 우리는 커스텀 ServerConnector를 작성했습니다. 여기서 여러분은 큐 크기 나 executor를 설정할 수 있습니다.

jetty.addServerCustomizers((Server server) -> { 
    LinkedBlockingQueue<Runnable> queue = new LinkedBlockingQueue< (maxQueueSize); 
    ExecutorService exceutorService = 
     new ThreadPoolExecutor(minThreads, maxThreads, 1, 
      TimeUnit.HOURS, queue); 

    // extract host and port from existing connector... 
    String host = "0.0.0.0"; 
    int port = 1900; 
    for (Connector c : server.getConnectors()) { 
     if (c instanceof ServerConnector) { 
      host = ((ServerConnector) c).getHost(); 
      port = ((ServerConnector) c).getPort(); 
     } 
    } 


    ServerConnector connector = new ServerConnector(server, exceutorService, null, null, -1, -1, new HttpConnectionFactory()); 
    connector.setHost(host); 
    connector.setPort(port); 
    server.setConnectors(new Connector[] { connector }); 
} 

단점 우리가 서버 시작 인 - 불구하고 정확한 구성 실패한 임의의 결과를 제공하는 데 사용한 것과 동일한 시도 부두가 대기중인 스레드를 기대하고 있기 때문에

1

). 그 행동은 예측할 수 없었습니다.

2) ExecutorService는 Threadpool을 구현하지 않으므로 Jetty의 메트릭 컬렉션 플러그인이 제대로 작동하지 않을 수 있습니다.

생산에 성공하면이 답변이 업데이트됩니다.