여러 제작자, 단일 소비자 모델 (여러 스레드가 단일 파일 작성자 스레드에 메시지 보내기)가있는 응용 프로그램을 작성하고 있습니다.여러 제작자/단일 소비자 모델에서 최적의 휴면 시간
각 제작자 스레드에는 쓰기 작업을 수행하는 대기열과 소비자가 읽을 수있는 대기열이 있습니다. 소비자 스레드의 모든 루프는 각 제작자를 반복하고 해당 제작자의 뮤텍스를 잠그고 큐를 스왑하고 잠금을 해제하고 제작자가 더 이상 사용하지 않는 큐에서 씁니다.
소비자 스레드의 루프에서 모든 생산자 스레드를 처리 한 후 지정된 시간 동안 대기합니다. 내가 즉각적으로 알아 차린 사실 중 하나는 제작자가 대기열에 무언가를 쓰고 리턴하는 속도가 (1x 생산자 스레드에서 2로 이동할 때) 5 배로 급격히 증가했다는 것입니다. 더 많은 스레드가 추가되면이 평균 시간은 하단 아웃 - 10 명의 프로듀서 대 15 명의 프로듀서와의 시간 차이는 크지 않습니다. 이는 더 많은 프로듀서가 처리 할 때 프로듀서 스레드의 뮤텍스에 대한 경합이 적기 때문일 수 있습니다.
불행히도, < 5 개의 생산자를 갖는 것은 응용 프로그램에 대한 상당히 일반적인 시나리오이며, 수면 시간을 최적화하여 생산자가 얼마나 많은지에 관계없이 합리적인 성능을 얻고 싶습니다. 나는 수면 시간을 늘림으로써 낮은 생산자 수에 대해서는 더 나은 성능을 얻을 수 있지만 많은 생산자 수에 대해서는 더 나쁜 성능을 얻을 수 있음을 발견했습니다.
다른 사람이이 문제가 발생 했습니까? 그렇다면 해결책은 무엇입니까? 스레드 수와 함께 절전 시간을 늘리려고했지만 다소 특정 시스템의 예심과 오류가있는 것처럼 보입니다.
1 : 근본적인 문제는 먼저 –
내가 하나의 큐가 내 주요 우선 순위는 큐에 생산 기록을 가지고와 (코드입니다 가능한 한 빨리 완료 할 수있는 것을했다하지 않은 이유에 대해 이야기한다 로깅 라이브러리). 어쩌면 내가 이것을 overteninking하고 하나의 대기열 * 같은 * 빠른 것입니다 -하지만 이상적으로 로거 어디서나 몇 40-50 스레드에서 지원할 것입니다. 많은 큐의 경우 하나의 큐 잠금을 위해 경합하는 40-50 개의 스레드 대신 동일한 리소스에 대해 2 개의 스레드가 경쟁합니다. 세마포어에 대한 아이디어가 마음에 들지만, 아마 그 일에 대해 "올바른"방식이라고 생각합니다. –