문제

저는 Jetty에서 서블릿(블로킹 IO 사용)으로 실행되는 편안한 웹 서비스를 개발 중입니다.최대 스레드에 대한 최적의 설정을 파악하는 것은 어려운 것 같습니다.

나머지 설정의 쉽게 측정할 수 있는 특성을 바탕으로 최대 스레드 수를 결정하기 위한 연구된 공식이 있습니까?

도움이 되었습니까?

해결책

매우 간단하고 원시적인 것:

max_number_of_threads = number_of_CPU * C

C는 애플리케이션의 다른 요소에 따라 달라집니다 :-)

다음 질문을 스스로에게 물어보세요.

  • 애플리케이션이 CPU를 많이 사용합니까(낮은 C) 아니면 세 번째 시스템(높은 C)을 기다리는 데 대부분의 시간을 소비합니까?
  • 더 빠른 응답 시간(낮은 C)이 필요합니까, 아니면 각 요청이 더 오래 걸리더라도 한 번에 많은 여러 사용자에게 서비스를 제공할 수 있습니까(높은 C).

보통 나는 C를 다소 낮게 설정합니다.2 - 10.

다른 팁

아니 없어.스레드 수를 제한하고 제어하여 시스템 리소스를 초과하지 않도록 하십시오. Java의 제한은 일반적으로 약 100-200개의 라이브 스레드입니다.

이를 수행하는 좋은 방법은 다음의 Executor를 사용하는 것입니다. java.util.concurrent.

이 질문을 받았을 당시에는 Servlet 3.0이 나오지 않은 것으로 알고 있습니다.하지만 저는 이 질문에서 Servlet 3.0을 사용하여 Servlet 컨테이너에서 비동기 처리를 수행할 수 있는 가능성을 기록해야 한다고 생각했습니다.이 질문을 접하는 사람에게 도움이 될 수 있습니다.말할 필요도 없이, 메인 서블릿 스레드가 이제 압박을 덜 받고 있음을 지적하는 서블릿 3.0에 대한 충분한 리소스가 있습니다!그리고 Jetty에는 그 자체로 Servlet 3.0 API를 사용하고 싶지 않은 경우를 대비해 Async 대응 항목이 있습니다.

대답은 처리할 것으로 예상되는 최대 동시 연결 수에 따라 다릅니다.예상하는 연결 수만큼 스레드를 허용해야 합니다.

andreasmk2의 스레드 수가 올바르지 않습니다.1000개의 스레드로 앱을 실행했는데 시스템 리소스에 문제가 없었습니다.물론 시스템의 세부 사항에 따라 다릅니다.당신은 체계 제한이 아닌 자바 한정.

내 문제는 동시 연결 수에 대한 합리적인 기대치를 형성하는 방법을 모른다는 것입니다.아마도 일부 서비스되는 요청이 너무 많아서 모든 것이 느려지는 것보다 새로운 연결을 거부하는 것이 더 좋습니다.

현실적인 작업량은 시뮬레이션하기 어렵기 때문에 다른 사람이 이미 연구한 공식을 찾고 있습니다.

(명백한 상한은 최대 힙 크기를 요청을 처리하는 데 필요한 최소 메모리 양으로 나눈 것이지만 가비지 수집기가 있는 환경에서는 이 값조차 측정하기 어렵습니다.)

감사해요.쉬운 공식은 없는 것 같아 이 글을 읽었습니다.:-(

(내 앱은 HTML5 유효성 검사기입니다.때로는 외부 서버에서 분명히 기다리고 있는 경우도 있습니다.그러나 실제로 자체적으로 CPU에 바인딩되거나 가비지 수집기를 통해 CPU에 바인딩되는 경우를 정확히 찾아내기는 어렵습니다.)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top