메모리 월, 대역폭과 지연 시간이 따로 막히는 이유
연극에서 다음 장면의 소품이 늦으면, 배우가 아무리 준비되어 있어도 객석은 그 공백을 그대로 느낍니다. 소품을 나르는 스태프를 늘려도, 소품 하나가 창고에서 무대까지 오는 시간은 크게 줄지 않죠.
메모리 월은 컴퓨터 안에서 바로 이런 일이 벌어지는 현상을 가리킵니다. 프로세서의 계산 속도가 빨라지는 동안 메모리에서 데이터를 가져오는 속도가 그만큼 따라가지 못해서, 계산 준비를 마친 프로세서가 기다리게 됩니다.
비유와 다른 점은 막히는 곳이 한 군데가 아니라는 것입니다. 한 번에 나르는 양과 하나가 도착하는 시간이 서로 다른 방식으로 병목을 만듭니다.
메모리 월이 생긴 배경, 연산과 기억의 속도 격차
컴퓨터는 계산하는 곳과 데이터를 보관하는 곳이 따로 있고, 그 사이를 배선으로 잇는 구조를 오랫동안 써 왔습니다. 이 구조에서 계산 장치와 기억 장치 사이의 전송 속도가 전체 성능의 발목을 잡는 현상을 폰 노이만 병목(Von Neumann Bottleneck)이라고 부릅니다.
프로세서는 미세화와 구조 개선으로 연산 성능이 꾸준히 올랐지만, DRAM에서 데이터를 꺼내는 시간은 같은 속도로 줄지 못했습니다. DRAM은 셀의 미세한 전하 차이를 감지해 값을 읽는 물리적 과정을 거쳐야 하므로, 첫 데이터가 나오기까지의 시간이 오랜 기간 크게 줄지 않았습니다.
이렇게 벌어진 격차를 장벽에 빗댄 표현이 메모리 월입니다. 계산 능력이 아무리 늘어도 데이터가 제때 오지 않으면 그 능력의 상당 부분이 놀게 됩니다.
대역폭과 지연 시간, 파이프 굵기와 물이 닿는 시간
대역폭(Bandwidth)은 단위 시간당 옮길 수 있는 데이터의 양이고, 지연 시간(Latency)은 요청을 보낸 뒤 첫 데이터가 도착하기까지 걸리는 시간입니다. 파이프에 빗대면 대역폭은 파이프의 굵기이고 지연 시간은 수도꼭지를 튼 뒤 첫 물이 닿는 시간입니다.
파이프를 굵게 만들면 한꺼번에 흐르는 물의 양은 늘지만, 첫 물이 도착하는 시간은 그대로입니다. 두 값은 서로 다른 성질이어서, 한쪽이 좋아져도 다른 쪽이 따라 좋아지지 않습니다.
다만 메모리에서는 두 값이 완전히 독립적이지는 않습니다. 요청이 한꺼번에 몰려 대기열이 길어지면 지연 시간도 함께 늘어납니다.
요청 한 건이 프로세서에 닿기까지의 경로
프로세서가 메모리의 값 하나를 필요로 할 때 그 값이 어디에 있느냐에 따라 기다림이 크게 달라집니다. 가까운 캐시에 있으면 짧게, 먼 DRAM까지 가야 하면 길게 기다립니다.
데이터가 캐시에 없을 때의 경로
- 프로세서가 가장 가까운 캐시를 조회하지만 값이 없습니다.
- 더 큰 상위 캐시를 차례로 조회해도 값이 없습니다.
- 메모리 컨트롤러가 DRAM에 읽기 요청을 보냅니다.
- DRAM이 해당 줄을 활성화하고 컬럼을 읽어 데이터를 내보냅니다.
- 데이터가 버스를 거쳐 돌아와 캐시에 채워집니다.
- 기다리던 연산이 재개됩니다. 이 전체 시간이 지연 시간입니다.
이 경로는 단계마다 시간이 쌓입니다. 한 건의 요청이 느린 것과 요청을 처리하는 통로가 좁은 것은 서로 다른 문제입니다.
가상 계산으로 보는 대역폭과 지연의 관계
데이터를 옮기는 전체 시간은 대략 지연 시간에 데이터 크기를 대역폭으로 나눈 값을 더한 것입니다. 작은 데이터는 지연이 지배하고, 큰 데이터는 대역폭이 지배합니다.
가상 계산 예시 1, 전송 시간실제 제품 값이 아니라 설명을 위한 가정입니다. 대역폭 100 GB/s, 지연 시간 100 ns라고 둡니다.
64바이트를 읽으면 100 ns + 64 B ÷ 100 GB/s = 100 ns + 0.64 ns ≈ 100.64 ns로, 거의 전부가 지연입니다. 1 GB를 읽으면 100 ns + 1 GB ÷ 100 GB/s = 10 ms에 100 ns가 더해진 값이어서, 거의 전부가 대역폭 몫입니다.
또 하나의 관계는 통로를 채우려면 요청을 동시에 여러 개 걸어 두어야 한다는 점입니다. 대역폭에 지연 시간을 곱한 만큼의 데이터가 항상 이동 중이어야 통로가 가득 찹니다.
가상 계산 예시 2, 통로를 채우는 데 필요한 요청 수같은 가정(100 GB/s, 100 ns)을 씁니다.
이동 중이어야 할 데이터는 100 GB/s × 100 ns = 10,000 B이고, 64바이트 단위로 나누면 약 156개의 요청이 동시에 날아가야 합니다.
앞 요청의 결과가 있어야 다음 주소를 알 수 있는 구조처럼 요청을 하나씩만 보내면, 64 B ÷ 100 ns = 0.64 GB/s로 대역폭의 0.64%밖에 쓰지 못합니다.
같은 메모리라도 접근 방식에 따라 체감 성능이 이렇게 갈립니다. 큰 배열을 순서대로 읽는 일은 대역폭을, 포인터를 따라 연달아 건너가는 일은 지연 시간을 시험합니다.
장벽을 낮추는 방법과 흔한 오해
메모리 월을 낮추는 방법은 어느 쪽 병목을 겨냥하느냐로 갈립니다. 캐시는 자주 쓰는 데이터를 가까이 두어 지연을 줄이고, 프리페치는 곧 쓸 데이터를 미리 가져와 지연을 가립니다.
GPU처럼 스레드를 아주 많이 두는 구조는 한 스레드가 기다리는 동안 다른 스레드를 돌려 지연을 숨기는 대신 대역폭을 많이 요구합니다. HBM은 매우 넓은 인터페이스로 대역폭을 크게 키우는 방식이고, PIM은 데이터를 멀리 옮기지 않고 메모리 가까이에서 계산해 이동 자체를 줄이려는 시도입니다.
대역폭만 늘리면 기다림도 함께 줄어든다는 생각은 오해입니다. 대역폭이 커져도 첫 데이터가 도착하는 시간은 크게 달라지지 않는다고 알려져 있어서, 지연에 민감한 작업은 여전히 캐시와 접근 패턴에 크게 좌우됩니다.
데이터를 멀리, 많이 옮길수록 에너지가 더 든다는 점도 같은 문제의 다른 얼굴입니다. 그래서 메모리 월은 속도뿐 아니라 전력의 문제로도 이어지는 경향이 있습니다.
대역폭과 지연 시간 비교 표
| 구분 | 대역폭 | 지연 시간 |
|---|---|---|
| 의미 | 단위 시간당 옮기는 데이터 양 | 요청 후 첫 데이터가 도착하기까지의 시간 |
| 단위 | GB/s 같은 초당 용량 | ns 같은 시간 |
| 비유 | 파이프의 굵기 | 물이 닿는 시간 |
| 늘리거나 줄이는 방법 | 채널과 폭을 넓히고 전송 속도를 높임 | 거리를 줄이고 캐시로 가깝게 두며 접근 단계를 줄임 |
| 잘 드러나는 작업 | 큰 배열을 순서대로 읽는 대용량 작업 | 앞 결과에 이어지는 연달은 접근 |
| 완화 수단 예 | HBM 같은 넓은 인터페이스 | 캐시, 프리페치, 스레드로 가리기 |
| 흔한 오해 | 하나가 좋아지면 다른 하나도 자동으로 좋아진다는 생각은 맞지 않습니다. | |
핵심 정리
메모리 월은 프로세서의 연산 성능이 늘어나는 속도를 메모리 접근 속도가 따라가지 못해 생기는 격차입니다. 이 격차는 한 번에 옮기는 양인 대역폭과 첫 데이터가 닿는 시간인 지연 시간이라는 서로 다른 두 축으로 나타납니다.
대역폭은 통로를 넓혀서, 지연은 가까이 두거나 가려서 다루는 문제입니다. 소품을 나르는 스태프를 늘리는 일과 소품이 오는 시간을 줄이는 일이 다르듯, 어떤 작업이 어느 병목에 걸리는지 먼저 구분하는 것이 출발점입니다.
면접 대비 질문
면접 대비 질문메모리 월이 무엇인지 설명하고, 대역폭과 지연 시간이 어떻게 다른지, 각각을 완화하는 방법은 무엇인지 말해 보세요.
[답변 포인트] 프로세서 연산 성능의 증가 속도와 메모리 접근 속도의 증가 속도가 벌어져 프로세서가 데이터를 기다리게 되는 현상이라고 정의합니다. 대역폭은 단위 시간당 전송량이고 지연 시간은 첫 데이터가 도착하는 시간이라는 점을 파이프 굵기와 물이 닿는 시간에 빗대어 구분합니다. 대역폭 곱하기 지연 시간만큼의 요청이 동시에 이동 중이어야 통로가 찬다는 관계와, 연달은 의존 접근이 대역폭을 거의 못 쓰는 예를 듭니다. 완화 수단으로 캐시와 프리페치, 스레드로 지연을 가리는 방식, HBM으로 대역폭을 키우는 방식, PIM으로 이동을 줄이는 방식을 병목의 종류에 맞춰 연결하면 좋습니다.









