하드 디스크 드라이브 (HDD)와 솔리드 스테이드 드라이브 (SSD)
기본적으로 컴퓨터에서 CPU, Register, RAM 같은 주요 장치는 전자식 장치이다.
반면에 하드 디스크 드라이브는 기계식 장치다.
전자식 장치들 (이하 CPU, RAM 등) 의 성능은 짧은 시간 동안 매우 빠른 속도로 발전했다. 하지만 디스크 같은 기계식 장치들의 성능은 상당히 제한적으로 발전했다.
비록 최근에는 자기 디스크 원판에 의존하는 하드 디스크(HDD) 보다 원판을 사용하지 않고 NAND 플래시 메모리를 사용하는 SSD 드라이브가 많이 활용되고 있지만, 여전히 데이터 저장 매체는 컴퓨터의 가장 느린 부분이라는 사실에는 변함이 없다.
아래의 막대 그래프를 보면 HDD 보다 빠른 성능을 보이는 SSD 조차도 CPU와 약 만배 정도 차이를 보인다. HDD와는 10만배 차이가 날 정도로 처리 속도에서 많은 차이를 보인다.
암달의 법칙
컴퓨터 시스템에 있어서 일부 성능을 개선했을 때 그것이 시스템 전체 성능에 얼머나 영향을 미쳤는지 계산하는데 사용되는 공식이다.
이걸 갑자기 왜 언급하냐고 하면, 어떠한 사용자 요청이 있을 때 아무리 어플리케이션 레벨에서 최적화를 진행한다고 해도, 전체 성능에 대부분의 병목을 차지하는 디스크 접근의 횟수가 줄지 않는다면 유의미한 성능 개선의 효과를 얻는 목표치에 다다르지 못할 수 있기 때문에 그렇다.
암달의 법칙을 적용해서 예시를 보자.
예를 들어 CPU의 연산을 필요로 하는 A 로직이 10%고 어떠한 데이터를 조회해야 하는 B 로직이 90%일 때, A로직의 성능을 2배 빠르게 개선했다고 했을 때 전체 로직 성능에는 얼만큼 영향을 미칠까?
일단 암달의 법칙은 다음과 같다.
전체 작업 시간인 P에 대해서 S만큼의 성능 향상을 보였다고 할 때 다음과 같은 식이 나온다.
\[ \frac{1}{(1 - P) + \frac{P}{S}} \]
전체 시스템 성능에서 약 10%를 차지하는 P에 대해서 작업속도를 2배 만큼 향상시켰다고 했을 때, 전체 작업 속도는 약 1.05배 증가하게 된다.
아무리 A로직의 성능을 더 향상시킨다고 한들 성능 향상 폭은 한계가 있을 것 이다. 그렇다면 병목현상이 발생하는 디스크 읽기 방식에 대해서 더 알아보자.
순차 I/O 와 랜덤 I/O
먼저 순차 I/O를 살펴보면, 데이터 저장 방식이 순차적으로 되어 있어 저장 순서대로 읽거나 쓰는 방식이다. 그렇기 때문에 3개의 페이지를 디스크에 기록하기 위해 1번 시스템 콜을 요청하게 된다.
랜덤 I/O의 경우에는 물리적으로 데이터 저장 방식이 불연속적으로 저장되어 있기 때문에 하드 디스크의 원판을 돌려서 읽어야 할 데이터가 저장된 위치로 디스크 헤더를 이동시킨 다음에 데이터를 읽는 것을 의미한다.
그러나 순차 I/O든 랜덤 I/O든 결국 데이터의 위치로 디스크 헤더를 옮겨서 찾아야 하는 과정은 같다. 그렇다면 어떤 차이가 있는걸까?
순차 I/O는 좀전에 언급한 것 처럼 3개의 페이지를 디스크에 기록하기 위해 1번의 시스템 콜을 요청한다. 그렇게 되면 디스크에 기록해야 할 위치를 찾기 위해 디스크 헤더를 1번만 움직이게 된다. 하지만 랜덤 I/O의 경우에는 데이터가 불연속적으로 저장되어 있기 때문에 3번의 시스템 콜을 요청한다. 그러므로 디스크 헤더를 3번이나 움직여야 한다. 결국 순차 I/O는 랜덤 I/O보다 대략 3배 정도 빠르다고 볼 수 있다.
해당 차이점을 미루어 보았을 때, 순차I/O가 성능이 더 좋아보인다. 그럼 이제 어떤 유형의 요청이든 순차I/O로 처리하면 되는건가?
아니다. 경우에 따라 유형에 따라 다르게 쓰인다. SSD의 디스크 읽기 방식에 대해서 알아보자.
SSD의 읽기 방식
방금 설명한 방식은 HDD 관점에서 기술한 것 이다. SSD의 경우 HDD 보다 랜덤 I/O의 성능이 훨씬 좋다.
이유는 원판이 없고 플래시 메모리를 사용하기 때문이다. 그래서 SSD의 순차I/O와 랜덤I/O의 성능은 별 차이가 없을 것 같지만 여전히 순차 I/O보다 전체 스루풋(Throughout)이 떨어진다. 그래서 SSD의 드라이브 사양에도 항상 순차 I/O와 랜덤 I/O의 성능 비교를 구분해서 명시한다.
쿼리 튜닝 성능 개선
우리가 일반적으로 RDMBS를 사용하는 웹 서비스 에서는 정말 대용량으로 데이터를 불러올 일이 많지 않다.
그렇기 때문에 인덱스 레인지 스캔은 데이터를 읽기 위해 주로 랜덤 I/O를 사용하며 풀 테이블 스캔은 순차I/O를 사용한다.
인덱스의 처리 방식을 봤을 때 인덱스는 정렬되어 있으나 포인터가 가르키는 실제 데이터의 위치가 불연속적이기 때문에 바로 데이터에 접근할 수 있는 랜덤 I/O를 사용한다. 그래서 소규모의 데이터를 읽어와야 하는 일이 많은 웹서비스의 데이터베이스는 SSD 디스크를 많이 사용하는 편이다.
큰 테이블의 레코드 대부분을 읽어오는 요청의 경우 옵티마이저가 인덱스를 사용하지 않고 풀 테이블 스캔을 사용하도록 유도할 때도 있다.
이는 순차 I/O가 랜덤 I/O보다 훨씬 빨리 많은 레코드를 읽어올 수 있기 때문인데, 이런 형태는 웹 서비스 보다는 통계 작업이나 대용량 미디어 파일의 스트리밍에 주로 사용된다.
유의미한 성능 개선
마지막으로 아까 암달의 법칙을 언급했듯이 순차 I/O든 랜덤 I/O든 디스크에 접근하는 것이기 때문에 횟수가 많아진다면 유의미한 성능 개선을 하기 어렵다.
또한 쿼리를 튜닝해서 랜덤 I/O를 순차 I/O로 바꿔서 실행할 방법은 그다지 많지 않다. 일반적으로 쿼리를 튜닝하는 것은 랜덤 I/O 자체를 줄여주는 것이 목적이라고 할 수 있다. 여기서 랜덤 I/O를 줄인다는 것은 쿼리를 처리하는데 꼭 필요한 데이터만 읽도록 쿼리를 개선하는 것을 의미한다.
연관 키워드
인덱스
인덱스 레인지 스캔
테이블 풀 스캔
옵티마이저
'Dev > DB' 카테고리의 다른 글
트랜잭션과 격리수준 (1) | 2024.02.08 |
---|---|
이상현상 (Anomaly) (0) | 2024.02.01 |
SQL 처리 과정 (0) | 2024.01.18 |