본문으로 건너뛰기

[Ray Core] 메모리 스토어와 플라즈마 스토어에서 참조 카운터 분리 리팩터링

PR 링크: ray-project/ray#57590 상태: Merged | 변경: +269 / -262

들어가며

Ray의 CoreWorker는 객체를 메모리 스토어(in-process)와 플라즈마 스토어(shared memory)에 저장합니다. 기존에는 두 스토어 모두 내부적으로 참조 카운터(reference counter)에 의존하고 있었는데, 이 의존성이 얕고 불필요한 결합을 만들고 있었습니다. 이 PR은 참조 카운터 관련 로직을 스토어에서 분리하여 CoreWorker 레벨로 옮깁니다.

핵심 코드 분석

메모리 스토어: 참조 카운터 의존성 제거

Before:

// memory_store가 내부적으로 reference_counter를 사용
memory_store_->Put(
    RayObject(rpc::ErrorType::OBJECT_IN_PLASMA), object_id);

After:

// CoreWorker가 참조 여부를 직접 판단하여 전달
memory_store_->Put(
    RayObject(rpc::ErrorType::OBJECT_IN_PLASMA),
    object_id,
    reference_counter_->HasReference(object_id));

플라즈마 스토어: owner 주소 조회를 호출부로 이동

Before:

// plasma_store_provider가 내부적으로 owner 주소를 조회
RAY_RETURN_NOT_OK(
    plasma_store_provider_->Get(plasma_object_ids, local_timeout_ms, &result_map));

After:

// CoreWorker가 owner 주소를 사전에 조회하여 전달
std::vector<ObjectID> object_ids =
    std::vector<ObjectID>(plasma_object_ids.begin(), plasma_object_ids.end());
auto owner_addresses = reference_counter_->GetOwnerAddresses(object_ids);
RAY_RETURN_NOT_OK(plasma_store_provider_->Get(
    object_ids, owner_addresses, local_timeout_ms, &result_map));

빌드 의존성 정리

# Before: memory_store가 reference_counter_interface에 의존
ray_cc_library(
    name = "memory_store",
    deps = [":reference_counter_interface", ...]
)

# After: 의존성 제거
ray_cc_library(
    name = "memory_store",
    deps = [...]  # reference_counter_interface 제거됨
)

왜 이게 좋은가

  • 관심사 분리: 스토어는 데이터 저장/조회만 담당하고, 참조 카운팅은 CoreWorker가 담당합니다.
  • 성능 유지: 마이크로벤치마크에서 single client get calls (Plasma Store)이 기존 수준을 유지하며, 회귀 없음이 확인되었습니다.
  • 유지보수성 향상: 스토어와 참조 카운터 간의 순환적 의존성이 제거되어, 각각을 독립적으로 수정할 수 있습니다.
  • 빌드 그래프 정리: 불필요한 빌드 의존성을 제거하여 빌드 시간과 코드 탐색이 개선됩니다.

참고 자료

댓글

관련 포스트

PR Analysis 의 다른글