[web]대규모 데이터 처리 - 디스크와 메모리

[web]대규모 데이터 처리 - 디스크와 메모리

select count(*) from relword;

해당 쿼리에서 몇억개 이상의 레코드가 존재한다면 어떻게 될까?
이러한 규모의 데이터베이스에서 인덱스를 태우지 않고 특정한 레코드를 조회한다면 200초가 경과해도 검색결과가 나오지 않는다.
왜냐하면 메모리 내에서 계산 할 수 없어서 디스크를 읽고 있기 때문이다.
디스크에서 데이터를 조회하면 메모리에 비해 엄청난 시간이 걸린다.
대규모 데이터를 처리할 때 나타나는 어려운점은 메모리 내에서 계산할 수 없다는 점이다.

대규모 데이터 처리의 어려운점

  • 메모리 내에서 계산할 수 없기 때문에 디스크에 있는 데이터를 검색할 필요가 있다

  • 하지만 디스크는 느리므로 I/O에 시간이 걸린다. (메모리는 디스크보다 10만~100만배 이상 빠르다)

디스크는 왜 느릴까

디스크와 메모리의 차이

메모리는 전기적인 부품이므로 물리적 구조는 탐색속도와 그다지 관계가 없다. 포인터를 이동시킬때에도 마이크로초 단위로 걸리기 때문에 속도가 매우 빠르다.

하지만 디스크는 동축 상에 원반이 쌓여있다. 이 원반이 회전하고 있고 여기서 데이터를 읽어난다.

즉, 메모리와는 달리 회전 등의 물리적인 동작을 수반하고 있다. 이 물리적인 구조가 탐색 속도에 영향을 준다. 원반의 데이터를 읽는 헤드가 있는데 원하는 데이터를 읽으려면 데이터가 놓은 원반을 헤드로 옮기는 작업이 필요하다.

따라서 메모리는 1회 탐색할 때 마이크로초면 되지만, 디스크는 수 밀리초가 걸린다.

OS레벨에서 디스크 최적화

디스크는 느리지만 OS는 이를 커버하는 작업을 한다. OS는 연속된 데이터를 같은 위치에 쌓는다. 그리고 나서 데이터를 읽을 때 1바이트 씩 읽는 것이 아니라 4KB정도를 한꺼번에 읽도록 되어있다.

이렇게 해서 비슷한 데이터를 비슷한 곳에 두어 1번의 디스크 회전으로 최대한 많은 데이터를 읽는다. 그 결과로 디스크 회전횟수를 최소하 한다. 그렇지만 결국 1회전당 밀리초 단위의 시간이 걸리므로 메모리와의 속도차를 피할 수 있는 것은 아니다.

전송속도, 버스의 속도차

탐색속도 측면에서 메모리가 디스크에 비해 빠르다는 이야기를 해왔다. 이번에는 전송속도 차이를 살펴보자. 메모리나 디스크 모두 CPU와 버스로 연결되어 있다. 메모리와 CPU는 상당히 빠른 버스로 연결되어 있어서 초당 약 7GB의 데이터를 전송하지만, 디스크는 초당 50MB 의 전송속도에 그친다. 따라서 데이터가 많으면 많을 수록 디스크와 메모리의 속도 차이도 두드러지게 된다.

그렇다면 SSD는?

훨씬 빠른 디스크인 SSD도 예외는 아니다. SSD는 물리적인 회전이 아니므로 탐색은 빠르지만 버스 속도가 병목이 되거나 그 밖에 구조에 기인하는 면이 있어서 역시나 메모리 만큼의 속도가 나오지 않는다.