SSD vs HDD 성능 차이 테스트
디스크 타입에 따른 성능
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
위 스크립트를 실행하여 얻은 결과를 그래프로 비교한 결과는 아래와 같습니다.
두 가지 테스트를 통해 아래와 같은 사실을 확인할 수 있었습니다.
- SSD (gp3) vs Cold HDD 8GB 기준 File I/O 성능 비교 시, 약 45배 정도의 성능 차이가 발생.
- File I/O 차이만큼 디스크 I/O로 인한 Sorting 쿼리 성능 차이가 나진 않았지만, (1.6배) 병렬 세션 수에 비례해서 성능차이가 증가.
- Random I/O 성능면에서 SSD가 HDD보다 훨씬 뛰어남