디스크 타입에 따른 성능

EBS (=Elastic Block Store)는 저장 매체로 크게 두가지 종류로 나뉘고 아래와 같이 세분화된 종류로 나뉩니다.

위의 표에서 분명한 차이를 확인하기 위해, HDD중 성능이 가장 낮은 sc1(=Cold HDD)와 SSD중 성능이 제일 좋은 gp3(=SSD) 장비에 sysbench 툴을 이용한 성능 비교를 진행했습니다.

sysbench를 이용한 File I/O 성능 비교

성능 비교 환경 구성을 위해 두 가지 EBS(HDD, SSD)를 추가 후 마운트합니다.

## 마운트할 디스크 확인.
$ lsblk -f
NAME    FSTYPE LABEL UUID                                 MOUNTPOINT
xvda
└─xvda1 xfs    /     518d317e-9b1a-43aa-8b7c-850dd3510341 /
xvdf    xfs          7ab58089-47e5-4667-b68c-45a6f3d2262f
xvdg    xfs          c49943b6-68ba-47d5-ad57-ba56a6852ef2
xvdh    xfs          60a2fae0-05d5-4690-96d4-10b9f8784543
 
 
## 디스크 Mount
$ sudo mount dev/xvdg /tmp_hdd
$ sudo mount dev/xvdh /tmp_ssd_gp3
 
## Mount 확인
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        2.0G     0  2.0G   0% /dev
tmpfs           2.0G     0  2.0G   0% /dev/shm
tmpfs           2.0G  428K  2.0G   1% /run
tmpfs           2.0G     0  2.0G   0% /sys/fs/cgroup
/dev/xvda1       32G   17G   16G  51% /
tmpfs           395M     0  395M   0% /run/user/1001
/dev/xvdg       300G  339M  300G   1% /tmp_hdd
/dev/xvdh       300G  339M  300G   1% /tmp_ssd_gp3

이후 디스크별 File I/O 테스트를 진행하기 위해, sysbench 파일을 복사합니다.

## sysbench 파일 복사
$ cp -R /usr/share/sysbench /tmp_ssd_gp3/
$ cp -R /usr/share/sysbench /tmp_hdd/

# 각 디스크에서 File I/O 테스트 환경 구축
$ sysbench --test=fileio --file-total-size=8G prepare
 
-rw------- 1 root root 67108864 Aug  3 05:07 test_file.57
-rw------- 1 root root 67108864 Aug  3 05:07 test_file.58
-rw------- 1 root root 67108864 Aug  3 05:07 test_file.59
-rw------- 1 root root 67108864 Aug  2 09:25 test_file.6
-rw------- 1 root root 67108864 Aug  3 05:07 test_file.60

# 각 디스크에서 file I/O 테스트 실행
$ sysbench fileio --file-total-size=8G --file-test-mode=rndrw  --max-time=30 --report-interval=1

file-test-mode=rndrw 옵션을 사용해, Random I/O (읽기, 쓰기) 성능 차이를 비교한 결과는 아래와 같습니다.

디스크 타입별 mysql 임시테이블 Insert 성능 비교

위 테스트는 sysbench 툴을 이용하여 간접적으로 성능 차이를 확인했습니다. 실제 mysql을 사용하면서 디스크 타입에 따라 성능 차이가 어떻게 나는지 확인하기 위해 임시테이블에 단건 Insert 1000만 건 하는 SP를 생성하여, 완료 시간 기준으로 성능을 비교해봤습니다.

-- 소요시간 기록 테이블 생성
 
CREATE TABLE `time_table` (
  `duration_sec` int(11) DEFAULT NULL,
  `cnt` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
 
-- SP 스크립트
CREATE
    DEFINER = `root`@`%` PROCEDURE `diskio_test`()
BEGIN
    DECLARE cnt int DEFAULT 1;
    DECLARE begin_time datetime;
    DECLARE end_time datetime;
 
    -- MyISAM 임시테이블 (디스크 directory 사용) 생성
    -- Engine=MyISAM 명시하지 않을 시 InnoDB 엔진을 사용하며, ibtmp1 (데이터파일 위치)에 생성되어 디스크 성능 테스트 실패
 
    CREATE TEMPORARY TABLE disk_tmp
    (
        id       int AUTO_INCREMENT PRIMARY KEY,
        calendar date,
        num      int,
        num_2    int,
        Index idx_calendar (Calendar),
        index idx_num (num)
    ) ENGINE = MyISAM;
 
    SELECT NOW() INTO begin_time;
       WHILE (cnt <= 10000000)  -- 단건 Insert 1000만 건.
        DO
               INSERT disk_tmp(calendar, num, num_2)
               VALUES((CURRENT_DATE - INTERVAL FLOOR(RAND() * 14) DAY),
                       cast(rand()*100 as unsigned), cast(rand()*100 as unsigned))
                ;
       
            SET cnt = cnt + 1;
 
        end while;
     SELECT NOW() INTO end_time;
 
            INSERT INTO time_table
            SELECT TIMESTAMPDIFF(SECOND, begin_time, end_time), cnt;
    DROP TEMPORARY TABLE disk_tmp;
END;


call diskio_test();

위 SP를 만든 후, 실제 운영환경과 같이 병렬로 Insert가 발생하는 환경을 재현하기 위해 백그라운드 프로세스로 위 SP를 10개 세션에서 병렬로 실행했습니다

$ vi sp_insert.sh
# sp 실행 구문
mysql -umaster -p[비밀번호ㅑi -h[호스트] -P[포트] -e"call test.diskio_test();"
$ vi disk_io.sh
# 병렬 sp 실행
for ((i=0; i<10; i++)); do

nohup sh sp_insert.sh &

sleep 1
done

위 스크립트를 실행하여 얻은 결과를 그래프로 비교한 결과는 아래와 같습니다.

두 가지 테스트를 통해 아래와 같은 사실을 확인할 수 있었습니다.

  1. SSD (gp3) vs Cold HDD 8GB 기준 File I/O 성능 비교 시, 약 45배 정도의 성능 차이가 발생.
  2. File I/O 차이만큼 디스크 I/O로 인한 Sorting 쿼리 성능 차이가 나진 않았지만, (1.6배) 병렬 세션 수에 비례해서 성능차이가 증가.
  3. Random I/O 성능면에서 SSD가 HDD보다 훨씬 뛰어남