일부 병렬 계산을 실행하는 데 특별히 사용되는 Linux 시스템이 있고 스케줄러 및 기타 매개변수를 선택/조정하여 성능을 극대화하는 방법을 이해하려고 합니다(이것은 AWS를 사용하여 배포되므로 여전히 몇 가지 옵션이 있습니다). 중요한 경우 Linux 배포판을 무엇을 사용해야 하는지에 대해).
계산의 여러 부분 사이에 약간의 미묘한 종속성이 있기 때문에 계산을 Java로 구현했습니다(전체적으로 약 5K개의 "작업"이 있지만 하나의 작업은 실행 중에 여러 지점에서 다른 작업으로부터 정보를 가져와야 하는 경우가 많습니다). 나는 이를 수행하는 두 가지 방법을 고려하고 싶습니다.
현재 구현
현재 구현에서는 스레드 수는 코어 수와 동일하며 각 스레드는 정보를 기다리지 않는 작업을 선택하고 일부 누락된 정보로 인해 중지될 때까지 처리한 후 작업 임무를 폐기합니다. 그리고 또 다른 미션을 받아보세요. 이는 계산이 완료될 때까지 계속됩니다.
여기서 각 CPU는 항상 단일 스레드에 바인딩될 것으로 예상됩니다.스케줄러에게 시간 분할을 수행하지 말라고 "말"해야 합니까, 아니면 자연스럽게 발생합니까? 어떻게 확실히 알 수 있나요?
또 다른 가능한 구현
컴퓨팅 작업을 선택하고 제거하는 대신 Java wait()
및 패러다임을 사용하여 각 "작업"이 자체 스레드를 갖도록 이를 변경할 수 있습니다 . notify()
이 변경의 타당성에 대해 자유롭게 의견을 주시기 바랍니다(96 코어 시스템에는 5K 작업 = 스레드가 있으며 속도를 높일 수 있다면 더 작을 수도 있습니다). 하지만 더 중요한 것은 제가 이것을 구현했다고 가정해 보겠습니다.
wait()
강제 로 호출하지 않는 한 스케줄러에게 가능한 가장 큰 시간 조각을 사용하도록 지시하려면 어떻게 해야 합니까 notify()
? Java 사용에 도움을 주실 수 있나요 yield()
?
관련 참고자료
이 답변일정 계획 및 참조에 대한 유용한 배경 지식이 있습니다.이것그리고이것조정 가능한 매개변수가 더 있습니다. 후자는 특히 위의 "현재 구현"에서 프로세서 수를 확장하려고 할 때 발견한 대기열 경합을 언급합니다.
부록 이것유닉스(및 리눅스?)에는 시간 조각이 전혀 없으며 스레드가 중단될 수 있는 유일한 방법은 우선 순위가 더 높은 스레드에 의해 "선점"되거나 일부 차단 작업을 시작하는 것입니다. 이게 정말 사실인가요?
매우 감사합니다!
답변1
Java에서 1:1 스레딩 모델이 보장되는지 잘 모르겠습니다. 이는 Java 스레드가 운영 체제 스레드를 나타낼 수도 있고 나타내지 않을 수도 있음을 의미합니다. 여러 Java 스레드가 Java 런타임 환경에 의해 관리되고 운영 체제에 더 적은 수의 스레드로 표시될 수 있습니다. 이것은 실제로 구현에 따라 다릅니다. 1:1 관계를 보장하려면 낮은 수준의 언어(C 또는 Rust)를 사용하는 것이 좋습니다.
시간 분할이 중요하므로 실시간 우선 순위도 선택하는 것이 좋습니다.setpriority()
이를 통해 몇 가지 흥미로운 일정 전략에 액세스할 수 있습니다. SCHED_FIFO
시간 분할을 피하려면 이 전략을 사용하십시오 . 이렇게 하면 우선 순위가 더 높은 스레드가 대기열에 추가되지 않는 한 스레드가 완료되기 전에 중단되지 않습니다. 모든 5,000개 스레드의 우선순위가 동일한 경우 컨텍스트 전환을 최소화하는 사실상 선입선출 솔루션입니다. 바라보다sched(7)
더 알아보기.
스레드는 완료되거나 호출될 때까지 중단되지 않습니다.read()
읽을 준비가 되었을 때 크로스 스레드 통신을 나타내는 뮤텍스 또는 기타 파일을 나타내는 FD에서. 이 시점에서 다른 스레드가 실행될 기회를 얻는 동안 스레드가 차단됩니다.
그래서 5,000개의 스레드를 사용하고 단순히 대기열에 추가한다는 아이디어는 좋은 생각이라고 생각합니다.
한 가지 함정은 커널과 관련이 있습니다 -rt
. 이는 성능을 희생하면서 스레드 깨우기 시간의 정확성을 향상시키는 선제적 스케줄링을 제공합니다(CPU 대기열을 조기에 지우기). 이러한 낮은 수준의 질문에 대해서는 귀하가 성능을 최대화하려고 한다고 가정하므로 이것이 효과가 없을 것입니다.