-
[Memcached] slab allocator📖 개발 공부 2023. 3. 19. 16:48
Memcached
DB 호출, API 호출 또는 페이지 렌더링 등의 결과를 임의의 데이터(문자열 또는 객체)화하여 작은 덩어리 형태로 저장하는 in-memory key-value 저장소이다.
memcached는 기본적으로 객체를 저장하는데 사용되지만, string과 같은 직렬화될 수 있는 어떤 변수라도 저장할 수 있다.
memcached에 데이터를 저장할 때 4개의 인자를 사용한다.
- key: string 타입
- value: 직렬화되어 저장되고 비직렬화되어 검색 될 수 있다면 어떤 타입이든 가능
- cache expire time(expiry)[s]: 캐시 만료 시간 (0으로 지정된 경우 캐시에서 지워지지 않는다. 대신, 메모리가 부족해진 경우 LRU 알고리즘에 따라 캐시에서 제거될 수 있다.)
- compaction: 압축 여부(압축에 의한 오버헤드 / 메모리 저장 공간 고려)
주의점
스왑이 일어나지 않을 정도로 메모리는 여유 있다는 가정 하에 개발이 되었더라도 운영 시 시스템의 메모리를 모니터링해서 스왑이 일어나지 않도록 해야 한다.
메모리가 부족해 스왑이 일어나 메모리에 저장했던 콘텐츠가 스왑 디스크에 저장되면, 심각한 속도 저하가 있기 때문이다.
따라서 memcached를 운영하는 서버는 메모리 용량을 충분히 확보하는 것이 중요하다.
slab allocator
전통적인 메모리 할당 방식: malloc, free를 통해 heap 영역에서 메모리 관리
memcached는 슬랩 할당자(slab allocator)를 통해 메모리를 관리한다.slab allocation 은 memcached의 메모리 사용을 최적화하고, 메모리 단편화(fragmentation)을 막아준다.
how
- 메모리에 1MB의 페이지(page)들을 잡아 slab에 할당하고, 이 slab은 다수의 같은 크기 chunk들로 나눠져서 결국 캐시에 어떤 값을 저장하려고 할 때, memcached가 저장할 값의 크기를 측정하고, 이 항목과 적절한 크기를 포함하는 slab을 할당해주어 그 slab 내부의 chunk에 저장되기 때문이다.
- 저장할 새 항목이 기존 chunk의 크기보다 크면, 적절한 크기의 청크로 나눠진 새로운 slab이 만들어지기도 하고, 새 항목이 기존 chunk에 적합하지만 빈 청크가 없다면 새로운 slab이 만들어진다.
- 기존 저장되어 있던 항목이 업데이트되어 크기가 커지더라도 같은 방식으로 적당한 슬랩이 생성되어 재할당된다.
- 슬랩 내부 청크에 항목들이 다 차있는 상태에서 비슷한 크기의 새로운 항목이 저장되려 할 때에는 슬랩 클래스 내부에서 LRU(Least RecentlyUsed) 알고리즘에 의해 저장되어 활용되지 않는 chunk 를 선정하여 업데이트한다.
slab의 기본 값은 1MB이다. (이는 각 slab 클래스의 최대 크기를 제한하는 용도로 사용된다.)
slab은 chunk 크기 별로 class가 나뉘어진다.chunk는 key-value 쌍 데이터를 저장하는 가장 작은 단위이며, 각 chunk는 하나의 key에 대응하는 value 데이터를 저장한다
(default chunk size: 48 byte / default slab chunk max: 512KB (524,288 byte))
growth factor (default: 1.25): 이 값을 기반으로 각 slab 클래스의 크기를 조절할 수 있다. chunk 크기는 factor 크기만큼 곱해지면서 커진다.
- 예시 (growth factor가 1.25일 때)
- 초기 chunk size: 104 byte → slab class 1
- 다음 chunk size: 104 * 1.25 = 130 byte → slab class 2
이 알고리즘은 메모리 공간 낭비를 일으킬 수 있다.
특정 크기의 메모리 공간에 모든 청크를 할당해서 더 큰 데이터를 공간을 완전히 활용하지 못할 수 있기 때문이다.
예를 들어, 메모리 공간이 부족하여 100 byte의 데이터를 128 byte chunk에 캐시하면 사용하지 않는 28 byte는 낭비된다.
따라서, 작은 크기의 객체를 저장하는 경우에는 가능한 작은 크기의 slab을 사용하여 메모리 공간을 효율적으로 활용해야 한다.
🔗 참고 링크
https://www.alibabacloud.com/blog/redis-vs-memcached-in-memory-data-storage-systems_592091
728x90반응형'📖 개발 공부' 카테고리의 다른 글
intellij로 디버깅 하기 (0) 2023.06.06 배포 전략 (Rolling Update, Blue/Green, Canary) (0) 2023.04.09 Eventual Consistency (0) 2023.04.01 [Resilience4j] Circuit Breaker Config 정리 (0) 2023.03.19 Circuit Breaker (서킷 브레이커) (0) 2023.02.17