하드웨어 기초 #2 CPU — 코어 / 스레드 / 클럭 / 캐시, 그리고 vCPU의 정체

7 분 소요

#1에서 네 자원 중 계산을 맡은 부품이 CPU라고 정리했습니다. 이번 글은 그 CPU를 한 층 깊이 들여다봅니다. 코어, 스레드, 클럭, 캐시라는 네 단어는 인스턴스를 고를 때마다 마주치지만 정확히 무엇을 뜻하는지는 의외로 흐릿합니다. 마지막에는 클라우드 사양표에 적힌 vCPU가 실제로 무엇인지까지 짚겠습니다.

하드웨어 기초 시리즈에서 이번 글의 위치입니다.

CPU가 하는 일 #

CPU는 같은 동작을 한없이 반복합니다. 메모리에서 명령을 하나 가져와(fetch), 무슨 일인지 해석하고(decode), 실행하고(execute), 결과를 적는(write) 사이클입니다. 이 사이클을 1초에 수십억 번 돌립니다.

명령어 사이클
가져오기 → 해석 → 실행 → 결과 적기 → 다음 명령 가져오기 → ...
(fetch)   (decode) (execute) (write)

성능을 좌우하는 질문은 둘입니다. 이 사이클을 얼마나 빠르게 도는가(클럭), 그리고 사이클을 도는 일꾼이 몇 명인가(코어,스레드)입니다.

코어와 스레드 #

코어 — 진짜 계산 단위 #

**코어(core)**는 명령어 사이클을 독립적으로 도는 계산 장치입니다. 코어가 4개면 서로 다른 작업 4개를 동시에 진행할 수 있습니다. 옛날에는 CPU 칩 하나에 코어가 하나였지만, 지금은 칩 하나에 코어 여러 개를 넣은 멀티코어가 표준입니다.

코어가 많을수록 동시에 처리할 수 있는 일이 늘어납니다. 웹 서버가 요청 100개를 동시에 받는다면 코어가 많을수록 더 많은 요청을 나란히 처리합니다.

스레드와 하이퍼스레딩 #

**스레드(thread)**는 CPU가 처리하는 하나의 작업 흐름입니다. 코어 하나는 보통 스레드 하나를 처리하지만, 하이퍼스레딩(Hyper-Threading) 또는 SMT라는 기술을 쓰면 코어 하나가 스레드 두 개를 번갈아 처리합니다.

원리는 이렇습니다. 한 스레드가 메모리를 기다리며 잠깐 노는 동안 그 빈 시간에 다른 스레드를 끼워 넣습니다. 코어가 진짜로 둘이 되는 것은 아니고, 노는 시간을 줄여 활용도를 높이는 방식입니다.

물리 코어 4개 + 하이퍼스레딩
물리 코어 4개
└─ 각 코어가 스레드 2개 처리
   = 운영체제에는 '논리 프로세서' 8개로 보임

그래서 같은 칩이라도 “4코어 8스레드"처럼 적힙니다. 물리 코어는 4개, 운영체제가 보는 논리 프로세서는 8개라는 뜻입니다. 성능은 코어 8개만큼 늘지 않습니다. 일감의 성격에 따라 다르지만, 보통 20~30% 정도의 향상을 기대하는 수준입니다.

클럭 — 초당 몇 번 #

**클럭(clock)**은 CPU가 사이클을 얼마나 빠르게 도는지를 나타냅니다. 단위는 헤르츠(Hz)이고, 3.0GHz는 초당 30억 번이라는 뜻입니다.

클럭이 높으면 한 코어가 더 빠릅니다. 하지만 클럭만으로 두 CPU를 비교할 수는 없습니다. 한 번의 사이클에서 얼마나 많은 일을 하는지(IPC), 캐시가 얼마나 큰지, 코어가 몇 개인지가 모두 다르기 때문입니다.

비교클럭만 보면실제로는
구형 4.0GHz vs 신형 3.0GHz구형이 빠를 듯신형이 사이클당 더 많은 일을 해 더 빠를 때가 많음
단일 스레드 작업클럭 높은 쪽 유리대체로 맞음
다중 요청 처리클럭만으로 판단 불가코어 수가 더 중요

요점은 클럭은 단일 코어의 빠르기를 가늠하는 한 지표일 뿐, 세대와 코어 수가 다르면 클럭 숫자 비교는 의미가 약하다는 것입니다.

캐시 — CPU 안의 고속 저장소 #

#1에서 CPU가 메모리보다 훨씬 빠르다고 했습니다. CPU가 매번 느린 메모리를 기다리면 코어가 놀게 됩니다. 그래서 CPU 안에 작고 매우 빠른 저장소를 두는데, 이것이 **캐시(cache)**입니다.

캐시는 보통 세 단계입니다.

단계크기속도위치
L1수십 KB가장 빠름코어마다 따로
L2수백 KB ~ 수 MB빠름코어마다 또는 공유
L3수 MB ~ 수십 MB보통여러 코어가 공유

CPU는 필요한 데이터를 L1부터 찾습니다. 있으면 캐시 히트, 없으면 한 단계 아래로 내려가고, 끝내 캐시에 없으면 느린 메모리까지 갑니다. 이것이 캐시 미스입니다. 캐시 미스가 잦으면 코어는 메모리를 기다리느라 빠른 클럭을 놀립니다.

그래서 같은 코어 수와 클럭이라도 캐시가 큰 CPU가 더 빠른 경우가 많습니다. 자주 쓰는 데이터가 캐시 안에 머무를 확률이 높아지기 때문입니다.

vCPU의 정체 #

클라우드 사양표는 코어가 아니라 vCPU로 적혀 있습니다. t3.medium은 2vCPU, c5.xlarge는 4vCPU 같은 식입니다. 이 vCPU가 정확히 무엇일까요.

대부분의 클라우드에서 1vCPU는 물리 코어 하나가 아니라 하이퍼스레드 하나입니다. 즉 물리 코어 하나가 스레드 둘을 처리하면 그 코어는 2vCPU로 팔립니다.

물리 코어와 vCPU의 관계 (일반적인 경우)
물리 코어 1개 (하이퍼스레딩 ON)
   ├─ 스레드 1  →  vCPU 1
   └─ 스레드 2  →  vCPU 2

4vCPU 인스턴스 = 보통 물리 코어 2개에 해당

그래서 “4vCPU"를 물리 코어 4개로 기대하면 어긋납니다. 물리 코어 2개가 더 정확한 그림입니다. 일부 고성능 인스턴스나 베어메탈 타입은 1vCPU를 물리 코어 하나로 제공하기도 하므로, 정확한 값은 인스턴스 문서에서 확인해야 합니다. 인스턴스 타입을 종합해 읽는 법은 #9에서 다루겠습니다.

코어를 늘려도 안 빨라질 때 #

#1의 오해를 다시 짚겠습니다. 코어를 늘리면 항상 빨라진다는 생각은 자주 어긋납니다.

한 작업이 빨라지려면 그 작업이 여러 조각으로 나뉘어 여러 코어에서 동시에 돌 수 있어야 합니다. 그런데 많은 작업에는 나눌 수 없는 직렬 구간이 있습니다. 앞 단계의 결과가 나와야 다음 단계를 시작할 수 있는 부분입니다. 이 구간은 코어가 아무리 많아도 한 코어에서 순서대로 돌 수밖에 없습니다.

직렬 구간이 한계를 만든다
작업 전체 = 직렬 20% + 병렬 가능 80%

코어 1개:  ████████████████████  (100)
코어 4개:  ████ + ████              (직렬 20 + 병렬 20 = 40)
코어 무한: ████ + ▏                 (직렬 20 + 거의 0 = 20에 수렴)

직렬 구간이 20%면 코어를 무한히 늘려도 5배 이상은 빨라지지 않습니다. 이것이 암달의 법칙입니다.

정리하면, 코어를 늘려서 이득을 보는 경우는 둘입니다. 서로 독립적인 요청을 여럿 동시에 처리할 때(웹 서버처럼), 또는 하나의 작업이 잘 병렬화될 때입니다. 단일 스레드로만 도는 작업은 코어 수보다 코어 하나의 빠르기(클럭,IPC,캐시)가 중요합니다.

자주 만나는 함정 #

“CPU 사용률 100%면 무조건 증설” #

CPU가 진짜 일하느라 100%인지, 다른 자원을 기다리며 도는지를 구분해야 합니다. 디스크나 네트워크를 기다리는 동안 사용률이 높게 보이는 경우도 있으므로, #1의 원칙대로 병목을 먼저 측정합니다.

“vCPU 수 = 물리 코어 수” #

대부분의 인스턴스에서 vCPU는 하이퍼스레드 단위입니다. 4vCPU는 보통 물리 코어 2개입니다. CPU에 민감한 워크로드라면 이 차이를 감안해 타입을 골라야 합니다.

“버스터블 인스턴스의 일관된 성능 기대” #

t 계열 같은 버스터블 인스턴스는 평소 일정 수준만 보장하고 크레딧으로 잠깐만 더 냅니다. 크레딧이 떨어지면 성능이 제한되므로, 꾸준히 CPU를 쓰는 워크로드에는 맞지 않습니다.

“클럭 숫자로 세대가 다른 CPU 비교” #

세대가 다르면 사이클당 처리량이 달라 클럭 비교는 빗나갑니다. 클럭은 같은 세대 안에서만 단순 비교가 통합니다.

정리 #

이번 글에서 잡은 그림입니다.

  • 코어는 독립적으로 계산하는 단위이고, 많을수록 동시에 처리할 일이 늘어납니다.
  • **하이퍼스레딩(SMT)**은 코어 하나가 스레드 둘을 번갈아 처리해 활용도를 높입니다. 성능이 두 배가 되지는 않습니다.
  • 클럭은 단일 코어의 빠르기 지표일 뿐, 세대와 코어 수가 다르면 숫자 비교는 의미가 약합니다.
  • 캐시(L1,L2,L3)는 느린 메모리를 기다리는 시간을 줄입니다. 캐시 미스가 잦으면 빠른 클럭도 놀게 됩니다.
  • 클라우드의 1vCPU는 보통 하이퍼스레드 하나입니다. 4vCPU는 대체로 물리 코어 2개입니다.
  • 코어를 늘려 이득을 보려면 작업이 병렬화되거나 요청이 여럿이어야 합니다. 직렬 구간은 암달의 법칙대로 한계를 만듭니다.

다음 — 메모리 #

CPU가 아무리 빨라도 데이터가 가까이 없으면 기다려야 합니다. 그 작업 공간이 메모리입니다. #3 메모리 — RAM과 계층 구조, 스왑이 시작되면 벌어지는 일에서는 RAM의 정체, 레지스터에서 디스크까지 이어지는 메모리 계층, 그리고 메모리가 부족해질 때 시스템이 느린 디스크로 빠지며 성능이 절벽처럼 떨어지는 과정을 정리하겠습니다.

X