'데이터 엔지니어'로 성장하기

정리하는 걸 좋아하고, 남이 읽으면 더 좋아함

Storage/Ceph

Ceph)osd resource limit 설정_계산공식

MightyTedKim 2022. 4. 4. 13:56
728x90
반응형

limit 1Gib 직전으로 메모리 사용률이 조절된다. OSD당 최소 4Gib 할당, 메모리 사용량은 공식 사용

요약

1. ceph osd 메모리가 tera 단위로 올라감

2. cluster.yaml에서 resource limit 수정함

설명

1. ceph osd 메모리가 tera 단위로 올라감

> 결론부터 말하면 어떻게 얼마를 적용해라라는 기준이 아직 없음. 권고만 있음

관련 글을 하나씩 보기로하자. 나와 비슷한 고민을 한 사람이 있음 

참고: https://github.com/rook/rook/issues/5821 

 

1-1. 공식 문서

참고 : https://github.com/rook/rook/blob/master/design/ceph/resource-constraints.md 

 

GitHub - rook/rook: Storage Orchestration for Kubernetes

Storage Orchestration for Kubernetes. Contribute to rook/rook development by creating an account on GitHub.

github.com

* request와 limit을 똑같이하는게 좋다고 함

  • BestEffort - No requests and limits are set (for testing). -> 이거로 했다가 메모리가 올라감
  • Burstable - Only requests requirements are set.
  • Guaranteed - requests and limits are set to be equal. 

1-2. 개인 블로그

참고 : https://documentation.suse.com/sbp/all/html/SBP-rook-ceph-kubernetes/index.html

 

Rook Best Practices for Running Ceph on Kubernetes | S…

The document at hand provides an overview of the best practices and tested patterns of using Rook v1.3 to manage your Ceph Octopus cluster running in Kubernete…

documentation.suse.com

8.3 Resource Requests - OSD RAM REPORT DOCUMENTATION BUG#EDIT SOURCE

There are node hardware recommendations for OSD RAM usage, and this needs to be translated to RAM requests on a per-OSD basis. The node-level recommendation below describes osd_memory_target. This is a Ceph configuration that is described in detail further on.

Total RAM required = [number of OSDs] x (1 GB + osd_memory_target) + 16 GB

heap memory는 osd_memory_taget 이하로 유지됨 : Ceph OSDs will attempt to keep heap memory usage under a designated target size set via the osd_memory_target configuration option. 

osd_memory_target 낮추지 말것 : Ceph’s default osd_memory_target is 4GB, and we do not recommend decreasing the osd_memory_target below 4GB. 
osd memory를 늘릴것 : You may wish to increase this value to improve overall Ceph read performance by allowing the OSDs to use more RAM. 
While the total amount of heap memory mapped by the process should stay close to this target, there is no guarantee that the kernel will actually reclaim memory that has been unmapped.

For example, a node hosting 8 OSDs, memory Requests would be calculated as such:

8 OSDs x (1GB + 4GB) + 16GB = 56GB per node
56GB / 8 OSDs = 7GB

rook OSD requst 설정시, 알아서 osd_memory_target을 설정함 : Ceph has a feature that allows it to set osd_memory_target automatically when a Rook OSD Resource Request is set.

 

오버헤드 고려 없음, osd_memory_taget 보다 최소 1GB 크게 osd memory 잡기 : 

However, Ceph sets this value 1:1 and does not leave overhead for waiting for the kernel to free memory. Therefore, we recommend setting osd_memory_target in Ceph explicitly, even if you wish to use the default value. Set Rook’s OSD resource requests accordingly and to a higher value than osd_memory_target by at least an additional 1GB. This is so Kubernetes does not schedule more applications or Ceph daemons onto a node than the node is likely to have RAM available for.

 

CPU도 동일함 : OSD RAM Resource Requests come with the same cluster-wide Resource Requests note as for OSD CPU. Use the highest Requests for a cluster consisting of multiple different configurations of OSDs.


1-3. 기타 논의글

참고: https://www.spinics.net/lists/dev-ceph/msg01698.html

 

osd_memory_target in Rook, set automatically via k8s Resource Requests, and hardware recommendations — CEPH Filesystem Develop

 

www.spinics.net

아래는 비슷한 고민을 하는 게시글

 

'osd_memory_target' will be  = min(REQUEST, LIMIT*ratio)

(limit을 거는 것은 좋은 예시가 아님. limit 도달하면 daemon을 죽이기 때문) -> 무한정 올라가면 더 안되는거 아닌가?

- In Rook/Kubernetes,
  Ceph OSDs will read the POD_MEMORY_REQUEST and POD_MEMORY_LIMIT
  env vars to infer a new default value for 'osd_memory_target'
   - POD_MEMORY_REQUEST translates directly to 'osd_memory_target' 1:1
   - POD_MEMORY_LIMIT (if REQUEST is unset) will set 'osd_memory_target' using the formula
     ( LIMIT x osd_memory_target_cgroup_limit_ratio )
   - the default 'osd_memory_target' will be  = min(REQUEST, LIMIT*ratio)

k8s의 리소스 best practice에 대한 글은 인터넷에서도 갑론을박.

 

1-4. github 논의

출처 : https://github.com/rook/rook/issues/5811

request는 최소 1G : I'd suggest setting request to 4 GiB and limit to 6 GiB (i.e. don't OOM kill it until it gets to the limit), and watch what happens to osd_memory_target. 

 

 

2. cluster.yaml에서 resource limit 수정함

 

내부적으로 논의를 거쳐, 최적의 메모리 할당량을 적용해보기로 함

예를 들어, 아래는 단순한 예시

vi cluster.yaml
  resources:
    osd:
      limits:
        cpu: "2000m"
        memory: "20Gi"
      requests:
        cpu: "500m"
        memory: "4Gi"

streaming 데이터 중지하고 실행하니, 1분 정도 10개 넘는 OSD가 restart 되었고

memory는 계속 올라가는 중, limit을 찍었을 때 어떤 현상이 나오는지 모니터링이 필요함

 

 

+ 일주일 사용 후기

limit 직전 1Gib 찍으면 다시 내려간다. 무조건 우상향이 아니었다.

나머지 OSD들도 limit-1Gib가 되면 동시에 죽는게 아닐까 약간 걱정된다.

내가 예상한 시나리오는 limit을 찍고 하나씩 재시작되는건데..

 

+ 열흘 사용후기

드디어  limit 근처로 갔는데, 메모리가 내려간다.

우상향만 하던 것이 내려갔다. 느낌이 좋다.

'limit - 1Gib' 까지 메모리가 사용되고 pod가 재시작될 걱정도 없다.

굿 만족스럽다,

728x90
반응형