워커 힙
어플리케이션이 사용하고있는 메모리(예: 파이썬코드). best measured as the resident set size (RSS) of your application minus its shared memory usage (SHR) in commands such as top. The reason you need to subtract SHR is that object store shared memory is reported by the OS as shared with each worker. Not subtracting SHR will result in double counting memory usage.
객체 저장소 메모리
어플리케이션이 ray.put으로 객체를 만들고 원격함수에서 값을 반환할때 사용되는 메모리. 객체는 참조 카운트되고(ObjectRef) 범위를 벗어나면 제거됨. 각 노드에서 실행 중인 개체 저장소 서버가 존재하고, Ray1.3이상부터는 개체 저장소가 가득차면 개체가 디스크로 spill됨.
객체 저장소 공유메모리
어플리케이션이 ray.get으로 객체를 읽을때 사용되는 메모리. 개체가 이미 노드에 있는 경우 추가 할당이 발생하지 않기 때문에 많은 액터와 작업 간에 큰 개체를 효율적으로 공유할 수 있음.
기본적으로 ray는 필요한 메모리 양을 미리 예측할 수 없기 때문에, 스케줄링을 할때 작업이나 액터의 잠재적인 메모리 사용량을 고려하지 않음. 작업 이나 액터에 필요한 메모리 양을 알고 있는 경우 ray.remote 데코레이터 의 리소스 요구 사항을 지정하여 메모리 인식 스케줄링을 활성화할 수 있음.
단, 메모리 요구사항을 지정해도 메모리 사용량에 제한이 생기진 않는데, 이는 스케줄링 중에만 허용 제어에 사용되기 때문. 요청된 메모리보다 더 많이 쓰지 않는 것은 태스크 자체에게 달려있다.
## 예시
# reserve 500MiB of available memory to place this task
@ray.remote(memory=500 * 1024 * 1024)
def some_function(x):
pass
# reserve 2.5GiB of available memory to place this actor
@ray.remote(memory=2500 * 1024 * 1024)
class SomeActor(object):
def __init__(self, a, b):
pass
어플리케이션 작업이나 액터가 많은 양의 힙 공간을 사용하는 경우 노드의 메모리 부족이 발생할 수 있다. 운영체제는 작업자나 raylet 프로세스를 종료하여 어플리케이션을 중단시킨다.
메모리 모니터는 각 노드의 raylet프로세스 내에서 실행되는 구성요소이다.
워커 힙, 객체 저장소 및 raylet을 포함하는 메모리 사용량을 주기적으로 확인한다. 결합된 사용량이 임계값을 초과하면 raylet은 작업이나 액터 프로세스를 종료시켜 메모리를 확보하고 ray가 실패하지 않도록 한다.
메모리 모니터는 다음 환경 변수에 의해 제어됨
RAY_memory_monitor_refresh_ms (int, defaults to 250)
RAY_memory_usage_threshold (float, defaults to 0.95)
RAY_task_oom_retries (int, defaults to 15)