[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 의 다른글
- 이전글 [Triton] Gluon에 coalesced layout 추가 — 메모리 접근 효율 최적화
- 현재글 : [Ray Core] 메모리 스토어와 플라즈마 스토어에서 참조 카운터 분리 리팩터링
- 다음글 [pydantic-ai] FastMCPToolset Temporal 통합 — MCP 툴셋 공통 추상화
댓글