하드웨어 기초 #2 CPU — 코어 / 스레드 / 클럭 / 캐시, 그리고 vCPU의 정체
#1에서 네 자원 중 계산을 맡은 부품이 CPU라고 정리했습니다. 이번 글은 그 CPU를 한 층 깊이 들여다봅니다. 코어, 스레드, 클럭, 캐시라는 네 단어는 인스턴스를 고를 때마다 마주치지만 정확히 무엇을 뜻하는지는 의외로 흐릿합니다. 마지막에는 클라우드 사양표에 적힌 vCPU가 실제로 무엇인지까지 짚겠습니다.
하드웨어 기초 시리즈에서 이번 글의 위치입니다.
- #1 컴퓨터를 움직이는 네 가지 자원 — CPU / 메모리 / 스토리지 / 네트워크
- #2 CPU — 코어 / 스레드 / 클럭 / 캐시, 그리고 vCPU의 정체 ← 이번 글
- #3 메모리 — RAM과 계층 구조, 스왑이 시작되면 벌어지는 일
- #4 스토리지 ① 장치 — HDD / SSD / NVMe와 IOPS / 처리량 / 지연시간
- #5 스토리지 ② 구성과 연결 — RAID와 DAS / NAS / SAN
- #6 네트워크 — 대역폭과 지연시간, NIC에서 데이터센터까지
- #7 가상화와 컨테이너 — 물리 서버 한 대가 여러 대가 되는 원리
- #8 클라우드 — 소유에서 임대로, 온프레미스부터 IaaS / PaaS / SaaS까지
- #9 클라우드 인스턴스 사양 읽는 법 — 워크로드에 맞춰 고르기
CPU가 하는 일 #
CPU는 같은 동작을 한없이 반복합니다. 메모리에서 명령을 하나 가져와(fetch), 무슨 일인지 해석하고(decode), 실행하고(execute), 결과를 적는(write) 사이클입니다. 이 사이클을 1초에 수십억 번 돌립니다.
가져오기 → 해석 → 실행 → 결과 적기 → 다음 명령 가져오기 → ...
(fetch) (decode) (execute) (write)성능을 좌우하는 질문은 둘입니다. 이 사이클을 얼마나 빠르게 도는가(클럭), 그리고 사이클을 도는 일꾼이 몇 명인가(코어,스레드)입니다.
코어와 스레드 #
코어 — 진짜 계산 단위 #
**코어(core)**는 명령어 사이클을 독립적으로 도는 계산 장치입니다. 코어가 4개면 서로 다른 작업 4개를 동시에 진행할 수 있습니다. 옛날에는 CPU 칩 하나에 코어가 하나였지만, 지금은 칩 하나에 코어 여러 개를 넣은 멀티코어가 표준입니다.
코어가 많을수록 동시에 처리할 수 있는 일이 늘어납니다. 웹 서버가 요청 100개를 동시에 받는다면 코어가 많을수록 더 많은 요청을 나란히 처리합니다.
스레드와 하이퍼스레딩 #
**스레드(thread)**는 CPU가 처리하는 하나의 작업 흐름입니다. 코어 하나는 보통 스레드 하나를 처리하지만, 하이퍼스레딩(Hyper-Threading) 또는 SMT라는 기술을 쓰면 코어 하나가 스레드 두 개를 번갈아 처리합니다.
원리는 이렇습니다. 한 스레드가 메모리를 기다리며 잠깐 노는 동안 그 빈 시간에 다른 스레드를 끼워 넣습니다. 코어가 진짜로 둘이 되는 것은 아니고, 노는 시간을 줄여 활용도를 높이는 방식입니다.
물리 코어 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로 팔립니다.
물리 코어 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의 정체, 레지스터에서 디스크까지 이어지는 메모리 계층, 그리고 메모리가 부족해질 때 시스템이 느린 디스크로 빠지며 성능이 절벽처럼 떨어지는 과정을 정리하겠습니다.