어떤 사람들은 두 개의 스레드가 너무 많다고 말할 것입니다 -나는 그 캠프에 있지 않습니다 :-)
내 조언은 다음과 같습니다. 측정, 추측하지 마십시오. 한 가지 제안은 구성 가능하게하고 처음에는 100으로 설정 한 다음 소프트웨어를 공개적으로 배포하고 발생하는 상황을 모니터링하는 것입니다.
스레드 사용량이 3으로 정점에 도달하면 100이 너무 큽니다. 하루 종일 100으로 유지되면 최대 200까지 충돌하여 어떻게되는지 확인하십시오.
당신은 할 수 실제로 자체 사용을 모니터링하고 시작하지만 아마 잔인한 다음에 대한 구성을 조정하여 코드가 있습니다.
설명과 정교함 :
나는 자신의 스레드 풀링 하위 시스템을 롤링하는 것을 옹호하지 않습니다. 그러나 스레드에 대한 적절한 컷오프 지점을 요청했기 때문에 스레드 풀 구현에 생성 된 최대 스레드 수를 제한 할 수 있다고 가정합니다 (좋은 것입니다).
스레드 및 데이터베이스 연결 풀링 코드를 작성했으며 다음과 같은 기능이 있습니다 (성능에 필수적이라고 생각합니다).
- 최소 활성 스레드 수
- 최대 스레드 수
- 한동안 사용되지 않은 스레드를 종료합니다.
첫 번째는 스레드 풀 클라이언트 측면에서 최소 성능에 대한 기준을 설정합니다 (이 스레드 수는 항상 사용 가능합니다). 두 번째는 활성 스레드의 자원 사용에 대한 제한을 설정합니다. 세 번째는 리소스 사용을 최소화하기 위해 조용한 시간에 기준선으로 돌아갑니다.
사용하지 않는 스레드 (A)의 리소스 사용량과 작업을 수행하기에 충분한 스레드가없는 리소스 사용량 (B)의 균형을 유지해야합니다.
(A)는 일반적으로 메모리 사용량 (스택 등)입니다. 작업을 수행하지 않는 스레드는 많은 CPU를 사용하지 않기 때문입니다. (B)는 일반적으로 스레드가 사용 가능할 때까지 기다려야 요청이 도착할 때 처리가 지연됩니다.
당신이 측정하는 이유입니다. 당신이 말한대로, 대다수의 스레드는 데이터베이스에서 응답을 기다리고 있으므로 실행되지 않습니다. 허용해야하는 스레드 수에 영향을주는 두 가지 요소가 있습니다.
첫 번째는 사용 가능한 DB 연결 수입니다. DBMS에서 증가시킬 수 없다면 이는 어려운 한계 일 수 있습니다. DBMS가이 경우 무제한 연결을 취할 수 있다고 가정합니다 (이상적으로 측정해야 함).
그런 다음 스레드 수는 과거 사용에 따라 다릅니다. 달리는 최소값은 달리 한 최소값 + A %입니다 (예 : A와 같이 구성 가능). 5.
최대 스레드 수는 이전 최대 + B % 여야합니다.
또한 동작 변경을 모니터링해야합니다. 어떤 이유로 든 사용량이 상당한 시간 동안 100 % 사용 가능하게되어 (클라이언트 성능에 영향을 줄 수있는 경우) 다시 한번 B % 더 높아질 때까지 허용 된 최대 값을 늘려야합니다.
"무엇을 정확하게 측정해야합니까?" 질문:
구체적으로 측정해야하는 것은로드 상태에서 동시에 사용하는 최대 스레드 수입니다 (예 : DB 호출에서 리턴 대기 중). 그런 다음 예 를 들어 안전율 10 %를 추가하십시오 (다른 포스터는 내 권장 사항을 예로 들었으므로 강조했습니다).
또한 이는 프로덕션 환경에서 조정을 위해 수행해야합니다. 미리 견적을 받아도 괜찮지 만 어떤 프로덕션이 방해가 될지 모릅니다 (이러한 모든 것들이 런타임에 구성 가능해야하는 이유). 이는 예기치 않은 클라이언트 호출 배가와 같은 상황을 포착하기위한 것입니다.