이 글에서는 리눅스 환경에서 디스크 또는 스토리지 어레이의 성능을 확인하는 방법을 소개합니다. IOPS(Input/Output Operations Per Second)는 데이터 스토리지 시스템이 초당 수행하는 입출력 작업의 수를 의미합니다. 여기서 대상은 단일 디스크일 수도 있고, RAID 어레이나 외장 스토리지의 LUN(Logical Unit Number)일 수도 있습니다. 일반적으로 IOPS는 미디어에서 읽거나 쓸 수 있는 블록의 수를 나타냅니다.
대부분의 디스크 제조사는 공칭(nominal) IOPS 값을 표기하지만, 이는 보장되는 수치가 아닙니다. 따라서 프로젝트를 시작하기 전에 스토리지 서브시스템의 실제 성능을 파악하려면, 해당 스토리지가 감당할 수 있는 최대 IOPS 값을 직접 측정해보는 것이 좋습니다.
FIO(Flexible I/O) 도구를 활용한 스토리지 벤치마킹
리눅스에서 디스크 IOPS 성능을 측정하려면 fio 도구를 사용할 수 있습니다. CentOS/RHEL에서는 EPEL 저장소를 통해 설치할 수 있으며, yum(dnf) 패키지 관리자로 다음과 같이 설치합니다.
# yum install epel-release -y
# yum install fio -y
Debian이나 Ubuntu에서는 apt-get으로 설치합니다.
# apt-get install fio
설치 후에는 테스트할 디스크를 식별해야 합니다. 테스트는 해당 디스크나 LUN이 마운트된 디렉터리에서 읽기/쓰기 작업을 수행하는 방식으로 진행됩니다.
호스팅하려는 애플리케이션의 특성과 프로젝트의 전반적인 인프라에 따라 적합한 테스트 모드를 선택하여, 다양한 디스크 부하 시나리오에서 IOPS 성능을 측정해 보겠습니다.
랜덤 읽기/쓰기(Random Read/Write) 테스트
테스트를 실행하면 8GB 크기의 파일이 생성됩니다. 그런 다음 fio가 4KB(표준 블록 크기) 단위로 75/25% 비율(읽기 75%, 쓰기 25%)의 읽기/쓰기 작업을 수행하며 성능을 측정합니다. 명령어는 다음과 같습니다.
# fio --randrepeat=1 --ioengine=libaio --direct=1 --gtod_reduce=1 --name=fiotest --filename=testfio --bs=4k --iodepth=64 --size=8G --readwrite=randrw --rwmixread=75
필자는 SSD 두 개로 구성된 어레이에서 첫 번째 테스트를 진행했으며, 좋은 결과를 얻었습니다.
- 읽기: 3280MiB/s, 평균 IOPS 83,000
- 쓰기: 110MiB/s, 평균 IOPS 28,000
읽기와 쓰기를 혼합한 테스트를 수행했기 때문에, 개별 테스트를 진행하면 더 높은 값이 나옵니다.
비교를 위해 SATA 드라이브(HDD)에서도 동일한 측정을 해보았습니다.
- 읽기: IOPS=430, BW=1.7 MiB/s
- 쓰기: IOPS=143, BW=0.6 MiB/s
당연히 HDD의 결과는 SSD보다 현저히 낮습니다.
랜덤 읽기(Random Read) 테스트
순수하게 랜덤 읽기 작업만 측정하려면 다음 명령어를 실행합니다.
# fio --randrepeat=1 --ioengine=libaio --direct=1 --gtod_reduce=1 --name=fiotest --filename=testfio --bs=4k --iodepth=64 --size=8G --readwrite=randread
명령어의 마지막 부분이 --readwrite=randread로 변경된 점에 유의하세요.
앞서 언급했듯이, 읽기/쓰기를 각각 개별적으로 측정하면 성능이 더 높게 나타납니다.
READ: IOPS=150k, BW=584MiB/s (612MB/s)
랜덤 쓰기(Random Write) 테스트
랜덤 쓰기 작업의 성능을 측정하려면 아래 명령어를 실행합니다.
# fio --randrepeat=1 --ioengine=libaio --direct=1 --gtod_reduce=1 --name=fiotest --filename=fiotest --bs=4k --iodepth=64 --size=8G --readwrite=randwrite
WRITE: IOPS=84.7k, BW=331MiB/s (347MB/s)
성능 좋은 SSD의 경우 쓰기 성능 역시 매우 뛰어납니다. 읽기 테스트와 마찬가지로, 혼합 테스트와 비교하면 약 200~250MiB/s 및 50,000 IOPS 정도의 차이가 발생합니다.
제조사(Intel SSD)의 공식 문서를 참고해보면, 측정된 수치가 실제 사양과 일치한다는 것을 확인할 수 있습니다.
FIO 설정 파일 예시
fio는 대화형 명령어뿐만 아니라, 미리 준비된 설정 파일을 통해서도 디스크 성능을 테스트할 수 있습니다. 이 옵션을 사용하려면 먼저 설정 파일을 생성합니다.
# nano read.fio
그리고 아래 내용을 추가합니다.
[global] rw=randread size=8G filename=/tmp/testfio ioengine=libaio iodepth=4 invalidate=1 direct=1 [bgread] rw=randread iodepth=64
설정 파일을 저장한 후 다음 명령어로 테스트를 시작합니다.
# fio read.fio
이 테스트는 디스크의 읽기 성능을 측정합니다. 쓰기 성능을 테스트하려면 아래와 같은 설정 파일을 사용합니다.
[global] rw=randwrite size=8G filename=/tmp/testfio ioengine=libaio iodepth=4 invalidate=1 direct=1 [bgwrite] rw=randwrite iodepth=64
ioping으로 디스크 지연 시간(Latency) 측정하기
IOPS 외에도 스토리지 품질을 판단하는 중요한 지표가 하나 더 있는데, 바로 지연 시간(latency)입니다. 지연 시간은 입출력 요청의 지연 정도를 나타내며, 스토리지에 접근하는 데 걸리는 시간을 밀리초(ms) 단위로 측정합니다. 지연 시간이 클수록 애플리케이션이 디스크로부터 데이터를 받을 때까지 기다려야 하는 시간이 길어집니다. 일반적인 스토리지 시스템에서 지연 시간이 20ms를 초과하면 성능이 좋지 않다고 판단합니다.
리눅스에서 디스크 지연 시간을 확인하려면 ioping 도구를 사용합니다.
# yum install ioping -y
# apt-get install ioping
다음 명령어로 디스크 지연 시간 테스트를 실행합니다(20개의 요청 전송).
# ioping -c 20 /tmp/
4 KiB <<< /tmp/ (ext4 /dev/md126p5): request=1 time=1.55 ms (warmup) ...................... 4 KiB <<< /tmp/ (ext4 /dev/md126p5): request=19 time=176.3 us (fast) 4 KiB <<< /tmp/ (ext4 /dev/md126p5): request=20 time=356.9 us --- /tmp/ (ext4 /dev/md126p5) ioping statistics --- 19 requests completed in 5.67 ms, 76 KiB read, 3.35 k iops, 13.1 MiB/s generated 20 requests in 19.0 s, 80 KiB, 1 iops, 4.21 KiB/s min/avg/max/mdev = 176.3 us / 298.7 us / 368.9 us / 45.7 us
평균값이 298.7us(마이크로초)이므로, 이 경우의 평균 지연 시간은 0.3ms로 매우 우수한 수준입니다.
지연 시간은 us(마이크로초) 또는 ms(밀리초) 단위로 표시됩니다. us 값을 ms로 변환하려면 1,000으로 나누면 됩니다.
이처럼 프로젝트를 시작하기 전에 서버의 스토리지 부하 테스트를 수행하여 최고 성능 값을 미리 확인할 수 있습니다. 물론 테스트 결과가 항상 동일한 성능을 보장하지는 않지만, 프로젝트 초기 단계에서 검증해두는 것은 충분히 가치 있는 작업입니다. Windows 환경에서 IOPS를 테스트하는 방법이 궁금하다면 관련 글을 참고해 보세요.