문제
Erlang 표준 라이브러리에 일종의 '로드-밸런서'가 있는지 아는 사람이 있습니까? 정말 큰 데이터 세트에 대해 정말 간단한 작업이 있으면 모든 항목에 대한 프로세스를 구성하는 오버 헤드가 순차적으로 작업을 수행하는 것보다 클 것입니다. 그러나 작업의 '올바른 숫자'의 균형을 맞출 수 있다면 더 잘 수행 될 것이므로 기본적 으로이 작업을 수행 할 수있는 쉬운 방법이 있는지 묻습니다.
그건 그렇고, OTP 응용 프로그램이 균형로드를하는지 아는 사람이 있습니까? OTP 응용 프로그램에는 "작업자 프로세스"(Java-ish Thread Worker와 같은)의 개념이 있습니까?
해결책
그만큼 plists
모듈은 아마도 당신이 원하는 것을 할 것입니다. 기본적으로 병렬 구현입니다 lists
모듈, 드롭 인 교체로 사용되는 설계. 그러나 예를 들어 얼마나 많은 작업자 프로세스를 생산 해야하는지를 정의하여 운영을 병렬화하는 방법을 제어 할 수 있습니다.
목록의 길이 또는 시스템의로드에 따라 일부 수의 근로자를 계산하여 할 것입니다.
웹 사이트에서 :
Plists는 Erlang 모듈 목록의 드롭 인 교체품으로 대부분의 목록 작업을 병렬로 만듭니다. CPU 결합 작업이있는 멀티 코어 머신 및 Erlang 노드에 걸쳐 클러스터 내부의 평행을 활용하기 위해 각 요소에서 IO- 결합 작업, 하위 목록에서 동시에 동작할 수 있습니다. 오류 및 노드 고장을 처리합니다. 오버 헤드를 최소화하면서 최적의 성능을 얻기 위해 구성, 조정 및 조정할 수 있습니다.
다른 팁
모듈을 참조하십시오 pg2
그리고 pool
.
pg2
매우 간단한 분산 프로세스 풀을 구현합니다. pg2:get_closest_pid/1
사용 가능한 경우 "가장 가까운"PID, 즉 임의의 로컬 프로세스, 그렇지 않으면 임의의 원격 프로세스를 반환합니다.
pool
모듈로 시작된 노드간에로드 밸런싱을 구현합니다 slave
.
내 생각에 OTP에는 유용한 일반로드 밸런싱 도구가 없습니다. 그리고 아마도 특정 경우에 하나만 있으면 유용 할 것입니다. 직접 구현하는 것은 쉽습니다. 동일한 경우에도 의사 소환이 유용 할 수 있습니다. 나는 평행 라이브러리를 실제의 대체물로 믿지 않습니다. 당신 이이 길을 걷는다면 Amdahl은 당신을 영원히 괴롭힐 것입니다.
적절한 수의 작업자 프로세스는 스케줄러 수와 같습니다. 이것은 시스템에서 수행되는 다른 작업에 따라 다를 수 있습니다. 사용,
erlang:system_info(schedulers_online) -> NS
스케줄러 수를 얻으려면.
풍부한 작업자 프로세스로 시스템을 침수 할 때 오버 헤드라는 개념은 다소 결함이 있습니다. 새로운 프로세스로는 오버 헤드가 있지만 OS- 스레드만큼 많지는 않습니다. 주요 오버 헤드는 프로세스간에 메시지 복사이며, 이진에 대한 참조 만 전송되므로 바이너리 사용으로 완화 될 수 있습니다. Eterms를 사용하면 구조가 먼저 확장 된 다음 다른 프로세스에 복사됩니다.
측정하지 않고 기계적으로 작업 비용을 예측하는 방법은 없습니다. 어떤 사람은 일부 클래스의 작업을 위해 작업을 분할하는 방법을 결정해야합니다. 로드 밸런서 단어에서 나는 당신의 질문에서 매우 다른 것을 이해합니다.