문제

일부 데이터 처리를 위해 느슨하게 결합 된 클러스터를 작업하고 있습니다. 네트워크 코드 및 처리 코드는 제자리에 있지만 접근 방식에서 다른 방법론을 평가하고 있습니다. 지금 당장, 우리는 성능 문제에 I/O가 묶여 있으며 병목 현상을 줄이려고 노력하고 있습니다. 분명히, Infiniband와 같은 더 빠른 스위치는 굉장 할 것이지만, 우리는 우리가 가진 것을 버리고 새로운 장비를 얻는 것만으로도 사치를 감당할 수는 없습니다.

내 질문은 이것입니다. 클러스터에서 수행 된 모든 기존 및 심각한 HPC 응용 프로그램은 일반적으로 메시지 전달과 소켓을 직접 전송하면서 구현됩니다. 이것에 대한 성능 이점은 무엇입니까? 우리가 소켓에서 전환하면 속도를 봐야합니까?

도움이 되었습니까?

해결책

MPI는 소켓을 사용할 수 있습니다. 그러나 직접 분산 공유 메모리를 사용하는 SAN (System Area Network)과 함께 사용할 MPI 구현도 있습니다. 물론 하드웨어가 있다면. 따라서 MPI를 사용하면 향후 그러한 리소스를 사용할 수 있습니다. 이 경우 대규모 성능 향상을 얻을 수 있습니다 (대학 시대에 클러스터에 대한 경험에 따라 몇 배의 이익에 도달 할 수 있습니다). 따라서 Higher End 클러스터로 포팅 될 수있는 코드를 작성하는 경우 MPI를 사용하는 것이 매우 좋습니다.

MPI를 사용하여 성능 문제를 버리게되면 많은 시간을 절약 할 수 있으며 시스템의 다른 부분의 성능을 향상 시키거나 단순히 정신을 절약 할 수 있습니다.

다른 팁

나는 당신이 그런 종류의 일을 잘하지 않는 한 자신의 것을 굴리는 대신 MPI를 사용하는 것이 좋습니다. 나 자신의 프로토콜을 사용하여 분산 컴퓨팅-esque 응용 프로그램을 작성한 후, 나는 항상 MPI 내에서 발견 된 기능을 재현 (및 제대로 재현하지 못한) 기능을 발견했습니다.

성능 현명한 나는 MPI가 당신에게 유형의 네트워크 속도를 줄 것으로 기대하지 않을 것입니다. 그것은 당신과 마찬가지로 소켓을 사용합니다. 그러나 MPI는 많은 노드를 관리하는 데 필요한 많은 기능, 즉 노드 간의 동기화를 제공합니다.

이 경우 고성능 클러스터에서도 성능이 유일한 고려 사항은 아닙니다. MPI는 표준 API를 제공하며 "휴대용"입니다. 다른 버전의 MPI간에 응용 프로그램을 전환하는 것은 상대적으로 사소합니다.

대부분의 MPI 구현은 TCP 기반 통신에 소켓을 사용합니다. 주어진 MPI 구현이 소켓을 직접 사용하는 홈 성장 애플리케이션보다 더 나은 최적화와 더 빠른 메시지 전달을 제공 할 확률이 좋습니다.

또한, 인피니본이있는 클러스터에서 코드를 실행할 수있는 기회를 얻으면 MPI 계층은 해당 코드 변경 사항을 추상화합니다. 이것은 사소한 이점이 아닙니다. 직접 사용하도록 응용 프로그램을 코딩하는 것은 (또는 다른 IB 동사) 구현이 매우 어렵습니다.

대부분의 MPI 응용 프로그램에는 응용 프로그램과 독립적으로 네트워킹 설정의 정확성을 확인하는 데 사용할 수있는 소규모 테스트 앱이 포함되어 있습니다. 이것은 응용 프로그램을 디버깅 할 때가 될 때 가장 큰 이점입니다. MPI 표준에는 MPI 호출을 프로파일 링하기위한 "PMPI"인터페이스가 포함됩니다. 이 인터페이스를 사용하면 모든 메시지 전달 루틴에 체크섬 또는 기타 데이터 확인을 쉽게 추가 할 수 있습니다.

MPI는 집단 커뮤니케이션을 수행 할 수있는 이점이 있습니다. O (log p)/* p의 방송/감소를 수행하는 것은 프로세서 수*/대신 (p) 대신 큰 이점입니다.

Oldman과 Freespace에 동의해야합니다. MPI에 대한 유용한 메트릭 (성능, 유지 가능성 등)에 대한 구체적이고 개선을 알지 못하면 왜 휠을 재창조 하는가. MPI는 해결하려는 문제에 관한 많은 양의 공유 지식을 나타냅니다.

데이터를 전송하는 것 이외의 문제가 해결되어야합니다. 연결 설정 및 유지 보수는 모두 귀하의 책임이됩니다. MPI가 정확한 추상화 인 경우 (그렇습니다) 필요한 경우 사용하십시오.

최소한, MPI를 사용하고 나중에 자신의 시스템으로 리팩토링하는 것은 MPI의 설치 및 종속성을 요구하는 좋은 접근법입니다.

나는 특히 MPI가 당신에게 간단한 소켓 커뮤니케이션을 넘어 훨씬 더 많은 것을 제공한다는 Oldman의 요점을 좋아합니다. 투명한 추상화로 평행하고 분산 컴퓨팅 구현이 많이 나타납니다.

메시지 통과는 기술이 아닌 패러다임입니다. 가장 일반적인 설치에서 MPI는 소켓을 사용하여 통신합니다. MPI로 전환하여 속도가 높아질 수 있지만 소켓 통신을 최적화하지 않은 한만.

응용 프로그램 I/O는 어떻습니까? 데이터 블록을 작업 노드로 전송하는 데 묶여 있습니까? 아니면 계산 중 통신으로 인해 바인딩됩니까?

대답이 "커뮤니케이션으로 인해"인 경우 문제는 단단히 결합 된 응용 프로그램을 작성하고 느슨하게 결합 된 작업을 위해 설계된 클러스터에서 실행하려고한다는 것입니다. 성능을 얻는 유일한 방법은 더 나은 하드웨어 (더 빠른 스위치, 인피니본 등)를 얻는 것입니다 ... 어쩌면 다른 사람의 HPC에서 시간을 빌릴 수 있습니까?

대답이 "데이터 블록"전송 인 경우 작업자를 여러 데이터 블록 할당 (따라서 더 오래 바쁘게 유지)을 고려하고 전송 전에 데이터 블록을 압축하는 것을 고려하십시오. 이것은 느슨하게 결합 된 응용 프로그램에 도움을 줄 수있는 전략입니다.

나는 MPI를 사용하지 않았지만 소켓을 상당히 사용했습니다. 고성능 소켓에는 고려해야 할 사항이 몇 가지 있습니다. 많은 작은 패킷이나 큰 패킷을하고 있습니까? 많은 작은 패킷을 수행하는 경우 더 빠른 응답을 위해 Nagle 알고리즘을 끄는 것을 고려하십시오.

setsockopt (m_socket, ipproto_tcp, tcp_nodelay, ...);

또한 신호를 사용하면 많은 양의 데이터를 얻으려고 할 때 실제로 훨씬 느리게 될 수 있습니다. 오래 전에 독자가 신호를 기다리고 패킷을 읽는 테스트 프로그램을 만들었습니다. 그런 다음 방금 읽기를 차단하고 10000 개의 읽기/초를 얻었습니다.

요점은 이러한 모든 옵션을보고 실제로 테스트하는 것입니다. 다른 조건은 다른 기술을 더 빠르게/느리게 만듭니다. 의견을 얻을뿐만 아니라 시험에 참여하는 것이 중요합니다. Steve Maguire는 "솔리드 코드 작성"에서 이것에 대해 이야기합니다. 그는 반 직관적 인 많은 예제를 사용하여 더 나은/빠른 코드를 만드는 원인을 찾기 위해 테스트합니다.

MPI는 아래에 소켓을 사용하므로 실제로 코드가 인터페이스하는 API입니다. 소켓을 직접 사용하는 경우 프로토콜을 미세 조정할 수 있습니다. 데이터로 정확히 무엇을하고 있습니까?

MPI는 소켓을 사용하며, 무엇을하고 있는지 알고 있다면 메타 데이터를 많이 보내지 않아도되므로 소켓에서 더 많은 대역폭을 얻을 수 있습니다.

그러나 당신은 당신이 무엇을하고 있는지 알아야하며 더 많은 오류가 발생할 가능성이 높습니다. 본질적으로 MPI를 자신의 메시징 프로토콜로 교체 할 것입니다.

대량의 경우 오버 헤드가 낮습니다 사업 메시징을 확인하고 싶을 수도 있습니다OAMQ 여러 제품으로. 오픈 소스 변형 Openamq 아마도 JP Morgan에서 거래를 운영하고 있으므로 신뢰할 수 있어야합니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top