본문으로 건너뛰기

[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로 기존 동작을 변경하지 않으면서, 성능 테스트 환경에서 쉽게 활성화할 수 있습니다.

참고 자료

댓글

관련 포스트

PR Analysis 의 다른글