A Hardware Guide to PostgreSQL Performance – CPU 편

2020.09.15

“A Hardware Guide to PostgreSQL Performance”는 라인웍스에서 사용할 CDM 데이터 분석 전용 PostgreSQL 서버를 구축할 때 하드웨어를 어떻게 선택하였는지 공유하는 글 시리즈입니다. 첫번째 글(https://blog.linewalks.com/archives/6749)에서 디스크에 200만원 정도 사용하고, 두번째 글(https://blog.linewalks.com/archives/6783)에서 메모리에 120만원 정도 사용한 후, 280만원이 남았습니다. 본 글에서는 메모리에 이어 세번째로 중요한 CPU에 대하여 중점적으로 다루어보려고 합니다.

CPU 편

PostgreSQL에서 CPU의 주 역할은 디스크 또는 RAM에서 데이터를 불러오고 join, aggregate 등 연산을 해서 클라이언트에게 응답을 보내는 것입니다.

CPU 분류는 크게 3가지가 있습니다:

  1. Server
  2. Workstation (a.k.a High-End Desktop)
  3. Desktop

PostgreSQL 서버를 구축할 때는 굳이 “서버” CPU를 사용하지 않아도 됩니다. 위 3가지 분류는 칩 제조사들이 제품 분류 및 마케팅 용도로 정의한 카테고리이기 때문입니다.

PostgreSQL은 CPU 코어가 많을수록 더 많은 양의 정보를 효율적으로 처리할 수 있습니다. Online Transaction Processing (OLTP)에서는 동시에 접속한 많은 클라이언트에서 보내는 query들을 지연없이 처리하는 용도로 여러개의 코어를 사용합니다. Online Analytical Processing (OLAP) 또는 Data Warehouse (DW)에서는 복잡한 쿼리를 처리하기 위해 parallel worker를 생성하는데, 코어가 많으면 더 많은 worker를 생성할 수 있기 때문에 좋습니다.

인텔은 코어 개수에 따라서 아래와 같이 정의하였습니다:

  • Low Core Count (LCC): <= 10 Cores
  • High Core Count (HCC): <= 18 Cores
  • Extreme Core Count (XCC): <= 28 Cores

하지만, 본 포스팅에서는 AMD CPU도 같이 비교하기 위해서 정의를 조정하겠습니다:

  • LCC: <= 16 Cores
  • HCC: < 64 Cores
  • XCC: >= 64 Cores

아래는 2020년 중반 기준 시장조사 차트입니다:

TypeServerWorkstationDesktop
MfcIntelAMDIntelAMDIntelAMD
BrandXeonEpycCore-XThreadripperCoreRyzen
# of Socket1, 2, 4, 81, 21111
Core Count<= 28
HCC
<= 64
XCC
<= 18
HCC
<= 64
XCC
<= 10
LCC
<= 16
LCC
# of RAM Channel684422
Max RAM1TB4TB256GB256GB128GB128GB
ECC SupportYesYesNoOnly UDIMMNoNo
PCIe Gen343434
# of PCIe Lanes4812848641620
AVX-512YesNoYesNoNoNo

일단은 Server, Workstation, Desktop 중 어느 종류의 CPU를 선택해야하는지 아래의 Decision Tree에서 알아보겠습니다:

위 Decision Tree에 의하여 저희는 Workstation CPU를 선택하였습니다:

  1. (>128GB RAM? = Yes, >256GB RAM? = No) I/O가 중요한 만큼 RAM보다는 디스크에 예산을 더 쓰는 것이 올바르다고 판단해서 256GB로 정했습니다.
  2. (ECC? = No) 실시간성 서비스를 제공하는 DB를 구축하는 것이 아니라 주로 DW 용도로 사용할 것이기 때문에 ECC는 좋지만, 필수는 아니라고 판단하였습니다.
  3. (XCC? = No) 동시에 접속할 사용자가 많아야 몇십명 정도이기 때문에 HCC CPU로도 충분히 DB 접속이 원활하게 이루어질 수 있다고 판단하였습니다.

Workstation CPU를 선택함으로서 Intel Core-X와 AMD Threadripper의 선택지가 있었습니다. 다음과 같은 이유로 저희는 AMD Threadripper를 선택하였습니다:

  1. PCIe 4.0 NVMe SSD를 저장매체로 선택하였기 때문에, PCIe 4.0을 지원하는 CPU가 필요합니다.
  2. PostgreSQL은 버전 13.0 기준으로 현재 AVX-512 명령어를 사용하지 않습니다.

AMD Threadripper 라인업에는 24, 32, 64코어 제품들이 있으나, 클라이언트 수가 많지 않아서 24코어로도 충분하다고 판단하였습니다.

선택한 CPU가 pgbench에서 실제로 어느정도 성능이 나오는지 확인하였습니다. 아래는 최신형 Intel Xeon 및 AMD Epyc 서버 CPU들의 pgbench 결과입니다:

<Source: https://www.phoronix.com/scan.php?page=article&item=epyc7f72-xeon6258r-linux&num=9>

아래는 24코어 AMD Threadripper의 pgbench 결과입니다:

<Source: https://openbenchmarking.org/result/1911270-HU-THREADRIP09>

Workstation CPU는 각 코어당 동작주파수가 서버 CPU보다 대체적으로 높기 때문에, 동일 Core Count의 서버 CPU보다 높은 성능을 보여주는 것을 확인할 수 있습니다.

가성비 관점에서는 동일 가격대의 Xeon 6226R보다 대략 2배 정도 높은 성능을 보여주고 있습니다.

PCIe Lane 호환여부

저희는 PCIe 기반의 NVMe SSD를 선택하였기 때문에, CPU가 PCIe Lane 총 몇 개를 지원하는지 확인하는 것도 매우 중요합니다. 또한, 선택한 CPU가 Chipset을 사용한다면, 그 Chipset과의 상호작용도 확인해야합니다.

CPU는 메모리 컨트롤러를 통해서 메모리와 소통하고, PCIe 컨트롤러를 통해서 GPU, NVMe SSD 등과 소통합니다. 2000년대 초반 및 그 이전 CPU들은 메모리 컨트롤러와 PCIe 컨트롤러가 메인보드의 North Bridge, South Bridge 등 Chipset 안에 들어있었습니다.

하지만, 메인보드에 내장된 메모리 컨트롤러는 CPU과의 물리적인 거리 때문에 높은 latency가 불가피했고, CPU 연산속도가 높아지면서 이는 병목이 되기 시작하였습니다. 이를 개선시키려고 AMD는 2003년에 처음으로 메모리 컨트롤러를 CPU 다이에 내장시켰고, 인텔도 2008년에 뒤를 이었습니다.

반도체 기술의 발전으로 인하여 물리적으로 더 큰 CPU 다이를 양산시킬 수 있음에 따라 위 트렌드는 계속 이어졌습니다. PCIe 컨트롤러마저도 CPU 다이에 내장되기 시작하였고, 현대 CPU의 Chipset는 추가 PCIe Lane 몇 개, USB, WiFi 등 기능만 제공합니다. Intel Xeon, AMD Epyc 등 서버 CPU같은 경우는 Chipset이 아예 없고, PCIe Lane을 모두 다 CPU 자체에서 제공합니다.

저희가 선택한 Threadripper CPU는 Workstation급이기 때문에, Chipset이 있습니다. PCIe Lane 몇 개는 CPU 자체에서 제공하고, 몇 개는 Chipset에서 제공합니다. 아래와 같은 Chipset Diagram에서 확인할 수 있습니다:

<Source: https://hexus.net/tech/reviews/cpu/136796-amd-ryzen-threadripper-3960x-3970x/>

일반 소비자용 NVMe SSD는 보통 4개의 PCIe Lane을 사용합니다 (x4 NVMe). 저희는 선택한 Threadripper CPU와 Chipset이 x4 NVMe를 총 몇 개까지 수용할 수 있는지 보았습니다. 만약에 가용 PCIe Lane이 부족하다면 장착된 NVMe SSD들 중 몇 개는 1~2개 PCIe Lane밖에 못 사용하면서 성능저하가 일어날 것입니다.

일단 CPU 자체에서는 x4 NVMe 2개까지 지원하는 것을 볼 수 있습니다. 추가로 장착할 NVMe SSD들은 CPU에 바로 연결하지 못하고 Chipset에 연결해야합니다.

Chipset에 연결된 SSD는 Chipset을 거쳐서 CPU와 통신하기 때문에, CPU와 Chipset 간의 총 전송대역폭이 얼마나 되는지 확인합니다.

위 diagram에 의하면, CPU와 Chipset간에 PCIe Lane 총 16개로 구성된 링크가 있습니다. 그 중 8개는 CPU와의 통신 용도(Chipset Uplink)로 사용되고, 남은 8개로는 x4 NVMe 2개를 더 연결할 수 있습니다.

그러므로, 총 4개의 x4 NVMe SSD까지 성능저하 없이 사용할 수 있는 것을 확인하였습니다.

남은 예산

24코어 AMD Threadripper 3960X CPU는 가격이 무려 170만원을 육박합니다.

CPU까지 구매하고 나니 110만원 정도밖에 안 남았습니다.

남은 예산으로는 메인보드, 파워, 케이스, 쿨러 등 성능에 직접적인 영향은 없지만 매우 중요한 부품들을 구매하였습니다.

위 부품들은 다음 편 (본 시리즈의 마지막 편)에서 소개하도록 하겠습니다.

William Jung

Backend Engineer at Linewalks, Rising Junior at Yale University

William Jung