메모리 기본
From DevNote
Contents |
Intro
비단 멀티스레드 프로그래밍에서 뿐만 아니라 메모리 사용을 어떻게 하느냐는 매우 중요한 문제이다. 메모리 사용이 프로그램 전체 성능에 큰 영향을 미치는 가장 큰 이유는 CPU속도에 비해 메모리 액세스 속도는 턱없이 느리기 때문이다. 최신 CPU는 거의 한 CPU 싸이클에 적어도 하나 이상의 연산을 수행한다. 하지만, RAM에 있는 값을 읽거나 쓰는데는 약 100ns가 걸린다. 예를 들면 펜티엄 4 1.5GHz의 경우 4500 MIPS(Million Instruction Per Second)의 성능을 보인다. 다시말해 1초에 45억개의 연산이 가능하다는 것이다. 이에 비해 메모리 액세스는 1초에 1천만번 가능하다.
100 MHz DDR SDRAM의 경우 52ns의 대기시간(latency)를 보이므로 1초에 2천만번 읽거나 쓰기가 가능하다. 따라서, 펜티엄 4 1.5GHz CPU는 메모리 액세스를 위해 1초에 최대 225개 연산을 낭비하는 샘이 된다.
최근에 개발된 DDR2의 경우 초당 메모리 전송량은 늘어나고 있으나 대기시간은 오히려 증가하고 있다는 것을 알 수 있다. [1]
여기서 우리는 흔히 DDR메모리가 더 빠르다라고만 이해하고 있지 지연시간 혹은 대기시간이라고 할 수 있는 Latency와 메모리 대역폭(Bandwidth)이 서로 어떻게 다른지 제대로 이해하고 있는 사람은 드물다. 따라서 이에 관해 조금 더 자세히 살펴보고 넘어가도록 하자. 이 두가지를 정확히 이해하는 것이 고성능 프로그래밍에서 매우 중요하다.
Bandwidth vs Latency
| 성능향상의 추세를 검토한 결과, 많은 기술에 걸쳐 일치되는 한가지 현상이 나를 깜짝 놀라게 하였다. 그것은 대역폭(Bandwidth)은 지연시간(Latency)에 비해 훨씬 빨리 향상 발전된다는 것이다. 대역폭은 적어도 지연시간이 향상되는 것의 제곱배 이상의 성능향상을 보인다. [2] |
보통 자동차의 성능을 말할 때 우리는 흔히 최고 몇 마력을 낼 수 있는지 최고 속력은 얼마인지 말하곤 한다. 최대속력은 대역폭(Bandwidth)에 비유할 수 있다. 그런데, 고급차의 경우 순간 가속력이라고하여 정지 상태에서 시속 100km의 속도를 내는데 걸리는 시간을 매우 중요하게 선전하고 있음을 알 수 있는데 이것을 지연시간(Latency)에 비유할 수 있다. 자동차의 예에서도 최고속력보다 순간가속력을 높이는 것이 어렵다는 것 알 수있는데, 실제 운전에 있어서 최고 속력이 시속 200 km 라고 해도 실제 이 속력으로 달릴 수 있는 도로는 없으며 대부분의 차의 최고 속력이 시속 180 km 이상인 요즘에 큰 의미는 없다. 하지만, 순간가속력은 정지상태에서 출발할 때 다른 차보다 앞서 나갈 수 있음을 의미하며 실제로 유용하다. 비슷한 예로 2차선 도로를 4차선으로 늘려렸다고 해도 자동차들이 2배 더 빠른 속력으로 달리게 되는 것은 아니다.
이제 네트웍을 예로 들어보자. 인터넷 서비스 제공 업체(ISP)들이 선전하는 몇 Mbps니 하는 것은 대역폭으로, 초당 전송 비트수를 말한다. 즉, 초당 얼마나 많은 데이터를 전송할 수 있느냐가 네트웍 대역폭에 해당한다. 그리고 현재 지점에서 최종 목적지까지 네트웍 패킷이 도달하는데 걸리는 시간은 지연시간(Latency)이다. 대역폭이 중요한 것은 사실이나, 네트웍에 있어 아무리 대역폭이 크다고 하더라도 지연시간이 길다면, 실제 느끼는 속도는 대역폭과 매우 차이가 클 수 있다. 네트웍에서 지연시간이 생기는 이유는 다름 아닌 신호가 선을 타고 최종 지점까지 도달하는데 걸리는 시간 있기 때문이다. 아무리 빨리 신호를 보낸다고 해도 그것은 빛의 속도보다 빠를 수는 없다. 또 중간 중간 네트웍 라우터와 같은 장비를 거치면서 걸리는 처리 시간이 추가되기 때문이다.
| 대역폭 문제는 돈으로 해결할 수 있다. 하지만 빛의 속도는 정해져 있기 때문에 지연시간 문제를 해결하는 것은 어렵다. 신을 돈으로 매수할 수는 없기 때문이다. -무명씨 |
예를 들면 서울에서 부산간 거리는 약 430km이며 빛의 속도는 초당 299,792,458미터이므로, 빛은 서울에서 부산까지 가는데 1.4 밀리초(ms)가 걸린다. 따라서 네트웍 지연시간은 서울에서 부산간에 적어도 1.4 밀리초 이상이 걸린다. 서울에서 LA까지 거리가 대충 12,000 Km 라고 한다면 빛의속도로 40 ms정도가 걸린다.
아래 그림은 PingPlotter를 사용하여 미국 시애틀에서 한국의 KT IDC간의 Ping시간을 측정한 것이다. 최종 목적지에는 도달하지 못하였으나 (보통 보안을 위해 최종 서버와 연결된 라우터에서는 tracert가 사용하는 ICMP 패킷을 막는다), 마지막 도달한 IP 주소 211.63.213.210 노드는 분당 KT 데이터 센터 내부에 있는 라우터이다. 여기까지 도달시간은 평균 187 ms가 걸리고 있다.
버클리대 교수인 데이비드 패터슨은 대역폭은 빠른 속도로 향상되고 있으나, 이에 비해 지연시간은 쉽게 줄어들지 않는 이유에 관해 다음과 같이 정리하였다. [2]
- 무어의 법칙은 지연시간보다는 대역폭 향상에 도움을 준다. 무어의 법칙은 트랜지스터 수 혹은 집적도가 2년만에 두배가 된다는 것으로 보다 많은 트랜지스터와 보다 많은 반도체 핀들이 동시에 동작한다는 것이다. 보다 빠른 트랜지스터는 지연시간을 줄여주지만 수많은 트랜지스터와 늘어나는 칩의 크기가 지연시간을 훨씬 더 증가 시킨다.
- 거리가 최소 지연시간을 제한한다. 패킷을 받는 해당 컴퓨터가 300미터 떨어져 있다면, 지연시간은 1 마이크로초 이하가 될 수 없다.
- 대역폭은 일반적으로 마켓팅 선전효과가 더 좋다. 네트웍 기술을 잘 모르는 고객들에게 100 Mbps혹은 10 Gbps 라고 말하는 것이 10마이크로초 지연시간이라고 말하는 것보다 이해시키기 쉽고 선전하기도 쉽다. (100 Mbps가 1 Mbps 보다 100배 빠른 것으로 생각하기 쉬우나 실제로는 그렇지 않다는 것을 기억하기 바란다)
- 지연시간의 단축은 대역폭 향상에 도움을 주나 대역폭 향상이 지연시간을 단축시켜 주지는 않는다.
- 대역폭향상이 지연시간을 증가시킨다. Queuing 이론에 따르면 버퍼는 대역폭을 향상시켜주지만 지연시간을 증가시킨다.
- 운영체제의 오버헤드가 지연시간을 늘린다.
대역폭 향상이 지연시간을 늘리는 예를 들어보도록 하겠다. TCP 프로토콜에는 nagling 이라는 기능이 있다. TCP의 패킷 헤더에는 그 패킷에 관한 정보가 있는데 이것은 최소 20바이트이다. 따라서 1바이트의 데이터를 보낸다해도 최소 21바이트의 전송량이 필요하다. 이러한 작은 메시지들은 상당한 네트웍 대역폭 낭비를 초래하므로 TCP의 nagling은 작은 메시지 여러개를 보다 큰 크기로 합쳐 한 번에 전송하도록 설계되어 있다. 이것은 대역폭을 효율적으로 사용하도록 하지만 지연시간을 증가시키는 결과를 초래한다.
그래픽 디스플레이 화면의 해상도는 계속 증가해왔다. 하지만 초당 프레임수(FPS)의 향상은 매우 더디며 해상도가 늘어날수록 더욱 힘들어지고 있다.
실시간 플레이가 매우 중요한 FPS나 RTS게임의 경우 네트웍 지연시간으로 인해 지리적으로 서로 멀리 떨어져 있는 사람들끼리 하나의 서버에 접속해서 실시간 게임을 플레이할 때 이른바 랙(lag)이 발생하거나 플레이가 불가능할 수도 있다. 대역폭을 아무리 늘린다고 해도 지연시간은 빛의 속도라는 넘지 못하는 벽에 부딪친다.
인터넷 통신 프로코콜의 표준인 TCP는 데이터를 전송한 뒤 응답(acknowledgment)을 받기 전까지는 다음 데이터 패킷을 전송하지 않는다. 즉, 데이터가 양쪽 노드를 왕복하는데 걸리는 시간 (RTT: Round Trip Time)이 100ms라고 한다면, 패킷 #1을 보내 ACK가 돌아오는데 100ms가 걸리며, 이 응답을 받고 나서야 다음 패킷인 #2를 전송하게 된다. 따라서 큰 대역폭을 가지고 있어도 Latency가 크다면 실제 전송 속도는 느려지게 된다. 이러한 경우 한번에 보내는 패킷의 전송 사이즈를 늘리면 전송 속도가 어느 정도 향상되는 효과가 나타나는데, 윈도우즈 비스타의 경우 전송 윈도우 사이즈를 오토튜닝하는 기능이 추가되었다.[3]
데이비드 패터슨의 말처럼 대역폭 향상과 지연시간 단축의 불일치 현상은 네트웍 뿐 아니라 IT관련 모든 기술에 걸쳐 나타나고 있다. 대역폭과 지연시간 단축간의 차이는 단시간에 좁혀지지 않을뿐아니라 계속 벌어질 것으로 예상되므로, 우리가 보다 관심을 가져야할 것은 대역폭 보다는 지연시간 단축이라는 것이다.
메모리 액세스 시간 비교
아래 그림은 각 메모리 타입별 액세스 시간을 CPU 싸이클로 비교한 것이다. 메인메모리 액세스 시간은 CPU상의 레지스터 액세스 시간보다 100배가 더 걸린다. 디스크의 경우 1 백만에서 1 천만배 이상 더 걸린다. 당연하지만, 이것이 의미하는 것은 되도록 디스크와 메인메모리 액세스를 줄이는 것이 큰 성능 향상을 가져 온다는 것이다.
(인텔 듀얼 코어 CPU의 경우 SmartCache 라는 이름으로 L2캐쉬가 칩위에 내장되어 있어 보다 빠른 액세스 시간을 보인다.)
참고 문서와 각주
- ↑ http://www.digit-life.com/articles2/ddr2-rmma/ddr2-rmma.html
- ↑ 2.0 2.1 Latency Lags Bandwidth. CACM October 2004/Vol. 47. No. 10
- ↑ http://www.ietf.org/rfc/rfc1323.txt 와 http://blogs.msdn.com/wndp/archive/2006/05/05/Winhec-blog-tcpip-2.aspx 참고


