서비스가 고도화되면서 데이터가 폭발적으로 증가함에 따라 빠르고 안정적인 스토리지의 중요성도 커지고 있습니다. 하지만 다양한 스토리지 옵션 중에서 어떤 스토리지가 가장 적합한지, 성능이 제대로 나오는지 판단하는 것은 쉽지 않습니다. 특히 Kubernetes 환경에서는 AWS EBS, Ceph, NFS, Local PV 등 여러 스토리지 옵션이 제공되지만 이들이 올바르게 설정되었는지 또는 원하는 성능을 제공하는지 확인하는 것이 중요합니다. 이번 글에서는 스토리지 개념과 주요 성능 지표, 그리고 Kubestr를 이용한 성능 테스트 방법을 다뤄보겠습니다.
Storage
Storage란?
Storage는 데이터를 저장하는 모든 장치나 매체를 의미합니다. 특히 데이터를 영구적으로 보관할 수 있고, 전원이 꺼져도 데이터가 유지(비휘발성)됩니다.
스토리지의 종류
내부 스토리지
내부 스토리지는 컴퓨터나 스마트폰 내부에 설치되는 저장장치를 의미하며 보통 운영체제(OS), 프로그램, 데이터를 저장하는 용도로 사용됩니다.
HDD (Hard Disk Drive)
HDD는 속도는 느리지만 대용량 데이터를 저장 가능하며 가격이 저렴하여 백업 및 대용량 데이터 보관용으로 많이 사용됩니다.
SSD (Solid State Drive)
반도체 메모리를 사용하는 고속 저장장치로 HDD보다 내구성이 뛰어나고 소음이 적고, 가격이 HDD보다 비싸지만 속도가 훨씬 빠르며 특히, 랜덤 읽기/쓰기 성능(IOPS)이 매우 높습니다. 보통 PC와 같은 고속 데이터가 처리가 필요한 환경이나 DB, VM, Cloud 서버에 많이 사용됩니다.
NVMe (Non-Volatile Memory Express)
NVMe는 PCIe(PCI Express) 인터페이스를 사용하는 초고속 SSD으로 IOPS 성능이 뛰어나 데이터베이스, AI/ML 등 고성능 작업에 적합합니다.
외부 스토리지
외부 스토리지는 컴퓨터 또는 장치 외부에서 연결하여 데이터를 저장하거나 백업할 수 있는 저장장치로 보통 USB, 외장 하드디스크, SD 카드 등이 여기에 속합니다.
USB 드라이브
작고 휴대성이 뛰어나며 HDD보다 속도가 빠르고 내구성이 높습니다. 특히 USB 2.0, 3.0, 3.1, 4.0 버전에 따라 속도 차이 발생하니 필요에 맞게 선택해서 사용해야 합니다.
외장 하드디스크 (External HDD)
외장 HDD는 기존 하드디스크(HDD)를 USB 인터페이스를 통해 연결하는 저장장치입니다. 특히 1TB~20TB 이상의 대용량 데이터 저장 할 수 있으며 일반 HDD와 성능이 비슷하지만 휴대성이 높습니다. 주로 대용량 데이터의 백업을 위해 NAS나 서버 저장소에 사용됩니다.
SD 카드 (Secure Digital Card)
SD 카드는 디지털 카메라, 스마트폰, 태블릿 등에 사용되는 작은 메모리 카드입니다. 이처럼 크기가 작고 가벼우며 일반적으로 스마트폰, 카메라, 드론, 라즈베리파이 등에서 사용됩니다.
CD/DVD/Blu-ray 디스크
데이터 보존 기간이 길지만, 쓰기/읽기 속도가 느리며 한 번 기록하면 수정이 불가능한 경우가 많습니다. 보통 영화나 음악과 같은 장기 보존용으로 사용됩니다.
Storage 성능을 결정하는 주요 지표
Storage의 성능을 평가할 때 일반적으로 IOPS, Throughput, Latency 세 가지 지표를 사용합니다.
IOPS(Input/Output Operations Per Second) -> 제일 중요
IOPS는 초당 처리할 수 있는 입출력(I/O) 작업 수를 의미합니다. 즉, IOPS가 높을수록 더 많은 입출력 작업을 동시에 처리할 수 있습니다.
스토리지 유형 | IOPS |
HDD | 100~200 |
SATA SSD | 10K~100K |
NVMe SSD | 100K~1M |
PCIe 5.0 NVMe SSD | 1M + |
Throughput(처리량)
Throughput는 초당 처리할 수 있는 데이터 양을 의미합니다. 보통 대용량 파일 전송이나 빅데이터 분석, 비디오 스트리밍과 같은 경우에 중요한 지표가 됩니다.
스토리지 유형 | 최대 Throughput |
HDD | 100~200MB/s |
SATA SSD | 500~600MB/s |
NVMe SSD (PCIe 3.0) | 3,500MB/s |
NVMe SSD (PCIe 4.0) | 7,000MB/s |
NVMe SSD (PCIe 5.0) | 10,000MB/s 이상 |
위의 지표를 예시를 들어 간략하게 설명하자면,
1. HDD : 100MB/s 속도 기준 10GB 크기의 파일을 전송하려면 약 1분 이상 소요됩니다..
2. SATA SSD : 500MB/s 속도 기준 10GB 크기의 파일을 전송하려면 약 20초 정도 소요됩니다.
3. NVMe SSD(PCle 5.0) : 5GB/s 속도 기준 10GB 크기의 파일을 전송하려면 2초 내외로 전송이 가능합니다.
Latency(지연 시간)
Latency는 데이터 요청에서 실제 응답이 돌아오기까지 걸리는 시간(ms 또는 μs 단위)을 의미합니다. 보통 실시간으로 데이터를 처리해야 하는 경우나 데이터베이스 및 트랜잭션 시스템, 클라우드 및 가상화 환경에서 중요한 지표로 활용됩니다.
스토리지 유형 | 평균 지연 시간 |
HDD | 5~10ms |
SATA SSD | 0.1~0.5ms |
NVMe SSD | 0.01~0.1ms |
간단한 예시를 들어 설명하겠습니다.
1. 온라인 게임 서버에서 HDD를 사용하면 지연 시간(5~10ms) 때문에 서버 응답이 지연이 되어 제대로 진행되지 않을 수 있습니다.
2. 금융 거래 시스템에서 SATA SSD 대신 NVMe SSD를 사용하면 주문 처리 속도가 향상됩니다.
3. 데이터베이스에서 NVMe SSD를 사용하면 쿼리 실행 속도가 훨씬 빨라집니다.
Kubestr을 이용한 성능 측정
kubestr이란?
Kubernetes 환경에서는 AWS EBS, Ceph, NFS, Local PV 등 다양한 스토리지 옵션을 사용할 수 있는데, 이 스토리지가 제대로 작동하는지 또는 어떤 스토리지가 가장 적합한지 판단하기 어렵습니다. 이때, Kubestr를 활용해서 Kubernetes 클러스터에서 Storage 성능을 테스트하고, 올바르게 설정되었는지 확인할 수 있습니다.
kubestr 주요 기능
클러스터 내에서 사용 가능한 CSI를 자동으로 찾아주며, PV 및 PVC 이 올바르게 설정되었는지 확인할 수 있습니다. 이때, FIO 도구를 활용하여 스토리지 속도를 측정하고 분석할 수 있습니다.
성능 테스트 순서
먼저 성능 테스트를 진행할 job을 명세하는 fio 파일을 작성합니다. 그 후 kubestr 명령어를 통해 해당 fio 파일을 토대로 storage 성능 테스트를 진행하며, 일정 시간 후 성능 테스트 결과를 확인할 수 있습니다.
실습
local-path-provisioner storage class 배포
kubectl apply -f https://raw.githubusercontent.com/rancher/local-path-provisioner/v0.0.31/deploy/local-path-storage.yaml
실습을 호스트 Path에 사용하는 PV/PVC를 생성해서 진행할 것이기 때문에 local-path provisinor storage class를 설치해 줍니다.
kubestr 설치
wget https://github.com/kastenhq/kubestr/releases/download/v0.4.48/kubestr_0.4.48_Linux_amd64.tar.gz
tar xvfz kubestr_0.4.48_Linux_amd64.tar.gz && mv kubestr /usr/local/bin/ && chmod +x /usr/local/bin/kubestr
위 명령어를 통해 kubestr을 다운로드하여 설치를 진행합니다.
kubestr 실행
kubestr
간단하게 kubestr 명령어만 실행하여 정상적으로 설치되었는지 확인해 보겠습니다.
kubestr만 실행하게 되면 현재 k8s의 버전과 RBAC 여부, 현재 사용가능한 storage provisioner의 목록등을 보여줍니다.
랜덤 읽기 성능 테스트
랜덤 읽기(Random Read) 테스트는 스토리지의 랜덤 접근 성능을 측정하는 테스트입니다. 즉, 데이터가 디스크의 여러 위치에서 무작위로 읽힐 때의 성능을 평가하는 것을 의미합니다.
fio-read.fio 파일 생성
[global]
ioengine=libaio
direct=1
bs=4k
runtime=120
time_based=1
iodepth=16
numjobs=4
group_reporting
size=1g
rw=randread
[read]
스토리지의 입출력(IO) 성능을 테스트하는 설정 파일을 생성합니다.
그 후 위와 같이 설정 값을 넣어주면 되는데 libaio 엔진과 다이렉트 I/O를 사용하여 성능을 측정하게 끔 설정하며 특히, direct를 1로 설정하여 OS 캐시를 사용하지 않고 직접 디스크 I/O 수행할 수 있게 생성합니다.
kubestr로 랜덤 읽기 성능 테스트 실행
kubestr fio -f fio-read.fio -s local-path --size 10G
위의 명령어로 위에서 생성한 fio-read.fio 설정파일을 통해 랜덤 읽기 성능 테스트를 실행합니다.
성능 테스트 결과
요약하자면 아래와 같습니다.
항목 | 값 |
IOPS | 3023.7 IOPS |
Bandwidth | 12094 KiB/s (약 12MB/s) |
IOPS 최소값 (min) | 2300 |
IOPS 최대값 (max) | 8976 |
IOPS 평균값 (avg) | 3026.15 |
Bandwidth 최소값 (min) | 9200 KiB/s (약 9MB/s) |
Bandwidth 최대값 (max) | 35905 KiB/s (약 35MB/s) |
Bandwidth 평균값 (avg) | 12105 KiB/s (약 12MB/s) |
현재 local-path 스토리지는 평균 3023 IOPS, 12MB/s의 성능을 보여준다는 것을 테스트해 볼 수 있습니다.
랜덤 쓰기 성능 테스트 수행
랜덤 쓰기(Random Write) 테스트는 스토리지가 무작위 위치에 데이터를 쓸 때의 성능을 측정하는 테스트입니다. 즉, 여러 위치에서 데이터가 분산 저장될 때의 성능을 평가하는 것을 목표로 실행하는 성능 테스트입니다.
fio-write.fio 생성
[global]
ioengine=libaio
numjobs=16
iodepth=16
direct=1
bs=4k
runtime=120
time_based=1
size=1g
group_reporting
rw=randrw
rwmixread=0
rwmixwrite=100
[write]
주요 설정 값은 1GB 데이터를 사용하여 테스트할 수 있게 설정하고, numjobs를 16으로 설정하여 CPU와 Storage 활용을 극대화하며 iodepth를 16으로 설정하여 최대 16개의 요청을 동시에 처리함으로써 I/O 대역폭 증가하게끔 설정했습니다.
kubestr로 랜덤 쓰기 성능 테스트 실행
kubestr fio -f fio-write.fio -s local-path --size 20G
위에 fio-write.fio에서 최소 16G 정도 필요하니 사이즈를 넉넉하게 20G의 PVC를 생성하여 랜덤 쓰기 성능 테스트를 실행합니다.
성능 테스트 결과
위 결과를 요약하면 아래와 같습니다.
항목 | 값 |
IOPS | 3024.6 IOPS |
Bandwidth (BW) | 12098 KiB/s (약 12MB/s) |
IOPS 최소값 (min) | 1587 |
IOPS 최대값 (max) | 8653 |
IOPS 평균값 (avg) | 3024.8 |
Bandwidth 최소값 (min) | 6357 KiB/s (약 6.2MB/s) |
Bandwidth 최대값 (max) | 34613 KiB/s (약 33.8MB/s) |
Bandwidth 평균값 (avg) | 12101.97 KiB/s (약 12MB/s) |
즉, 현재 local-path 스토리지 클래스에서 평균 3024 IOPS, 12MB/s의 랜덤 쓰기 성능을 제공한다는 것을 알 수 있습니다.
정리
스토리지의 성능이 애플리케이션의 응답 속도와 사용자 경험을 좌우하며, 데이터베이스, 가상화, 클라우드 환경에서는 높은 IOPS와 낮은 지연 시간이 필수적입니다. 이때 잘못된 스토리지 설정은 애플리케이션 성능 저하 및 비용 낭비로 이어질 수 있습니다. 이에 따라 Kubestr를 통해 kubernetes 클러스터에서 스토리지의 성능을 FIO 기반의 성능 테스트를 통해 쉽게 측정할 수 있습니다!
참고
Kubestr
Explore your Kubernetes storage options
kubestr.io
'스터디 이야기 > 25' AWS EKS' 카테고리의 다른 글
Kubernetes DNS: FQDN과 ndots의 동작 방식 정리 (0) | 2025.02.14 |
---|---|
AWS ECR과 EKS 연동을 통한 컨테이너 이미지 배포하기 (0) | 2025.02.09 |
AWS EKS Cluster Endpoint (Public, Private, Public+Private) (0) | 2025.02.04 |