728x90
반응형

개요

우리가 서드파티 데이터베이스를 다루거나 운영체제 등을 설정할때 메모리를 할당하는 여러가지 기법이 있다.

대표적으로 ptmalloc2, tcmalloc, hoard, jemalloc등 있는데 이 기법에 대해 고찰해보자.

현대 메모리 할당 기법은 크게 차이가 나지 않지만 특정 상황에서는 우수한 성능을 발휘할 수 있다는 점을 인지하자

 

 

우선 개념부터 알아보자

PTMalloc2

PTMalloc2는 Doug Lea에 의해 개발된 메모리 할당기의 두 번째 버전이다. PTMalloc2는 기존의 PTMalloc보다 더 효율적인 메모리 할당과 관리를 제공하기 위해 개선되었다. 주로 glibc의 메모리 할당기로 사용되며, C/C++ 언어에서 사용되는 대규모의 동적 메모리 할당과 해제를 효율적으로 처리하는 것이 목표이다.


TCMalloc

TCMalloc는 Google에서 개발한 메모리 할당기로, Thread-Caching Malloc의 약자이다. 다중 스레드 환경에서 뛰어난 성능을 발휘하는 것이 특징입니다. TCMalloc은 각 스레드별로 메모리 캐시를 사용하여 메모리 할당과 해제를 더욱 빠르게 처리한다. Google 서비스 및 애플리케이션에서 널리 사용되고 있으며, 고성능과 확장성을 지향한다.


JEMalloc

JEMalloc은 FreeBSD에서 사용하기 위해 Jason Evans에 의해 개발된 메모리 할당기이다. 이후 다른 운영체제에서도 지원된다. JEMalloc은 다중 스레드 환경에서 효율적인 메모리 할당과 관리를 제공하며, 특히 대규모 멀티스레드 애플리케이션에서의 성능을 최적화한다. 낮은 메모리 오버헤드와 높은 확장성을 목표로 합니다.


Hoard

Hoard는 Emery Berger와 다른 개발자들에 의해 개발된 메모리 할당기이다. Hoard는 다중 스레드 환경에서의 메모리 할당과 해제를 위해 특별히 최적화되어 있다. 기존의 메모리 할당 알고리즘과는 다른 독특한 접근 방식을 사용하여 락 기반의 동기화 비용을 줄이고 성능을 향상시킨다. 특히 고밀도 스레드 환경에서 뛰어난 성능을 발휘하는데 주안점을 두고 있다.

 

 

위에서 밑줄 치고 굵게 표현한 글씨를 중점적으로 읽어보면 각각의 차별성과 특징들을 바로 알 수 있을것이다.

 

 

 

실제 적용되는 케이스를 예로 들자면

MongoDB에서 TCMalloc과 JEMalloc은 장점과 단점은 명확하다.

아래 이성욱님의 블로그에서 mongoDB에서의 TCMalloc과 JEMalloc의 메모리 할당 기법에 따른 용도의 차이점을 매끄럽게 잘 설명해주셨다. 시간이 있으면 자세히 읽어보면 큰 도움이 될 것이다.

https://medium.com/daangn/memory-allocator-for-mongodb-1953f9cee06c

 

Memory Allocator for MongoDB

DBMS 서버에서 메모리 관리는 매우 중요한 부분중 하나에요. DBMS 서버의 메모리 관리는 서버의 안정적인 운영뿐만 아니라 성능과도 직결되는 부분이 기 때문이죠.

medium.com

 

위의 글을 간단히 인용하자면 아래와 같다.

용도에 따라서 TCMalloc과 JEMalloc은 장점과 단점이 명확하다.
대략적으로 테스트 케이스에서 보인 쿼리들의 요건들을 고려해서 적절한 Memory Allocator를 선택하면 될 것으로 보인다.

- 대용량 쿼리가 매우 빈번하게 실행되거나
- mongos를 위해서 충분한 메모리를 가지고 있다면

예를 들어서, 위 2개 조건에 부합된다면 TCMalloc을, 그렇지 않다면 JEMalloc이 더 나은 선택일 것이다. 대용량 쿼리가 빈번하지 않은 경우 TCMalloc 처럼 불필요하게 사용되지도 않을 메모리를 Memory Allocator가 가지고 있으면, 다른 프로세스가 메모리를 사용하지 못하는 낭비가 발생하게 될 것이다.

 

 

malloc 벤치마킹

아래 외국분의 블로그에서 퍼오고 요약한 것임을 명시한다.

http://ithare.com/testing-memory-allocators-ptmalloc2-tcmalloc-hoard-jemalloc-while-trying-to-simulate-real-world-loads/

 

Testing Memory Allocators: ptmalloc2 vs tcmalloc vs hoard vs jemalloc While Trying to Simulate Real-World Loads - IT Hare on Sof

Quote:"if you DO want to get performance from changing mallocs, make sure to test them with your own app"Another Quote:"in our humble opinion, overall winner so far (by a nose) is jemalloc."[→]

ithare.com

 

아래와 같이 테스트 목표를 세워 하였다고 한다.

목표 및 요구 사항

테스트의 목표는 할당자에 대한 개발로, 가능한 실제 C++ 프로그램과 비슷하게 작동하면서 성능 차이를 측정하는 것이었다. 이를 위해 new/delete (또는 malloc/free)만 사용하여 벤치마킹하고, 할당 크기와 수명에 대한 현실적인 통계 분포를 적용하고, 모든 할당된 메모리에 액세스하며, 테스트 중인 할당자의 성능을 보상하기 위해 무효 할당자와 비교하고자 했다.


기본 아이디어

테스트에서 잠재적인 할당 항목을 나타내는 '슬롯' 묶음이 있었다. 반복할 때마다 슬롯에서 무작위로 선택하여 할당하거나 해제하는 방식으로 동작하였고, 다중 스레드에서 각각 독립적으로 작동했다.

 

보다 현실적인 배포판 만들기

할당된 크기와 슬롯 내 선택 분포를 현실적으로 만들기 위해 조각별 선형 함수와 파레토 분포를 사용하였다. 이는 실제 세계의 할당과 액세스 빈도에 더 가까운 근사치를 제공했다.


테스트

테스트는 6개의 코어, 12M L3 캐시, 2.4GHz CPU, 32GB RAM을 가진 서버에서 실행되었다. 4개의 테스트 중인 할당자에 대해 테스트를 수행했다. 각 할당자는 -fno-builtin-xxxx 플래그를 사용하여 테스트 앱과 연결되었다. 테스트 중인 할당자의 성능을 얻기 위해 무효 할당자와 비교하였고, 시간과 메모리 사용량을 측정하여 성능 메트릭을 도출하였다.

 

 

실험 결과는?

성능 측면

  • tcmalloc과 ptmalloc2 사이에서 관찰된 가장 큰 성능 차이는 tcmalloc이 ptmalloc2를 1.7배 능가했지만 단일 스레드에서만 발생했으며  더 많은 수의 스레드 에서 ptmalloc2가 tcmalloc을 능가했다(최대 1.2배)
  • 더 적은 수의 스레드(tcmalloc 및 비축)로 더 나은 성능을 발휘하던 malloc이 약 12개의 스레드에서 점차 성능이 떨어지기 시작했고 약 18-20개의 스레드에서 ptmalloc2 및 jemalloc보다 더 나빠  졌다.
  • tcmalloc과 ptmalloc2는 꽤 유사하다. (현재로서 데스크탑에서는 tcmalloc이 약간 우세하고, 서버에서는 ptmalloc2가 우세해 보인다. 하지만 결론을 내릴만큼 충분히 검증된 단계는 아니다.)

 

출처:http://ithare.com/testing-memory-allocators-ptmalloc2-tcmalloc-hoard-jemalloc-while-trying-to-simulate-real-world-loads/


메모리 오버헤드 측면

  • jemalloc이 가장 효율적인 메모리 오버헤드를 보여줬습니다. ptmalloc2가 두 번째로 우수한 결과를 보였으며, tcmalloc은 스레드 수 증가에 따라 뒤쳐지는 결과를 나타냈다. (jemalloc > ptmalloc2 > tcmalloc > hoard) 이는 전체 성능에 매우 중요합니다.  발생하는 RAM 오버헤드가 적을수록 캐싱이 더 효율적이기 때문이다.
  • Hoard는 피하라. (아래 그래프 보면 알 수 있을 것이다.)

 

 

출처:http://ithare.com/testing-memory-allocators-ptmalloc2-tcmalloc-hoard-jemalloc-while-trying-to-simulate-real-world-loads/

 

 

반응형

 

728x90
반응형