다음과 같습니까? 각 엔트리 (동작 또는 주석 IO)는 여러 가지 방법으로 처리 할 수있는 경우는 해당 경쟁없이 다수의 소비자가 이용 병렬화 할 수 있으므로Disruptor 패턴을 사용하는 경우와 작업을 도용하면서 로컬 스토리지를 사용할 때?
- disruptor pattern 더 나은 병렬 성능 확장 성을 갖는다.
- 반대로, 항목을 국지적으로 저장하고 다른 스레드로부터 항목을 도용하는 경우, 항목을 단일 방식으로 만 처리해야하는 경우 병렬 성능과 확장 성이 향상됩니다 (항목을 disruptoint에서 다중 스레드로 분리하여 분배해야하기 때문입니다). 패턴은 경합을 일으킨다.
내 (그리고는 여전히 훨씬 더 빨리 다른 잠금없는 멀티 생산자 다중 소비자 큐 이상 (예를 들어 from boost) 여러 생산자 (즉이 CAS operations)가 참여?를 교란 패턴입니다) 자세히 상황 :
항목을 처리하면 결국 여러 가지 새로운 항목이 생성 될 수 있습니다. 성능은 FIFO 우선 순위로 처리되는 항목의 우선 순위가 가장 높습니다.
현재 구현에서 각 스레드는 로컬 FIFO를 사용하여 새로운 항목을 추가합니다. 유휴 스레드는 다른 스레드의 로컬 FIFO에서 작업을 도용합니다. 스레드의 처리 사이의 종속성은 잠금이없는 mechanically sympathetic 해시 테이블 (버킷 입도로 작성시 CAS)을 사용하여 해결됩니다. 이는 경쟁률이 매우 낮지 만 FIFO 순서가 깨지는 경우가 있습니다.
Disruptor 패턴을 사용하면 FIFO 순서가 보장됩니다. 그러나 엔트리를 쓰레드에 분산시키지 않으면 작업 도용 (예 : 각 쓰레드의 처리량이 거의 같음)이있는 로컬 FIFO보다 훨씬 더 높은 경쟁 (예 : 읽기 커서에서 CAS)이 발생합니까?
참조 나는 해체 작업 분포를 포함하지 않는 the standard technical paper on the disruptor (장 + 6 5)에
성능 테스트를 발견했습니다.
https://groups.google.com/forum/?fromgroups=#!topic/lmax-disruptor/tt3wQthBYd0은 disruptor + work stealing에서 찾은 유일한 참고 자료입니다. 공유 상태가있는 경우 스레드 당 대기열이 매우 느려지지만 세부 사항을 설명하거나 이유를 설명하지 않습니다. 나는이 문장이 내 상황에 적용되는 것을 의심한다.
- 공유 상태가 잠금없는 해시 테이블로 해결되었다.
- 소비자 사이에 항목을 분리하여 배포해야하는 경우.
- 업무용을 제외하고 각 스레드는 로컬 큐에서만 읽고 씁니다.
답장을 보내 주셔서 감사합니다. 불행히도 메시지 초점과 업무 초점의 차이점을 알 수없는 패러다임 사운드를 기반으로 구별을하십시오. – DaveFar
나는 혼란에 대한 나의 문제에 대한 해결책을 설계했다. 한 소비자는 해쉬 값으로 (여러) 방해 요소에 엔트리를 주석 처리하고 다른 소비자는 로컬 해시 테이블에 넣고 엔트리에 플래그가 있는지 주석을 붙인다. 벌써 해시 테이블. 이 솔루션은 빠를 수 있지만 잠금없는 해시 테이블처럼 스레드 수에 따라 선형 적으로 확장되지 않습니다.새로 생성 된 모든 항목에 대해 FIFO를 구현하는 또 다른 장애 요인은 여러 생산자가 있으므로 중재자가 구현의이 부분을 개선할지 여부는 확실하지 않습니다. – DaveFar
Btw, 내 작업은 분명히 다양한 기간이지만 메시지 처리 순서는 다소 중요합니다 ... – DaveFar