[Ray] 다중 gRPC 연결로 오브젝트 전송 처리량 향상
PR 링크: ray-project/ray#61121 상태: Merged | 변경: +16 / -2
들어가며
Ray의 오브젝트 매니저는 노드 간 오브젝트 전송에 gRPC를 사용합니다. 기본적으로 gRPC는 동일 주소에 대해 하나의 HTTP/2 연결을 공유하는데, 이 단일 연결이 대역폭 병목이 될 수 있습니다. 이 PR은 GRPC_ARG_USE_LOCAL_SUBCHANNEL_POOL 옵션을 추가하여 여러 독립 연결을 생성하고 전송 처리량을 높입니다.
핵심 코드 분석
Before: 단일 서브채널 풀
// grpc_client_manager.h
for (int idx = 0; idx < conn_num; ++idx) {
grpc_clients_.emplace_back(
std::make_unique<GrpcClient<ServiceType>>(address, port, client_call_manager));
}
동일 주소에 여러 클라이언트를 생성해도 gRPC의 글로벌 서브채널 풀이 동일한 하위 연결을 공유하므로, 실제로는 단일 TCP 연결만 사용됩니다.
After: 로컬 서브채널 풀 활성화
grpc::ChannelArguments args = CreateDefaultChannelArguments();
if (use_multiple_connections) {
args.SetInt(GRPC_ARG_USE_LOCAL_SUBCHANNEL_POOL, 1);
}
for (int idx = 0; idx < conn_num; ++idx) {
grpc_clients_.emplace_back(std::make_unique<GrpcClient<ServiceType>>(
address, port, client_call_manager, args));
}
GRPC_ARG_USE_LOCAL_SUBCHANNEL_POOL을 설정하면 각 채널이 독립적인 서브채널 풀을 사용하여 별도의 TCP 연결을 생성합니다.
설정 플래그
// ray_config_def.h
RAY_CONFIG(bool, experimental_object_manager_enable_multiple_connections, false)
실험적 기능으로 기본 비활성화되어 있으며, 필요 시 런타임 설정으로 활성화할 수 있습니다.
왜 이게 좋은가
1. HTTP/2 단일 연결 한계 극복
HTTP/2는 멀티플렉싱을 지원하지만, 단일 TCP 연결의 대역폭, 수신 윈도우, 헤드 오브 라인 블로킹 등의 제약이 있습니다. 여러 TCP 연결을 사용하면 이 제약을 우회할 수 있습니다.
2. 대용량 오브젝트 전송
Ray에서 대형 텐서나 데이터셋을 노드 간 전송할 때, 단일 연결로는 네트워크 대역폭을 충분히 활용하지 못할 수 있습니다. 다중 연결로 병렬 전송하면 가용 대역폭을 최대한 활용합니다.
3. 안전한 실험적 도입
experimental_ 접두사와 기본값 false로 기존 동작을 변경하지 않으면서, 성능 테스트 환경에서 쉽게 활성화할 수 있습니다.
참고 자료
- gRPC Channel Arguments — gRPC 채널 인자 목록
- HTTP/2 Head-of-Line Blocking — HTTP/2의 HOL 블로킹 문제
관련 포스트
PR Analysis 의 다른글
- 이전글 [Loki] 쿼리 엔진 정합성 테스트 병렬 실행으로 CI 시간 15% 단축
- 현재글 : [Ray] 다중 gRPC 연결로 오브젝트 전송 처리량 향상
- 다음글 [triton] Triton Gluon을 활용한 Blackwell 아키텍처에서의 Multi-CTA 행렬 곱셈 최적화
댓글