A Hardware Guide to PostgreSQL Performance – Memory 편

2020.09.09

“A Hardware Guide to PostgreSQL Performance”는 라인웍스에서 사용할 CDM 데이터 분석 전용 PostgreSQL 서버를 구축할 때 하드웨어를 어떻게 선택하였는지 공유하는 글 시리즈입니다. 600만원의 예산을 가지고 시작해서, 저번 글(https://blog.linewalks.com/archives/6749)에서 디스크에 200만원 정도 사용한 후, 400만원이 남았습니다. 본 글에서는 디스크(I/O)에 이어 두번째로 중요한 메모리에 관해서 다루어보려고 합니다.

Memory 편

저번 글에서는 고성능 디스크를 선택해서 PostgreSQL 성능의 가장 큰 병목인 Disk와 Cache간의 latency를 줄였습니다. Cache에 저장된 데이터는 Backend process가 접근해서 연산/처리하게 되고, 이 때 RAM의 역할이 중요합니다.

RAM의 종류는 크게 3가지가 있습니다:

  1. Non-ECC UDIMM: Non Error Correcting, Unbuffered Memory
  2. ECC UDIMM: Error Correcting, Unbuffered Memory
  3. ECC/REG DIMM: Error Correcting, Registered Memory

서버 CPU는 대부분 ECC/REG DIMM을 사용하고, 그 외 CPU들은 대부분 Non-ECC UDIMM을 사용합니다. ECC UDIMM은 AMD Threadripper 같은 일부 workstation CPU에서 지원하는데, 가격도 비쌀 뿐더러 국내에서는 찾아보기 힘듭니다.

ECC는 전자기적 간섭 또는 방사선 때문에 일어날 수 있는 memory 에러를 자동으로 감지하고 수정합니다. RAM 모듈 자체에 parity를 저장하는 chip이 하나 더 붙어있어서 memory에서 하나의 비트가 잘못된 상태로 뒤집혀지더라도 Reed-Solomon code를 통해서 수정합니다.

Registered Memory는 시스템의 memory controller와 RAM 사이에 register가 추가되어서 memory controller 자체의 부하를 덜어주는 역할을 합니다. 이로 인하여 기존 memory보다 훨씬 더 많은 chip들이 하나의 RAM 모듈에서 동작할 수 있게 해줍니다. 일반 DDR4 Non-REG DIMM은 최대 용량이 모듈 하나당 32GB에서 제한되는 반면에, REG DIMM은 128GB까지도 생산이 가능합니다.

<Puget Systems RAM Failure Statistics: https://www.pugetsystems.com/labs/articles/Advantages-of-ECC-Memory-520/#:~:text=ECC%20(which%20stands%20for%20Error,to%20the%20CPU%20on%20demand.>

Puget Systems의 데이터에 의하면, Non-ECC와 ECC RAM의 전반적인 오류율은 둘 다 매우 낮지만, 위와 같이 오류 원인은 매우 다릅니다. ECC RAM은 RAM 모듈 자체가 물리적인 결함이 생겨서 No POST를 일으키는 반면에, Non-ECC RAM은 대부분이 memory 에러입니다. 그러므로, 트랜잭션의 무결성이 매우 중요한 24/7 가동되는 실시간성 서비스 DB는 가능하면 ECC RAM을 사용하는 것이 좋다고 합니다.

저희는 실시간성 서비스 제공이 아닌 데이터 분석을 목적으로 하기 때문에 24/7 안정성보다는 고성능을 확보하고, 국내 수급이 용이한 Non-ECC RAM을 선택하였습니다.

현대 CPU는 RAM 과의 전송대역폭을 극대화시키기 위해서 멀티채널 메모리를 사용합니다. 멀티채널 메모리는 memory controller와 RAM 사이에 통신할 수 있는 channel을 두개 이상으로 열어서 전송대역폭을 channel의 개수만큼 배로 증가시키는 기술입니다. 예시로, 아래에서는 quad channel을 지원하는 Intel Core-X의 channel 개수별 메모리 전송대역폭입니다:

<Intel Core-X의 Channel별 전송대역폭: https://en.wikichip.org/wiki/intel/core_i9/i9-9900x>

하나의 DDR4 RAM 모듈은 대략 20GB/s 전송속도가 한계인데, quad channel을 사용해서 무려 80GB/s까지 대역폭을 늘린 것을 확인할 수 있습니다.

RAM이 멀티채널로 동작하려면, 모든 RAM 모듈의 용량(GB)과 동작주파수(MHz)가 동일해야하고, (channel의 개수), 또는 (channel의 개수 x 2)만큼의 모듈을 메인보드에 알맞게 설치해야합니다:

<Intel Core-X의 RAM 구성도: https://www.intel.com/content/www/us/en/support/articles/000005657/boards-and-kits.html>

저희는 quad channel RAM을 지원하는 AMD Threadripper CPU를 선택하였는데, 128GB (32GBx4)로는 조금 부족하다고 판단해서 CPU가 지원하는 최대인 256GB (32GBx8)로 구성하였습니다.

무엇보다 안정성이 중요했기 때문에 멋있는 방열판이 달린 G.Skill, Corsair, TeamGroup 등 회사의 오버클럭 메모리보다는 삼성전자의 OEM 메모리를 선택하였습니다 (일명 시금치램).

개당 15만원인 32GB Non-ECC UDIMM을 8개 구매하였고, 총 120만원을 사용하였습니다.

280만원 정도가 남았고, 벌써 예산의 반 이상을 디스크와 메모리에 소진하였습니다.

다음 편에서는 CPU를 어떻게 선택하였는지, 그리고 왜 AMD Threadripper CPU를 선택하였는지 알아보도록 하겠습니다.

William Jung

Backend Engineer at Linewalks, Rising Junior at Yale University

William Jung