Storage

[ MinIO study ] 4. Performance & Warp

su''@ 2025. 9. 18. 02:37
CloudNetaStudy - MinIO 실습 스터디 게시글입니다. 

1. HW Checklist : Intel AVX - Docs

HW 선정 시 고려사항
  • 런칭 시 저장해야 할 데이터 총량(TiB 단위).
  • 2년간 예상 데이터 성장량.
  • 평균 오브젝트 크기와 오브젝트 수.
  • 데이터 보관 기간(년 단위).
  • 배포할 사이트 수.
  • 예상 버킷 수.

 

Kubernetes 환경 vs Baremetal 환경
MinIO Tenant 전용 워커 노드 수 4 8+
MinIO Server Pod당 PV 수 4 8+
네트워크 25GbE 100GbE
CPU (AVX-512 지원 Xeon급 이상) Pod당 4 vCPU Pod당 8+ vCPU
메모리(노드당) 32GB 128GB+

 

CPU -wiki
  • 최신 SIMD 명령어(AVX-512) 지원하는 서버급 CPU 권장.
# Intel CPU 에 AVX512 지원 확인
grep -o 'avx[^ ]*' /proc/cpuinfo | sort -u
avx
avx2
avx512bw
avx512cd
avx512dq
avx512f
avx512vl

 

성능 영향 중요도

 

  • 네트워크 인프라: 대역폭이 부족하면 전체 성능 제한.
  • 스토리지 컨트롤러: 펌웨어/성능 문제 시 병목·불안정 초래.
  • 저장 장치(드라이브): 느린/노후화된/불량 드라이브는 성능·안정성 저하.

 

 

네트워킹
  • MinIO는 스토리지 최대 처리량을 위해 고속 네트워크 권장.
  • NIC 대역폭 vs 처리량
    • 10GbE → 1.25GB/s
    • 25GbE → 3.125GB/s
    • 50GbE → 6.25GB/s
    • 100GbE → 12.5GB/s
  • 디스크 예시: HDD 한 개 ≈ 100MB/s →
    • 1GbE = 디스크 1개 수준
    • 10GbE = 디스크 10~12개 수준
    • 25GbE = 디스크 30개 수준

 

메모리
  • 동시 요청 처리량은 RAM과 드라이브 수에 비례
드라이브 수  32GiB  64GiB 128GiB 256GiB 512GiB
4개 1,074 2,149 4,297 8,595 17,190
8개 840 1,680 3,361 6,722 13,443
16개 585 1,170 2,341 4,681 9,362
  • 스토리지 용량 대비 권장 메모리
총 호스트 스토리지 권장 메모리
≤ 1 TiB 8 GiB
≤ 10 TiB 16 GiB
≤ 100 TiB 32 GiB
≤ 1 PiB 64 GiB
> 1 PiB 128 GiB

 

Recommended Hardware Tests : Operating System Diagnostic Tools
# Test the drive’s performance during write operations
dd if=/dev/zero of=/mnt/driveN/testfile bs=128k count=80000 oflag=direct conv=fdatasync > dd-write-drive1.txt

# Test the drive’s performance during read operations
dd if=/mnt/driveN/testfile of=/dev/null bs=128k iflag=direct > dd-read-drive1.txt

# IO Controller test
iozone -s 1g -r 4m -i 0 -i 1 -i 2 -I -t 160 -F /mnt/sdb1/tmpfile.{1..16} /mnt/sdc1/tmpfile.{1..16} /mnt/sdd1/tmpfile.{1..16} /mnt/sde1/tmpfile.{1..16} /mnt/sdf1/tmpfile.{1..16} /mnt/sdg1/tmpfile.{1..16} /mnt/sdh1/tmpfile.{1..16} /mnt/sdi1/tmpfile.{1..16} /mnt/sdj1/tmpfile.{1..16} /mnt/sdk1/tmpfile.{1..16} > iozone.txt

 

 

2. How PCIe Works - Docs , wiki , wiki2

PCIe 
  • PCIe는 병렬 버스(구 PCI)와 달리 스위치 기반의 직렬(point-to-point) 연결 구조.
  • 각 장치는 스위치에 전용 링크로 연결되며, 공통 버스를 공유하지 않음 → 병목 감소.
  • 소프트웨어/운영체제는 기존 PCI 프로토콜과 호환되어 변경 불필요.

 

링크(레인, Lane) 구조
  • 하나의 레인 = 2쌍 와이어 (송신 1쌍 + 수신 1쌍).
  • 풀 듀플렉스 통신 → 동시에 송신/수신 가능.
  • 실제 데이터 대역폭은 “단방향 대역폭 × 2”.
  • 링크 폭은 협상으로 결정: x1, x2, x4, x8, x12, x16, x32.
    • 예: x1 = 1비트, x4 = 4비트, x16 = 16비트 병렬 전송.

 

 

동작 과정
  • 부팅 시 슬롯과 장치 간 연결을 확인하고 링크 폭 협상.
  • 맵을 구성해 어느 장치와 어느 스위치 간에 트래픽을 보낼지 결정.

 

데이터 전송 속도 (세대별 차이)
  • Gen1: 2.5 GT/s → 250 MB/s (x1, 단방향).
  • Gen2: 5 GT/s → 500 MB/s (x1).
  • Gen3: 8 GT/s → 985 MB/s (x1).
  • Gen4: 16 GT/s → 1.97 GB/s (x1).
  • Gen5: 32 GT/s → 3.94 GB/s (x1).
  • Gen6: 64 GT/s → 7.88 GB/s (x1).
  • 실제 장치는 보통 x4, x8, x16을 사용하므로 대역폭은 배로 증가.
    • 예: PCIe Gen4 x16 = 약 32 GB/s 단방향 (64 GB/s 양방향).

 

토폴로지 특징
  • PCI: 모든 장치가 버스를 공유 → 충돌, 병목 발생.
  • PCIe: 스위치 기반 point-to-point 구조 → 장치마다 전용 채널.

 

 

3. PCIe  정보 확인

# 각 PCI 디바이스의 Link Capabilities / Link Status 섹션에 현재 Lane과 속도가 표시
lspci -vv | grep -A40 -i "nvme"
예시)
LnkCap: Port #8, Speed 16GT/s, Width x16 # LnkCap = 최대 지원 속도/레인
LnkSta: Speed 8GT/s, Width x8            # LnkSta = 현재 동작 속도/레인

00:1f.0 Non-Volatile memory controller: Amazon.com, Inc. NVMe EBS Controller (prog-if 02 [NVM Express])
	Subsystem: Amazon.com, Inc. NVMe EBS Controller
	Physical Slot: 31
	Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV+ VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx+
	Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
	Latency: 0
	Interrupt: pin A routed to IRQ 11
	Region 0: Memory at c0400000 (32-bit, non-prefetchable) [size=16K]
	Capabilities: [70] Express (v2) Endpoint, MSI 00
		DevCap:	MaxPayload 256 bytes, PhantFunc 0, Latency L0s unlimited, L1 unlimited
			ExtTag- AttnBtn- AttnInd- PwrInd- RBE+ FLReset- SlotPowerLimit 0W
		DevCtl:	CorrErr- NonFatalErr- FatalErr- UnsupReq-
			RlxdOrd- ExtTag- PhantFunc- AuxPwr- NoSnoop-
			MaxPayload 128 bytes, MaxReadReq 128 bytes
		DevSta:	CorrErr- NonFatalErr- FatalErr- UnsupReq- AuxPwr- TransPend-
		LnkCap:	Port #0, Speed unknown, Width x0, ASPM not supported
			ClockPM- Surprise- LLActRep- BwNot- ASPMOptComp-
		LnkCtl:	ASPM Disabled; RCB 64 bytes, Disabled- CommClk-
			ExtSynch- ClockPM- AutWidDis- BWInt- AutBWInt-
		LnkSta:	Speed unknown, Width x0
			TrErr- Train- SlotClk- DLActive- BWMgmt- ABWMgmt-
		DevCap2: Completion Timeout: Not Supported, TimeoutDis- NROPrPrP- LTR-
			 10BitTagComp- 10BitTagReq- OBFF Not Supported, ExtFmt- EETLPPrefix-
			 EmergencyPowerReduction Not Supported, EmergencyPowerReductionInit-
			 FRS- TPHComp- ExtTPHComp-
			 AtomicOpsCap: 32bit- 64bit- 128bitCAS-
		DevCtl2: Completion Timeout: 50us to 50ms, TimeoutDis- LTR- 10BitTagReq- OBFF Disabled,
			 AtomicOpsCtl: ReqEn-
		LnkSta2: Current De-emphasis Level: -6dB, EqualizationComplete- EqualizationPhase1-
			 EqualizationPhase2- EqualizationPhase3- LinkEqualizationRequest-
			 Retimer- 2Retimers- CrosslinkRes: unsupported
	Capabilities: [b0] MSI-X: Enable+ Count=3 Masked-
		Vector table: BAR=0 offset=00002000
		PBA: BAR=0 offset=000
		
# /sys/bus/pci에서 직접 확인 : sysfs 경로에 current_link_width와 current_link_speed 파일이 있음
cat /sys/bus/pci/devices/0000\:00\:1f.0/current_link_width
0

cat /sys/bus/pci/devices/0000\:00\:1f.0/current_link_speed
Unknown

#
apt install hwinfo -y
hwinfo --pci
예시)
x8
8.0 GT/s PCIe Gen3

15: PCI 1d.0: 0108 Non-Volatile memory controller (NVM Express)
  [Created at pci.386]
  Unique ID: 1GTX.vA1igerW3PA
  SysFS ID: /devices/pci0000:00/0000:00:1d.0
  SysFS BusID: 0000:00:1d.0
  Hardware Class: storage
  Model: "Amazon.com NVMe EBS Controller"
  Vendor: pci 0x1d0f "Amazon.com, Inc."
  Device: pci 0x8061 "NVMe EBS Controller"
  SubVendor: pci 0x1d0f "Amazon.com, Inc."
  SubDevice: pci 0x8061
  Driver: "nvme"
  Driver Modules: "nvme"
  Memory Range: 0xc0408000-0xc040bfff (rw,non-prefetchable)
  IRQ: 10 (no events)
  Module Alias: "pci:v00001D0Fd00008061sv00001D0Fsd00008061bc01sc08i02"
  Config Status: cfg=new, avail=yes, need=no, active=unknown

 

4. WARP- Github , Blog1 , Blog2 : S3 benchmarking tool

# Linux x86_64
wget https://github.com/minio/warp/releases/download/v1.3.0/warp_Linux_x86_64.tar.gz
tar zxvf warp_Linux_x86_64.tar.gz
chmod +x warp
mv warp /usr/local/bin
warp --version

#
kubectl get secret -n tenant1 tenant1-tls -o jsonpath='{.data.public\.crt}' | base64 -d > tenant1.crt
kubectl get secret -n tenant1 tenant1-tls -o jsonpath='{.data.public\.crt}' | base64 -d | openssl x509 -noout -text
...
            X509v3 Subject Alternative Name:
                DNS:tenant1-pool-0-0.tenant1-hl.tenant1.svc.cluster.local, DNS:minio.tenant1.svc.cluster.local, DNS:minio.tenant1, DNS:minio.tenant1.svc, DNS:*., DNS:*.tenant1.svc.cluster.local
#
cp tenant1.crt /usr/local/share/ca-certificates/tenant1.crt
update-ca-certificates

# 
echo "127.0.0.1 minio.tenant1.svc" >> /etc/hosts

# 
mc alias set k8s-tenant1 https://minio.tenant1.svc:30002 minio minio123
mc ls --summarize --recursive k8s-tenant1
 
#
export WARP_ENDPOINT="minio.tenant1.svc:30002"
export WARP_ACCESS_KEY="minio"
export WARP_SECRET_KEY="minio123"

# 신규 터미널1 : 모니터링 disk
iostat nvme1n1 nvme2n1 nvme3n1 nvme4n1 1
iostat nvme1n1 nvme2n1 nvme3n1 nvme4n1 1 -d
iostat nvme1n1 nvme2n1 nvme3n1 nvme4n1 1 -x
iostat nvme1n1 nvme2n1 nvme3n1 nvme4n1 1 -x -d

r/s	초당 읽기 I/O 요청 수 (Read IOPS)	초당 몇 번의 읽기 요청이 발생했는지
rkB/s	읽기 KB/초	초당 읽은 데이터 양
rrqm/s	읽기 merge 요청 수	디바이스에서 merge 된 read 요청 수
%rrqm	읽기 merge 비율	merge된 read 요청의 비율
r_await	읽기 평균 대기 시간(ms)	읽기 요청이 큐에서 대기한 시간 평균
rareq-sz	평균 읽기 요청 크기(kB)	I/O 요청당 데이터 크기 평균

w/s	초당 쓰기 I/O 요청 수 (Write IOPS)	초당 쓰기 요청 건수
wkB/s	쓰기 KB/초	초당 기록한 데이터 양
wrqm/s	쓰기 merge 요청 수	디바이스에서 merge 된 write 요청 수
%wrqm	쓰기 merge 비율	merge된 write 요청 비율
w_await	쓰기 평균 대기 시간(ms)	write 요청이 큐에서 대기한 평균 시간
wareq-sz	평균 쓰기 요청 크기(kB)	I/O 요청당 write 크기 평균
...
f/s	초당 플러시 요청 수	fsync 같은 flush 호출 수
f_await	플러시 평균 대기 시간(ms)	flush 요청이 큐에서 대기한 시간
aqu-sz	평균 I/O 큐 깊이	디바이스 큐에 평균 몇 건의 요청이 쌓였는지
%util	디바이스 사용률	디바이스가 바쁜 비율(100%면 완전히 포화)

# 신규 터미널2 : 모니터링 cpu
htop

# 신규 터미널3 : 모니터링 network -> 실행 후 General interface statistics 선택
apt install iptraf-ng -y
iptraf-ng

# 신규 터미널4 : 부하 실행
# 기본 부하 테스트 실행 : mybucket 버킷에 임시 객체들을 업로드하며 성능 측정 :32개의 동시 클라이언트로 1GB 객체 100개 업로드.
# 객체 업로드 실시간 확인 해보자. 해당 버킷에 기본의 객체는 실행 종료 시 삭제됨.
warp put --host $WARP_ENDPOINT \
  --access-key $WARP_ACCESS_KEY \
  --secret-key $WARP_SECRET_KEY \
  --tls \
  --obj.size 1MiB \
  --duration 2m \
  --concurrent 32 \
  --bucket mybucket

Reqs: 21625, Errs:0, Objs:21625, Bytes: 21.12GiB
 -       PUT Average: 180 Obj/s, 180.2MiB/s; Current 187 Obj/s, 187.3MiB/s, 142.8 ms/req
Reqs: 보낸 총 요청 수 (21625건)
Errs: 에러 발생 건수 (0 → 오류 없음)
Objs: 업로드된 객체 수(=요청 수와 같음)
Bytes: 총 업로드된 데이터 용량(21.12GiB)
PUT Average: 평균 업로드 속도
  180 Obj/s → 초당 평균 180개의 객체 업로드
  180.2MiB/s → 초당 평균 180MiB 데이터 전송
Current: 지금 이 시점의 속도(실시간)
  187 Obj/s / 187.3MiB/s
142.8 ms/req: 현재 요청당 평균 지연시간(ms)


Report: PUT. Concurrency: 32. Ran: 1m57s
 * Average: 180.23 MiB/s, 180.23 obj/s
 * Reqs: Avg: 182.5ms, 50%: 154.9ms, 90%: 311.0ms, 99%: 423.4ms, Fastest: 37.0ms, Slowest: 598.0ms, StdDev: 85.6ms
PUT: PUT(업로드) 테스트
Concurrency: 32: 동시에 32개의 병렬 스레드(커넥션)로 업로드
Ran: 1m57s: 전체 테스트 1분57초 동안 실행
Average: 전체 테스트 동안 평균 전송속도
  180.23 MiB/s / 180.23 obj/s
Reqs (latency): 요청 지연 시간 통계
  Avg: 182.5ms → 요청 평균 처리시간
	50%: 154.9ms → 중간값(절반의 요청이 155ms 이내)
	90%: 311.0ms → 90%가 311ms 이내
	99%: 423.4ms → 99%가 423ms 이내
	Fastest: 37.0ms / Slowest: 598.0ms
	StdDev: 85.6ms → 응답 시간 분산 정도

Throughput, split into 117 x 1s:
 * Fastest: 296.6MiB/s, 296.65 obj/s
 * 50% Median: 176.8MiB/s, 176.78 obj/s
 * Slowest: 100.2MiB/s, 100.17 obj/s
테스트 전체를 1초 단위로 쪼개서, 각 초마다의 처리량을 계산
Fastest: 가장 높은 처리량을 보인 구간(296MiB/s)
50% Median: 중앙값 구간(176MiB/s)
Slowest: 가장 낮았던 구간(100MiB/s)



# GET 테스트 + 병렬 : 동시에 32개의 워커(thread)로 GET 요청 , 병렬 처리로 최대 throughput 측정 가능
# --autoterm 시간절약을 위해 변화가 어느정도 안정되면 자동으로 종료.
warp get --host $WARP_ENDPOINT \
  --access-key $WARP_ACCESS_KEY \
  --secret-key $WARP_SECRET_KEY \
  --tls \
  --obj.size 1MiB \
  --duration 2m \
  --concurrent 32 \
  --bucket mybucket # --autoterm

# 평균 다운로드 속도: 약 498 MiB/s, 초당 객체 수 약 498개
Reqs: 8402, Errs:0, Objs:8402, Bytes: 8402.0MiB
 -       GET Average: 499 Obj/s, 499.2MiB/s; Current 515 Obj/s, 515.2MiB/s, 65.8 ms/req, TTFB: 41.5ms
Reqs: 8402	총 GET 요청 수
Errs: 0	오류 발생 건수 (0 → 모든 요청 성공)
Objs: 8402	다운로드된 객체 수
Bytes: 8402.0MiB	총 다운로드 데이터 용량
GET Average	평균 전송 속도
 499 Obj/s	초당 객체 수
 499.2 MiB/s	초당 데이터 전송량
Current	최근 측정 시점의 실시간 속도
 515 Obj/s, 515.2MiB/s	현재 초당 객체/데이터 속도
 65.8 ms/req	요청당 평균 지연 시간
TTFB: 41.5ms	Time To First Byte, 서버에서 첫 바이트를 받기까지 평균 시간

Throughput 540202802.0MiB/s within 7.500000% for 7s. Assuming stability. Terminating benchmark.

Report: GET. Concurrency: 32. Ran: 15s
 * Average: 498.48 MiB/s, 498.48 obj/s
 * Reqs: Avg: 64.8ms, 50%: 61.2ms, 90%: 101.5ms, 99%: 146.8ms, Fastest: 4.5ms, Slowest: 262.5ms, StdDev: 28.2ms
 * TTFB: Avg: 40ms, Best: 1ms, 25th: 27ms, Median: 38ms, 75th: 50ms, 90th: 64ms, 99th: 105ms, Worst: 223ms StdDev: 20ms
Latency 통계 (요청 지연 시간)
 Avg: 64.8ms → 전체 요청 평균 지연
 50%: 61.2ms → 절반의 요청은 61.2ms 이내 처리
 90%: 101.5ms, 99%: 146.8ms → 상위 퍼센타일 지연 시간
 Fastest: 4.5ms, Slowest: 262.5ms → 가장 빠르고 느린 요청
 StdDev: 28.2ms → 지연 시간 분산

TTFB(Time To First Byte)
 평균 40ms → 서버가 첫 바이트를 응답하기까지 걸린 시간
 Best: 1ms, Worst: 223ms
 퍼센타일 통계도 제공 (25th/50th/75th/90th/99th)
 TTFB가 낮으면 서버 응답이 빠르고, 네트워크가 병목이 아님을 의미

Throughput, split into 15 x 1s:
 * Fastest: 568.4MiB/s, 568.37 obj/s
 * 50% Median: 497.1MiB/s, 497.08 obj/s
 * Slowest: 428.3MiB/s, 428.27 obj/s
테스트 전체를 1초 단위로 나누어 초당 처리량 계산
 Fastest / Median / Slowest로 속도 변동 확인 가능
 예시: 한 구간에서는 568MiB/s, 다른 구간은 428MiB/s → 변동폭 존재

'Storage' 카테고리의 다른 글

[ MinIO study ] 6. LDAP  (0) 2025.09.27
[ MinIO study ] 5. PBAK  (0) 2025.09.27
[ MinIO study ] 3. DirectPV  (0) 2025.09.17
[ MinIO study ] 3. 실습환경 구성 & Tuning  (0) 2025.09.17
[ MinIO study ] 2-1. MinIO 배포 테스트 - MNMD  (0) 2025.09.13