w/24MB
질문에서 언급된 MinIO 환경에서 EC (Erasure Coding) 설정이 8:3으로, 이는 총 8개의 데이터 조각(data shards)과 3개의 패리티 조각(parity shards)을 의미한다고 하셨지만, 실제로는 데이터 조각이 5개이고 패리티 조각이 3개라는 점을 명확히 하셨습니다. 즉, EC 5:3 (데이터 5개, 패리티 3개, 총 8개 샤드)로 이해하고, 이 설정이 데이터 채우는 속도에 미치는 영향을 분석하겠습니다. 또한, 원래 질문에서 언급된 네트워크, 스토리지 구성, 병목 예측, 그리고 Hadoop 블록 크기와 S3 객체 크기에 대한 질문도 함께 다루겠습니다.
EC 5:3은 데이터 샤드와 패리티 샤드의 비율로 인해 쓰기 성능에 영향을 미칩니다. 쓰기 작업 시 다음과 같은 요소가 작용합니다:
쓰기 오버헤드:
네트워크 영향:
속도 변화:
MinIO 클러스터에 데이터를 빠르게 채우기 위해 다음과 같은 방법을 추천합니다:
병렬 업로드:
mc) 또는 SDK를 사용해 다중 스레드로 병렬 업로드.mc cp --recursive 명령어로 여러 파일을 동시에 업로드하거나, Python SDK(minio-py)로 멀티파트 업로드 활용.큰 파일로 테스트:
데이터 생성 도구:
dd if=/dev/urandom of=testfile bs=24M count=100로 24MB 파일 100개 생성.from minio import Minio
import os
client = Minio("minio-endpoint:9000", access_key="key", secret_key="secret", secure=False)
bucket = "test-bucket"
for i in range(1000000): # 예: 100만 개 파일
client.fput_object(bucket, f"file_{i}", generate_random_file(24*1024*1024)) # 24MB 파일분산 업로드:
EC 설정 최적화:
작은 객체 (4KB~64KB):
--no-lock 옵션으로 동기화 오버헤드 줄이고, 클라이언트 스레드 수 최적화.큰 객체 (24MB):
Hadoop 블록 크기 (128MB):
S3 객체 크기:
마이그레이션 시 고려사항:
결론:
--no-lock, 멀티파트 업로드 활성화.mc mirror로 데이터 전송.w/4KB
질문에서 10억 개 파일을 4KB 크기의 작은 객체로 채우겠다고 하셨으므로, 이를 반영해 데이터를 빠르게 채우는 방법, 예상 소요 시간, 그리고 EC 5:3 설정이 쓰기 속도에 미치는 영향을 중심으로 답변을 수정·보완하겠습니다. 또한, 이전 질문에서 언급된 네트워크 병목과 Hadoop 블록 크기(128MB) 대비 S3 객체 크기(4KB vs. 24MB)에 대한 고려도 포함하겠습니다.
작은 객체(4KB)는 메타데이터 오버헤드와 네트워크 요청 수가 많아 쓰기 속도가 제한됩니다. 효율적인 채우기 전략은 다음과 같습니다:
병렬 업로드 최적화:
mc) 또는 Python SDK로 다중 스레드 업로드.mc cp --recursive로 4KB 더미 파일 대량 업로드.더미 데이터 생성:
dd if=/dev/urandom of=testfile_4kb bs=4K count=1
for i in {1..1000000}; do cp testfile_4kb testfile_$i; done
mc cp testfile_* s3://test-bucket/warp put --obj.size=4096 --objects=1000000000 --concurrent=100 s3://test-bucket분산 클라이언트 사용:
메타데이터 최적화:
--no-lock 옵션 사용.EC 설정 임시 조정:
메타데이터 오버헤드:
병렬 처리 시:
--no-lock 옵션으로 동기화 부하 감소.--no-lock, 멀티파트 업로드 비활성화(4KB는 멀티파트 불필요).mc mirror 사용.w/Jenkinsfile
Kubernetes 환경에서 Jenkins를 사용해 warp Job을 실행하고, Bitbucket 소스를 가져와 자동으로 Job을 배포한 뒤, 완료를 기다리고, 성능 로그를 수집하며, 마지막으로 Job을 정리하는 Jenkinsfile을 작성하겠습니다. 질문에서 언급된 podTemplate과 containerTemplate를 활용해 Jenkins 파이프라인 내에서 Kubernetes Pod를 동적으로 생성하고, minio/warp 도구를 실행하는 방식으로 구성하겠습니다. 또한, MinIO의 warp Job이 4KB 객체 10억 개를 생성하는 테스트를 수행한다고 가정하고, 이를 반영하겠습니다.
warp Job이 실행될 환경.warp-job.yaml 또는 테스트 설정 파일) 저장소.podTemplate과 containerTemplate로 Pod 관리.warp put 명령어로 4KB 객체 10억 개 업로드 테스트.warp Job을 Kubernetes에 배포.아래는 podTemplate과 containerTemplate를 사용해 warp Job을 실행하고, 로그를 수집하며, Job을 정리하는 Jenkinsfile 예제입니다. minio/warp 컨테이너 이미지를 사용하며, Bitbucket 소스에서 설정 파일(예: warp-job.yaml)을 가져온다고 가정했습니다. warp 명령어는 4KB 객체 10억 개를 업로드하는 테스트로 설정했습니다.
pipeline {
agent {
// podTemplate을 사용해 동적으로 Kubernetes Pod 생성
podTemplate(
label: 'warp-test-pod',
containers: [
// Warp 컨테이너 정의
containerTemplate(
name: 'warp',
image: 'minio/warp:latest', // Warp 공식 이미지
command: 'sleep',
args: 'infinity', // 컨테이너가 바로 종료되지 않도록 유지
envVars: [
envVar(key: 'MINIO_ACCESS_KEY', value: 'your-access-key'),
envVar(key: 'MINIO_SECRET_KEY', value: 'your-secret-key')
]
),
// Kubectl CLI를 위한 컨테이너
containerTemplate(
name: 'kubectl',
image: 'bitnami/kubectl:latest',
command: 'sleep',
args: 'infinity'
)
],
// 필요한 권한 부여 (선택 사항, 클러스터 정책에 따라 조정)
serviceAccount: 'jenkins',
namespace: 'default'
) {
node('warp-test-pod') {
stage('Checkout') {
container('warp') {
// Bitbucket에서 소스 체크아웃
checkout scm
}
}
stage('Deploy Warp Job') {
container('kubectl') {
sh '''
# Warp Job YAML 파일 적용 (Bitbucket 소스에 있다고 가정)
kubectl apply -f warp-job.yaml
'''
}
}
stage('Wait for Job Completion') {
container('kubectl') {
sh '''
# Job 완료 대기, 타임아웃 7일 (4KB 객체 10억 개 기준)
kubectl wait --for=condition=complete job/warp-job --timeout=604800s
'''
}
}
stage('Get Performance Logs') {
container('kubectl') {
sh '''
# Job의 Pod 이름 가져오기
POD_NAME=$(kubectl get pods -l job-name=warp-job -o jsonpath="{.items[0].metadata.name}")
# 로그 가져오기
kubectl logs $POD_NAME > performance.log
# 로그를 Jenkins 아티팩트로 저장
'''
archiveArtifacts artifacts: 'performance.log', allowEmptyArchive: true
}
}
stage('Cleanup') {
container('kubectl') {
sh '''
# Job 및 관련 리소스 삭제
kubectl delete job/warp-job || true
'''
}
}
}
}
}
post {
always {
// 빌드 결과 알림 (예: Slack, 이메일) 추가 가능
echo 'Pipeline completed.'
}
success {
echo 'Warp Job completed successfully and logs archived.'
}
failure {
echo 'Pipeline failed. Check logs for details.'
}
}
}
warp-job.yaml 예제Bitbucket 소스에 포함될 warp-job.yaml 파일은 minio/warp를 실행해 4KB 객체 10억 개를 MinIO 버킷에 업로드하는 Kubernetes Job을 정의합니다. 아래는 예제 YAML입니다:
apiVersion: batch/v1
kind: Job
metadata:
name: warp-job
namespace: default
spec:
template:
spec:
containers:
- name: warp
image: minio/warp:latest
command: ["/bin/sh", "-c"]
args:
- |
warp put \
--host minio.default.svc.cluster.local:9000 \
--access-key your-access-key \
--secret-key your-secret-key \
--bucket test-bucket \
--obj.size=4096 \
--objects=1000000000 \
--concurrent=100 \
--duration=7d \
--no-color \
--analyze.v \
> performance.log
env:
- name: MINIO_ACCESS_KEY
value: "your-access-key"
- name: MINIO_SECRET_KEY
value: "your-secret-key"
restartPolicy: Never
backoffLimit: 1
--obj.size=4096: 4KB 객체 크기.--objects=1000000000: 10억 개 객체.--concurrent=100: 동시 업로드 스레드 100개 (클러스터 성능에 따라 조정).--duration=7d: 최대 7일 실행 (5~7일 소요 예상).--analyze.v: 상세 성능 로그 출력.performance.log에 결과 저장, Jenkins에서 수집.Checkout:
warp-job.yaml 포함).warp 컨테이너 내에서 실행.Deploy Warp Job:
kubectl 컨테이너에서 warp-job.yaml을 Kubernetes에 적용.minio.default.svc.cluster.local:9000)에 접근.Wait for Job Completion:
kubectl wait으로 Job 완료 대기.Get Performance Logs:
performance.log를 Jenkins 아티팩트로 저장.Cleanup:
|| true로 오류 무시).podTemplate과 containerTemplateminio/warp 이미지로 테스트 실행.bitnami/kubectl로 Kubernetes 리소스 관리.jenkins SA).이전 답변에서 계산한 바를 참고하면:
kubectl wait 타임아웃을 7일로 설정해 충분히 커버.warp Job을 여러 Pod로 분산 실행 (예: 10개 Job, 각 1억 개 객체).kubernetes 플러그인 설치 확인.kubectl 실행 권한 부여:apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: jenkins-role
rules:
- apiGroups: ["batch", ""]
resources: ["jobs", "pods", "pods/log"]
verbs: ["create", "get", "list", "delete", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: jenkins-rolebinding
namespace: default
subjects:
- kind: ServiceAccount
name: jenkins
namespace: default
roleRef:
kind: Role
name: jenkins-role
apiGroup: rbac.authorization.k8s.ioperformance.log를 Prometheus/Grafana로 시각화 추천.warp-job-1.yaml, warp-job-2.yaml 등으로 분리.stage('Deploy Multiple Warp Jobs') {
container('kubectl') {
sh '''
for i in {1..10}; do
sed "s/warp-job/warp-job-$i/g" warp-job.yaml | kubectl apply -f -
done
'''
}
}warp-job.yaml에 특정 warp 옵션(예: --concurrent, --bucket) 추가 필요 시 알려주세요./etc/hosts add
Kubernetes 환경에서 Jenkins 파이프라인을 사용해 podTemplate과 containerTemplate으로 생성된 컨테이너의 /etc/hosts 파일에 특정 정보를 추가하려면, 몇 가지 방법을 고려할 수 있습니다. /etc/hosts는 컨테이너 내부에서 호스트 이름과 IP 매핑을 정의하는 데 사용되며, Kubernetes에서는 이를 동적으로 수정하거나 설정하는 방법이 제한적일 수 있습니다. 아래에서는 Jenkinsfile에서 이를 구현하는 방법을 단계적으로 설명하고, /etc/hosts에 정보를 추가하는 가장 실용적인 접근법을 제시하겠습니다.
/etc/hosts 수정 방법컨테이너의 /etc/hosts는 기본적으로 읽기 전용 파일 시스템에 속할 수 있으며, Kubernetes 환경에서는 컨테이너가 시작된 후 동적으로 수정하는 것이 복잡할 수 있습니다. Kubernetes에서 /etc/hosts를 커스터마이징하는 주요 방법은 다음과 같습니다:
Pod의 hostAliases 사용 (권장):
hostAliases를 podTemplate에 정의해 /etc/hosts에 원하는 IP-호스트 매핑을 추가.podTemplate에 직접 설정 가능.컨테이너 실행 시 명령어로 수정:
containerTemplate의 command와 args를 사용해 컨테이너 시작 시 /etc/hosts에 엔트리를 추가./etc/hosts가 쓰기 가능해야 하며, 루트 권한 필요.ConfigMap 또는 볼륨 마운트:
/etc/hosts 내용을 정의하고, 이를 컨테이너에 마운트.hostAliases가 더 간단한 경우가 많음.hostAliases가 가장 간단하고 Kubernetes 네이티브 방식이므로, 이를 중심으로 Jenkinsfile을 작성하겠습니다. 다른 방법이 필요하면 추가로 알려주세요.
/etc/hosts에 추가할 정보 예시질문에서 특정 정보가 명시되지 않았으므로, 예시로 다음과 같은 매핑을 추가한다고 가정합니다:
192.168.1.100 minio.local192.168.1.101 test-server.local이 정보는 MinIO 클러스터 또는 테스트 환경에서 필요한 호스트 이름과 IP를 매핑한다고 가정합니다.
아래는 이전에 제공한 Jenkinsfile을 기반으로, podTemplate에 hostAliases를 추가해 /etc/hosts에 특정 정보를 설정하는 예제입니다. warp Job을 실행하고, 성능 로그를 수집하며, Job을 정리하는 기존 로직은 유지했습니다.
pipeline {
agent {
// podTemplate에 hostAliases 추가
podTemplate(
label: 'warp-test-pod',
// hostAliases로 /etc/hosts에 추가할 정보 정의
hostAliases: [
[ip: '192.168.1.100', hostnames: ['minio.local']],
[ip: '192.168.1.101', hostnames: ['test-server.local']]
],
containers: [
// Warp 컨테이너
containerTemplate(
name: 'warp',
image: 'minio/warp:latest',
command: 'sleep',
args: 'infinity',
envVars: [
envVar(key: 'MINIO_ACCESS_KEY', value: 'your-access-key'),
envVar(key: 'MINIO_SECRET_KEY', value: 'your-secret-key')
]
),
// Kubectl 컨테이너
containerTemplate(
name: 'kubectl',
image: 'bitnami/kubectl:latest',
command: 'sleep',
args: 'infinity'
)
],
serviceAccount: 'jenkins',
namespace: 'default'
) {
node('warp-test-pod') {
stage('Checkout') {
container('warp') {
checkout scm
}
}
stage('Deploy Warp Job') {
container('kubectl') {
sh '''
# Warp Job YAML 파일 적용
kubectl apply -f warp-job.yaml
'''
}
}
stage('Wait for Job Completion') {
container('kubectl') {
sh '''
# Job 완료 대기, 타임아웃 7일
kubectl wait --for=condition=complete job/warp-job --timeout=604800s
'''
}
}
stage('Get Performance Logs') {
container('kubectl') {
sh '''
# Job의 Pod 이름 가져오기
POD_NAME=$(kubectl get pods -l job-name=warp-job -o jsonpath="{.items[0].metadata.name}")
# 로그 가져오기
kubectl logs $POD_NAME > performance.log
# 로그를 Jenkins 아티팩트로 저장
'''
archiveArtifacts artifacts: 'performance.log', allowEmptyArchive: true
}
}
stage('Cleanup') {
container('kubectl') {
sh '''
# Job 삭제
kubectl delete job/warp-job || true
'''
}
}
}
}
}
post {
always {
echo 'Pipeline completed.'
}
success {
echo 'Warp Job completed successfully and logs archived.'
}
failure {
echo 'Pipeline failed. Check logs for details.'
}
}
}
hostAliases 설명hostAliases:podTemplate에 정의된 hostAliases는 Pod의 모든 컨테이너(/etc/hosts)에 지정된 IP-호스트 매핑을 추가./etc/hosts에 다음이 추가됨:192.168.1.100 minio.local
192.168.1.101 test-server.localwarp와 kubectl 컨테이너 모두에서 이 설정이 적용됨./etc/hosts 수정.hostAliases는 Pod 수준에서 적용되므로, warp-job.yaml의 Job Pod에도 동일한 설정을 추가해야 함 (아래 참조).warp-job.yaml 수정warp Job에서도 동일한 /etc/hosts 설정이 필요하므로, warp-job.yaml에 hostAliases를 추가합니다:
apiVersion: batch/v1
kind: Job
metadata:
name: warp-job
namespace: default
spec:
template:
metadata:
labels:
app: warp-job
spec:
# hostAliases 추가
hostAliases:
- ip: "192.168.1.100"
hostnames:
- "minio.local"
- ip: "192.168.1.101"
hostnames:
- "test-server.local"
containers:
- name: warp
image: minio/warp:latest
command: ["/bin/sh", "-c"]
args:
- |
warp put \
--host minio.local:9000 \
--access-key your-access-key \
--secret-key your-secret-key \
--bucket test-bucket \
--obj.size=4096 \
--objects=1000000000 \
--concurrent=100 \
--duration=7d \
--no-color \
--analyze.v \
> performance.log
env:
- name: MINIO_ACCESS_KEY
value: "your-access-key"
- name: MINIO_SECRET_KEY
value: "your-secret-key"
restartPolicy: Never
backoffLimit: 1
warp-job Pod의 /etc/hosts에 minio.local과 test-server.local 추가.warp put 명령어에서 minio.local:9000을 사용해 hostAliases와 매핑./etc/hosts 수정hostAliases 대신 컨테이너 내부에서 /etc/hosts를 직접 수정하려면, warp 컨테이너의 command와 args를 수정하거나 초기화 스크립트를 추가합니다. 예:
# warp-job.yaml 일부
containers:
- name: warp
image: minio/warp:latest
command: ["/bin/sh", "-c"]
args:
- |
echo "192.168.1.100 minio.local" >> /etc/hosts
echo "192.168.1.101 test-server.local" >> /etc/hosts
warp put \
--host minio.local:9000 \
--access-key your-access-key \
--secret-key your-secret-key \
--bucket test-bucket \
--obj.size=4096 \
--objects=1000000000 \
--concurrent=100 \
--duration=7d \
--no-color \
--analyze.v \
> performance.log
/etc/hosts가 읽기 전용일 경우 실패 가능.securityContext로 privileged: true 설정 가능, 보안 위험).hostAliases가 더 간단하고 안정적.192.168.1.100 minio.local 등은 실제 MinIO 클러스터 또는 환경에 맞게 변경하세요.serviceAccount가 Job 생성/삭제 및 로그 수집 권한을 가져야 함.kubectl 컨테이너가 Kubernetes API에 접근할 수 있는지 확인.performance.log를 Jenkins 아티팩트로 저장 후, Prometheus/Grafana로 시각화 추천.warp-job.yaml을 복사하고 Job 이름을 다르게 설정 (예: warp-job-1, warp-job-2).stage('Deploy Multiple Warp Jobs') {
container('kubectl') {
sh '''
for i in {1..10}; do
sed "s/warp-job/warp-job-$i/g" warp-job.yaml | kubectl apply -f -
done
'''
}
}kubectl wait 타임아웃 7일로 설정./etc/hosts 항목(예: 다른 IP-호스트 쌍)이 있다면 알려주세요.hostAliases 대신 ConfigMap으로 /etc/hosts를 마운트하고 싶으시면 요청 부탁드립니다.warp 명령어의 특정 옵션(예: --concurrent, --bucket) 조정 필요 시 말씀해주세요.10^8 ea
질문에서 4KB 객체 10억 개를 채우는 데 5~7일이 너무 오래 걸린다고 하셨으므로, 객체 수를 1억 개로 줄이고 소요 시간을 계산하겠습니다. 이를 위해 이전 답변에서 사용한 MinIO 클러스터 환경(58개 노드, 노드당 NVMe SSD 7TiB × 20개, EC 5:3, 네트워크 50Gbps 본딩, 스위치 40Gbps, 백본 200Gbps)을 기반으로 계산하고, warp Job을 사용한 Jenkins 파이프라인과 /etc/hosts 설정(hostAliases)도 유지하겠습니다. 아래에서 데이터를 빠르게 채우는 방법과 예상 소요 시간을 상세히 설명합니다.
warp Job에서 --concurrent=100 설정, 여러 클라이언트(예: 10대)로 병렬 업로드.1억 개 4KB 객체를 빠르게 채우기 위해 이전 답변의 방법을 최적화해 적용합니다:
병렬 업로드:
minio/warp로 다중 스레드 업로드.--concurrent=100 설정, 10개 클라이언트로 병렬 실행.warp put \
--host minio.local:9000 \
--access-key your-access-key \
--secret-key your-secret-key \
--bucket test-bucket \
--obj.size=4096 \
--objects=100000000 \
--concurrent=100 \
--no-color \
--analyze.v
더미 데이터 생성:
dd로 4KB 파일 생성 후 업로드:dd if=/dev/urandom of=testfile_4kb bs=4K count=1
for i in {1..1000000}; do cp testfile_4kb testfile_$i; done
mc cp testfile_* s3://test-bucket/다중 Job 실행:
warp-job.yaml을 복사해 warp-job-1.yaml, warp-job-2.yaml 등 생성.메타데이터 최적화:
--no-lock 옵션으로 동기화 오버헤드 감소.hostAliases 포함)1억 개 객체로 테스트를 조정하고, /etc/hosts 설정(hostAliases)을 유지한 Jenkinsfile입니다. 10개 Job으로 분산 실행하도록 수정했습니다.
pipeline {
agent {
podTemplate(
label: 'warp-test-pod',
// /etc/hosts에 추가할 정보
hostAliases: [
[ip: '192.168.1.100', hostnames: ['minio.local']],
[ip: '192.168.1.101', hostnames: ['test-server.local']]
],
containers: [
containerTemplate(
name: 'warp',
image: 'minio/warp:latest',
command: 'sleep',
args: 'infinity',
envVars: [
envVar(key: 'MINIO_ACCESS_KEY', value: 'your-access-key'),
envVar(key: 'MINIO_SECRET_KEY', value: 'your-secret-key')
]
),
containerTemplate(
name: 'kubectl',
image: 'bitnami/kubectl:latest',
command: 'sleep',
args: 'infinity'
)
],
serviceAccount: 'jenkins',
namespace: 'default'
) {
node('warp-test-pod') {
stage('Checkout') {
container('warp') {
checkout scm
}
}
stage('Deploy Multiple Warp Jobs') {
container('kubectl') {
sh '''
# 10개 Job으로 분산 (각 1,000만 개 객체)
for i in {1..10}; do
sed "s/warp-job/warp-job-$i/g; s/objects=100000000/objects=10000000/g" warp-job.yaml | kubectl apply -f -
done
'''
}
}
stage('Wait for Job Completion') {
container('kubectl') {
sh '''
# 모든 Job 완료 대기, 타임아웃 24시간
for i in {1..10}; do
kubectl wait --for=condition=complete job/warp-job-$i --timeout=86400s
done
'''
}
}
stage('Get Performance Logs') {
container('kubectl') {
sh '''
# 각 Job의 Pod 로그 수집
for i in {1..10}; do
POD_NAME=$(kubectl get pods -l job-name=warp-job-$i -o jsonpath="{.items[0].metadata.name}")
kubectl logs $POD_NAME > performance-$i.log
done
'''
archiveArtifacts artifacts: 'performance-*.log', allowEmptyArchive: true
}
}
stage('Cleanup') {
container('kubectl') {
sh '''
# 모든 Job 삭제
for i in {1..10}; do
kubectl delete job/warp-job-$i || true
done
'''
}
}
}
}
}
post {
always {
echo 'Pipeline completed.'
}
success {
echo 'Warp Jobs completed successfully and logs archived.'
}
failure {
echo 'Pipeline failed. Check logs for details.'
}
}
}
warp-job.yaml1억 개 객체를 10개 Job(각 1,000만 개)으로 분산하도록 설정한 warp-job.yaml입니다. /etc/hosts 설정도 포함합니다.
apiVersion: batch/v1
kind: Job
metadata:
name: warp-job
namespace: default
spec:
template:
metadata:
labels:
app: warp-job
spec:
hostAliases:
- ip: "192.168.1.100"
hostnames:
- "minio.local"
- ip: "192.168.1.101"
hostnames:
- "test-server.local"
containers:
- name: warp
image: minio/warp:latest
command: ["/bin/sh", "-c"]
args:
- |
warp put \
--host minio.local:9000 \
--access-key your-access-key \
--secret-key your-secret-key \
--bucket test-bucket \
--obj.size=4096 \
--objects=10000000 \
--concurrent=100 \
--duration=1d \
--no-color \
--analyze.v \
> performance.log
env:
- name: MINIO_ACCESS_KEY
value: "your-access-key"
- name: MINIO_SECRET_KEY
value: "your-secret-key"
restartPolicy: Never
backoffLimit: 1
--objects=10000000: 각 Job이 1,000만 개 객체 업로드.--duration=1d: 최대 24시간 (12~16시간 예상).warp 옵션(예: --concurrent, --bucket) 조정 필요 시 알려주세요.performance.log를 Grafana로 시각화하는 방법 제공 가능.warp tuning options
MinIO의 warp 도구를 사용해 클러스터 성능 테스트(특히 4KB 객체 1억 개 업로드)를 수행할 때, 성능을 최적화하고 정확한 결과를 얻기 위해 조정해야 할 주요 튜닝 변수들을 아래에 정리하겠습니다. 이전 답변에서 제공된 MinIO 클러스터 환경(58개 노드, 노드당 NVMe SSD 7TiB × 20개, EC 5:3, 네트워크 50Gbps 본딩, 스위치 40Gbps, 백본 200Gbps)을 기반으로 하며, 4KB 객체 1억 개 업로드 시나리오에 맞춰 설명합니다. warp 명령어와 관련된 주요 변수와 그 설정값, 그리고 튜닝 팁을 포함합니다.
warp는 MinIO 클러스터의 성능을 벤치마킹하기 위한 도구로, put, get, list, delete 등의 작업을 테스트할 수 있습니다. 4KB 객체 1억 개 업로드(warp put)를 기준으로 주요 튜닝 변수는 다음과 같습니다:
--obj.size--obj.size=4096 (4KB).--obj.size=4k:50%,24m:50%처럼 크기 분포 지정 가능.--objects--objects=10000000 (1,000만 개 × 10개 Job = 1억 개).warp-job-1.yaml, warp-job-2.yaml 등으로 나누기.--concurrent--concurrent=100~200 (클러스터 규모 및 네트워크 병목에 따라 조정).--duration--duration=24h (1억 개 기준 12~16시간 예상).--duration=12h로 시작해 성능 확인 후 조정.--host--host=minio.local:9000 (이전 답변의 hostAliases 사용).hostAliases로 정의된 /etc/hosts(예: 192.168.1.100 minio.local)와 일치해야 함.minio.default.svc.cluster.local:9000 사용.--no-verify-ssl 추가 가능.--access-key 및 --secret-keyMINIO_ACCESS_KEY, MINIO_SECRET_KEY).envVars 또는 warp-job.yaml의 env에 설정.withCredentials([usernamePassword(credentialsId: 'minio-credentials', usernameVariable: 'MINIO_ACCESS_KEY', passwordVariable: 'MINIO_SECRET_KEY')]) {
sh 'export MINIO_ACCESS_KEY=$MINIO_ACCESS_KEY; export MINIO_SECRET_KEY=$MINIO_SECRET_KEY; warp put ...'
}--bucket--bucket=test-bucket.test-bucket-1, test-bucket-2)로 메타데이터 부하 분산.mc mb s3/test-bucket로 사전 생성.--no-lock--no-lock (기본값 비활성화).--no-lock 사용해 성능 최적화.--analyze.v--analyze.v (필수).performance.log로 저장, Jenkins 아티팩트로 수집.--no-color--no-color (권장).4KB 객체 1억 개 업로드는 IOPS 중심 워크로드로, 메타데이터 처리와 네트워크 요청이 주요 병목입니다. 클러스터 환경(58개 노드, EC 5:3, 40Gbps 스위치)을 고려한 튜닝은 다음과 같습니다:
cache_size=2GB).warp-job.yaml1억 개 객체를 10개 Job(각 1,000만 개)으로 분산하며, 최적화된 변수 적용:
apiVersion: batch/v1
kind: Job
metadata:
name: warp-job
namespace: default
spec:
template:
metadata:
labels:
app: warp-job
spec:
hostAliases:
- ip: "192.168.1.100"
hostnames:
- "minio.local"
- ip: "192.168.1.101"
hostnames:
- "test-server.local"
containers:
- name: warp
image: minio/warp:latest
command: ["/bin/sh", "-c"]
args:
- |
warp put \
--host minio.local:9000 \
--access-key your-access-key \
--secret-key your-secret-key \
--bucket test-bucket \
--obj.size=4096 \
--objects=10000000 \
--concurrent=100 \
--duration=12h \
--no-lock \
--no-color \
--analyze.v \
> performance.log
env:
- name: MINIO_ACCESS_KEY
value: "your-access-key"
- name: MINIO_SECRET_KEY
value: "your-secret-key"
resources:
requests:
cpu: "2"
memory: "4Gi"
limits:
cpu: "4"
memory: "8Gi"
restartPolicy: Never
backoffLimit: 1
--objects=10000000: Job당 1,000만 개.--concurrent=100: 병렬 스레드 100개.--duration=12h: Job당 1.2~1.6시간, 여유 있게 12시간.--no-lock: 메타데이터 오버헤드 감소.이전 답변의 Jenkinsfile을 최적화된 변수로 재확인합니다. 10개 Job 실행 및 로그 수집 로직은 동일합니다.
pipeline {
agent {
podTemplate(
label: 'warp-test-pod',
hostAliases: [
[ip: '192.168.1.100', hostnames: ['minio.local']],
[ip: '192.168.1.101', hostnames: ['test-server.local']]
],
containers: [
containerTemplate(
name: 'warp',
image: 'minio/warp:latest',
command: 'sleep',
args: 'infinity',
envVars: [
envVar(key: 'MINIO_ACCESS_KEY', value: 'your-access-key'),
envVar(key: 'MINIO_SECRET_KEY', value: 'your-secret-key')
]
),
containerTemplate(
name: 'kubectl',
image: 'bitnami/kubectl:latest',
command: 'sleep',
args: 'infinity'
)
],
serviceAccount: 'jenkins',
namespace: 'default'
) {
node('warp-test-pod') {
stage('Checkout') {
container('warp') {
checkout scm
}
}
stage('Deploy Multiple Warp Jobs') {
container('kubectl') {
sh '''
for i in {1..10}; do
sed "s/warp-job/warp-job-$i/g; s/objects=10000000/objects=10000000/g" warp-job.yaml | kubectl apply -f -
done
'''
}
}
stage('Wait for Job Completion') {
container('kubectl') {
sh '''
for i in {1..10}; do
kubectl wait --for=condition=complete job/warp-job-$i --timeout=43200s
done
'''
}
}
stage('Get Performance Logs') {
container('kubectl') {
sh '''
for i in {1..10}; do
POD_NAME=$(kubectl get pods -l job-name=warp-job-$i -o jsonpath="{.items[0].metadata.name}")
kubectl logs $POD_NAME > performance-$i.log
done
'''
archiveArtifacts artifacts: 'performance-*.log', allowEmptyArchive: true
}
}
stage('Cleanup') {
container('kubectl') {
sh '''
for i in {1..10}; do
kubectl delete job/warp-job-$i || true
done
'''
}
}
}
}
}
post {
always {
echo 'Pipeline completed.'
}
success {
echo 'Warp Jobs completed successfully and logs archived.'
}
failure {
echo 'Pipeline failed. Check logs for details.'
}
}
}
warp-job.yaml과 일치 (10000000).warp 로그(performance-*.log) 시각화.minio-data 디렉토리).--concurrent, --obj.size 등 추가 튜닝 필요 시 알려주세요.warp 로그를 특정 형식으로 파싱하거나 시각화 방법 필요 시 요청 부탁드립니다.bucket count 1->10,100
네, S3(MinIO 포함) 환경에서 버킷 개수는 성능에 영향을 미치는 중요한 요인 중 하나입니다. 특히, 4KB 객체 1억 개를 업로드하는 warp 테스트 시나리오에서 버킷 개수(1개, 10개, 100개)에 따른 성능 차이를 분석하겠습니다. 이전 답변의 MinIO 클러스터 환경(58개 노드, 노드당 NVMe SSD 7TiB × 20개, EC 5:3, 네트워크 50Gbps 본딩, 스위치 40Gbps, 백본 200Gbps)을 기반으로, 버킷 개수가 성능에 미치는 영향과 예상 소요 시간을 아래에 정리합니다.
S3에서 버킷은 객체를 저장하는 논리적 컨테이너로, 버킷 개수는 메타데이터 관리, 요청 분산, 네트워크 및 스토리지 IOPS에 영향을 미칩니다. 특히 4KB 객체와 같은 작은 객체 워크로드에서는 메타데이터 처리 부담이 크므로, 버킷 개수에 따라 다음과 같은 요소가 변합니다:
이전 답변에서 4KB 객체 1억 개(400TB, EC 5:3 기준 640TB)는 10~20GB/s 쓰기 속도로 12~16시간 소요(10개 Job 병렬 시 1.2~1.6시간)로 계산했습니다. 버킷 개수(1개, 10개, 100개)에 따른 성능 차이를 아래에 분석합니다.
test-bucket)에 저장.test-bucket-1 ~ test-bucket-10)에 분산.test-bucket-1 ~ test-bucket-100)에 분산.| 버킷 개수 | 쓰기 속도 (GB/s) | 단일 Job 소요 시간 | 10개 Job 병렬 소요 시간 | 장점 | 단점 |
|---|---|---|---|---|---|
| 1개 | 8~16 | 13.9~17.8시간 | 1.4~2.0시간 | 관리 간단 | 메타데이터/네트워크 병목 심화 |
| 10개 | 10~22 | 11.1~16시간 | 1.1~1.5시간 | 부하 분산 | 관리 약간 복잡 |
| 100개 | 12~24 | 9.3~13.3시간 | 0.9~1.3시간 | 최고 성능 | 관리 복잡, 오버헤드 증가 |
버킷 10개 시나리오를 반영한 Jenkinsfile입니다. 각 Job이 서로 다른 버킷(test-bucket-1 ~ test-bucket-10)에 업로드하도록 설정합니다.
pipeline {
agent {
podTemplate(
label: 'warp-test-pod',
hostAliases: [
[ip: '192.168.1.100', hostnames: ['minio.local']],
[ip: '192.168.1.101', hostnames: ['test-server.local']]
],
containers: [
containerTemplate(
name: 'warp',
image: 'minio/warp:latest',
command: 'sleep',
args: 'infinity',
envVars: [
envVar(key: 'MINIO_ACCESS_KEY', value: 'your-access-key'),
envVar(key: 'MINIO_SECRET_KEY', value: 'your-secret-key')
]
),
containerTemplate(
name: 'kubectl',
image: 'bitnami/kubectl:latest',
command: 'sleep',
args: 'infinity'
)
],
serviceAccount: 'jenkins',
namespace: 'default'
) {
node('warp-test-pod') {
stage('Create Buckets') {
container('kubectl') {
sh '''
# 10개 버킷 생성
for i in {1..10}; do
kubectl run mc-$i --image=minio/mc --restart=Never --command -- sh -c "mc alias set minio http://minio.local:9000 your-access-key your-secret-key && mc mb minio/test-bucket-$i"
done
'''
}
}
stage('Deploy Multiple Warp Jobs') {
container('kubectl') {
sh '''
# 10개 Job, 각기 다른 버킷 사용
for i in {1..10}; do
sed "s/warp-job/warp-job-$i/g; s/test-bucket/test-bucket-$i/g; s/objects=10000000/objects=10000000/g" warp-job.yaml | kubectl apply -f -
done
'''
}
}
stage('Wait for Job Completion') {
container('kubectl') {
sh '''
for i in {1..10}; do
kubectl wait --for=condition=complete job/warp-job-$i --timeout=5400s
done
'''
}
}
stage('Get Performance Logs') {
container('kubectl') {
sh '''
for i in {1..10}; do
POD_NAME=$(kubectl get pods -l job-name=warp-job-$i -o jsonpath="{.items[0].metadata.name}")
kubectl logs $POD_NAME > performance-$i.log
done
'''
archiveArtifacts artifacts: 'performance-*.log', allowEmptyArchive: true
}
}
stage('Cleanup') {
container('kubectl') {
sh '''
for i in {1..10}; do
kubectl delete job/warp-job-$i || true
kubectl delete pod -l app=mc-$i || true
done
'''
}
}
}
}
}
post {
always {
echo 'Pipeline completed.'
}
success {
echo 'Warp Jobs completed successfully and logs archived.'
}
failure {
echo 'Pipeline failed. Check logs for details.'
}
}
}
minio/mc로 10개 버킷(test-bucket-1 ~ test-bucket-10) 사전 생성.sed로 동적 수정.mc Pod도 정리.warp-job.yaml (버킷 10개)apiVersion: batch/v1
kind: Job
metadata:
name: warp-job
namespace: default
spec:
template:
metadata:
labels:
app: warp-job
spec:
hostAliases:
- ip: "192.168.1.100"
hostnames:
- "minio.local"
- ip: "192.168.1.101"
hostnames:
- "test-server.local"
containers:
- name: warp
image: minio/warp:latest
command: ["/bin/sh", "-c"]
args:
- |
warp put \
--host minio.local:9000 \
--access-key your-access-key \
--secret-key your-secret-key \
--bucket test-bucket \
--obj.size=4096 \
--objects=10000000 \
--concurrent=100 \
--duration=5400s \
--no-lock \
--no-color \
--analyze.v \
> performance.log
env:
- name: MINIO_ACCESS_KEY
value: "your-access-key"
- name: MINIO_SECRET_KEY
value: "your-secret-key"
resources:
requests:
cpu: "2"
memory: "4Gi"
limits:
cpu: "4"
memory: "8Gi"
restartPolicy: Never
backoffLimit: 1
--bucket: test-bucket은 Jenkinsfile에서 동적으로 test-bucket-$i로 변경.--duration: 5,400초(1.5시간)으로 조정.Create Buckets 스테이지에서 for i in {1..100}으로 변경.warp-job.yaml의 --objects=1000000 (100만 개/버킷).performance-*.log를 Grafana로 시각화, 쓰기 속도/IOPS 모니터링.warp 로그를 특정 형식으로 처리/분석 원하시면 요청 부탁드립니다.pu/get raito
MinIO의 warp 도구를 사용해 mixed 테스트(put과 get 작업 혼합)에서 put과 get 비율을 조정할 때 throughput이 달라지는 이유는 MinIO 클러스터의 특성과 워크로드 특성(특히 4KB 객체 중심, EC 5:3, 58개 노드, 40Gbps 스위치) 때문입니다. 아래에서 put/get 비율에 따른 throughput 변화의 원인을 분석하고, 이를 이전 답변의 환경(4KB 객체 1억 개, 버킷 1개/10개/100개)에 맞춰 설명하겠습니다. 또한, warp의 주요 튜닝 변수와 Jenkinsfile 설정도 참고하여 구체적으로 다룹니다.
put/get 비율에 따른 Throughput 변화 원인warp mixed 테스트는 put(쓰기)와 get(읽기) 작업을 혼합하여 실행하며, --op.put와 --op.get으로 비율을 조정합니다(예: --op.put=50% --op.get=50%). Throughput 변화는 다음과 같은 요인에 의해 발생합니다:
put)와 읽기(get)의 리소스 사용 패턴 차이Put (쓰기):
Get (읽기):
비율에 따른 영향:
put 비율이 높을수록(예: 80% put, 20% get): CPU와 메타데이터 쓰기 부하 증가, throughput 감소.get 비율이 높을수록(예: 20% put, 80% get): CPU 부하 감소, 읽기 IOPS 효율성으로 throughput 증가.put 비율 높음 → 메타데이터 쓰기 병목, throughput 저하.get 비율 높음 → 메타데이터 읽기 효율성, throughput 증가.put 비율 높을 때 병목 심화.put/get 모두에서 throughput 약 10~20% 향상.put 비율 높음 → 네트워크 트래픽 증가, 스위치 병목 심화.get 비율 높음 → 네트워크 부하 감소, throughput 약 10~15% 향상.get 중심 워크로드에서 더 큰 이점.put 비율 높을수록 EC 오버헤드로 throughput 저하.get 비율 높을수록 EC의 읽기 효율성으로 throughput 증가.put/get 비율별 Throughput 예측이전 답변에서 4KB 객체 1억 개(400TB, EC 5:3 기준 640TB)는 10~20GB/s 쓰기 속도로 1.1~1.5시간(10개 Job, 10개 버킷) 소요된다고 계산했습니다. mixed 테스트에서 put/get 비율에 따른 throughput과 소요 시간 변화를 아래에 분석합니다.
--concurrent=100.| 비율 | Put Throughput (GB/s) | Get Throughput (GB/s) | 총 Throughput (GB/s) | 소요 시간 (10개 Job) | 비고 |
|---|---|---|---|---|---|
| 80% put, 20% get | 8~16 | 12~24 | 9~18 | 1.3~1.8시간 | Put 병목 (메타데이터, CPU) |
| 50% put, 50% get | 9~18 | 12~24 | 10~20 | 1.1~1.5시간 | 균형, 기본 성능 |
| 20% put, 80% get | 10~20 | 14~28 | 12~24 | 0.9~1.3시간 | Get 효율성 (캐싱, 낮은 오버헤드) |
put 중심 워크로드에서 병목 심화.get 중심 워크로드에서 이점 큼.get 중심 워크로드에서 최고 성능.warp 명령어 수정warp mixed 테스트를 위해 --op.put와 --op.get 비율을 추가합니다. warp-job.yaml을 아래와 같이 수정:
apiVersion: batch/v1
kind: Job
metadata:
name: warp-job
namespace: default
spec:
template:
metadata:
labels:
app: warp-job
spec:
hostAliases:
- ip: "192.168.1.100"
hostnames:
- "minio.local"
- ip: "192.168.1.101"
hostnames:
- "test-server.local"
containers:
- name: warp
image: minio/warp:latest
command: ["/bin/sh", "-c"]
args:
- |
warp mixed \
--host minio.local:9000 \
--access-key your-access-key \
--secret-key your-secret-key \
--bucket test-bucket \
--obj.size=4096 \
--objects=10000000 \
--op.put=50 \
--op.get=50 \
--concurrent=100 \
--duration=5400s \
--no-lock \
--no-color \
--analyze.v \
> performance.log
env:
- name: MINIO_ACCESS_KEY
value: "your-access-key"
- name: MINIO_SECRET_KEY
value: "your-secret-key"
resources:
requests:
cpu: "2"
memory: "4Gi"
limits:
cpu: "4"
memory: "8Gi"
restartPolicy: Never
backoffLimit: 1
warp mixed: put 대신 mixed 명령어 사용.--op.put=50 --op.get=50: 50% put, 50% get (비율 조정 가능, 예: --op.put=80 --op.get=20).--duration=5400s: 1.5시간, 10개 Job 기준.mixed 테스트를 반영하고, 10개 버킷 및 10개 Job으로 실행:
pipeline {
agent {
podTemplate(
label: 'warp-test-pod',
hostAliases: [
[ip: '192.168.1.100', hostnames: ['minio.local']],
[ip: '192.168.1.101', hostnames: ['test-server.local']]
],
containers: [
containerTemplate(
name: 'warp',
image: 'minio/warp:latest',
command: 'sleep',
args: 'infinity',
envVars: [
envVar(key: 'MINIO_ACCESS_KEY', value: 'your-access-key'),
envVar(key: 'MINIO_SECRET_KEY', value: 'your-secret-key')
]
),
containerTemplate(
name: 'kubectl',
image: 'bitnami/kubectl:latest',
command: 'sleep',
args: 'infinity'
)
],
serviceAccount: 'jenkins',
namespace: 'default'
) {
node('warp-test-pod') {
stage('Create Buckets') {
container('kubectl') {
sh '''
for i in {1..10}; do
kubectl run mc-$i --image=minio/mc --restart=Never --command -- sh -c "mc alias set minio http://minio.local:9000 your-access-key your-secret-key && mc mb minio/test-bucket-$i"
done
'''
}
}
stage('Deploy Multiple Warp Jobs') {
container('kubectl') {
sh '''
for i in {1..10}; do
sed "s/warp-job/warp-job-$i/g; s/test-bucket/test-bucket-$i/g; s/objects=10000000/objects=10000000/g" warp-job.yaml | kubectl apply -f -
done
'''
}
}
stage('Wait for Job Completion') {
container('kubectl') {
sh '''
for i in {1..10}; do
kubectl wait --for=condition=complete job/warp-job-$i --timeout=5400s
done
'''
}
}
stage('Get Performance Logs') {
container('kubectl') {
sh '''
for i in {1..10}; do
POD_NAME=$(kubectl get pods -l job-name=warp-job-$i -o jsonpath="{.items[0].metadata.name}")
kubectl logs $POD_NAME > performance-$i.log
done
'''
archiveArtifacts artifacts: 'performance-*.log', allowEmptyArchive: true
}
}
stage('Cleanup') {
container('kubectl') {
sh '''
for i in {1..10}; do
kubectl delete job/warp-job-$i || true
kubectl delete pod -l app=mc-$i || true
done
'''
}
}
}
}
}
post {
always {
echo 'Pipeline completed.'
}
success {
echo 'Warp Jobs completed successfully and logs archived.'
}
failure {
echo 'Pipeline failed. Check logs for details.'
}
}
}
warp-job.yaml과 동기화, mixed 테스트 반영.get 중심 워크로드에서 더 큰 이점.get throughput 20~30% 향상.put throughput 약 10~20% 증가.get 성능 향상.performance-*.log를 Prometheus/Grafana로 시각화, put/get별 IOPS 및 지연 시간 분석.put/get 비율(예: 70% put, 30% get) 테스트 필요 시 알려주세요.warp 로그에서 특정 메트릭(예: latency, IOPS) 추출 방법 필요 시 말씀해주세요.warp mode
Warp 테스트 모드에 대한 설명을 드리겠습니다. MinIO의 warp 도구는 S3 벤치마킹을 위한 여러 모드를 제공하며, 각 모드에서 출력되는 성능 결과(throughput, obj/s 등)는 모드의 목적에 따라 다릅니다. 아래에서 put, get, mixed 모드를 중심으로 설명하고, 질문하신 내용에 맞춰 확인하겠습니다. 이는 warp의 공식 문서(GitHub 리포지토리)를 기반으로 한 정보입니다.
--obj.size)와 수량으로 객체를 업로드하며, --duration 동안 계속 실행됩니다.--objects 만큼의 객체를 먼저 업로드한 후 get을 테스트합니다. 기존 객체를 사용하려면 --list-existing 옵션을 사용할 수 있습니다.--get-distrib, --stat-distrib, --put-distrib, --delete-distrib 옵션으로 각 작업의 비율을 조정합니다.warp에는 put, get, mixed 외에도 다양한 모드가 있으며, S3 성능 테스트에서 자주 사용됩니다. 아래는 주요 모드들입니다(공식 문서 기준으로 흔히 사용되는 것들 위주로 선별):
이 모드들은 워크로드에 따라 선택적으로 사용되며, put/get/mixed가 가장 기본적이고 자주 쓰입니다. 추가 옵션(예: --concurrent, --obj.size)으로 세밀하게 조정할 수 있습니다. 더 구체적인 모드나 예시가 필요하시면 말씀해주세요!
multi-part upload
MinIO의 warp 도구를 사용해 멀티파트 업로드(multipart upload)를 테스트하는 경우의 이점과 이를 어떻게 설정 및 구분하여 테스트할 수 있는지, 그리고 이전 답변에서 다룬 환경(58개 노드, 노드당 NVMe SSD 7TiB × 20개, EC 5:3, 네트워크 50Gbps 본딩, 스위치 40Gbps, 백본 200Gbps, 4KB 객체 1억 개)을 기반으로 상세히 설명하겠습니다. 또한, warp의 멀티파트 업로드 모드를 어떻게 설정하고, 결과를 어떻게 구분하는지, 그리고 이를 Jenkins 파이프라인에 반영하는 방법도 다룹니다.
S3의 멀티파트 업로드는 큰 객체(예: 5MB 이상)를 여러 부분으로 나누어 병렬로 업로드하는 방식입니다. MinIO에서도 이를 지원하며, 특히 대용량 파일 처리에서 유용합니다. 4KB 객체 중심 워크로드에서는 멀티파트 업로드가 제한적으로 적용되지만, 혼합 워크로드(예: 4KB~24MB 객체)에서 이점을 살펴보겠습니다.
warp는 멀티파트 업로드를 테스트하기 위해 multipart mode를 제공하지 않지만, put 또는 mixed 모드에서 --multipart 플래그를 사용해 멀티파트 업로드를 활성화할 수 있습니다. 또한, 객체 크기를 5MB 이상으로 설정해야 멀티파트가 적용됩니다. 이를 4KB 객체 1억 개 테스트에 맞춰 조정하고, 혼합 워크로드(4KB와 24MB)를 포함한 설정을 설명합니다.
warp put \
--host minio.local:9000 \
--access-key your-access-key \
--secret-key your-secret-key \
--bucket test-bucket \
--obj.size=24m \
--objects=10000000 \
--multipart \
--concurrent=100 \
--duration=5400s \
--no-lock \
--no-color \
--analyze.v--multipart: 멀티파트 업로드 활성화. 객체 크기가 5MB 이상일 때만 동작.--obj.size=24m: 24MB 객체로 설정(4KB는 멀티파트 불가).--objects=10000000: Job당 1,000만 개(10개 Job으로 1억 개).--concurrent=100: 병렬 스레드 수, 멀티파트 파트 전송 병렬화.--obj.size=4k:50%,24m:50%.warp put 또는 mixed 모드에서 --multipart 사용 시, 출력 로그에 멀티파트 업로드 여부가 명시됨.--analyze.v로 상세 로그 활성화 시, 멀티파트 관련 메트릭(파트 수, 파트 크기, 전송 시간)이 로그에 포함.--multipart 무시됨(파트 크기 5MB 미만).이전 답변의 Jenkinsfile을 수정하여 멀티파트 업로드를 테스트하도록 설정합니다. 10개 버킷, 10개 Job, 24MB 객체(멀티파트 적용)로 1억 개 객체를 업로드하며, 4KB와 혼합 워크로드도 포함합니다.
pipeline {
agent {
podTemplate(
label: 'warp-test-pod',
hostAliases: [
[ip: '192.168.1.100', hostnames: ['minio.local']],
[ip: '192.168.1.101', hostnames: ['test-server.local']]
],
containers: [
containerTemplate(
name: 'warp',
image: 'minio/warp:latest',
command: 'sleep',
args: 'infinity',
envVars: [
envVar(key: 'MINIO_ACCESS_KEY', value: 'your-access-key'),
envVar(key: 'MINIO_SECRET_KEY', value: 'your-secret-key')
]
),
containerTemplate(
name: 'kubectl',
image: 'bitnami/kubectl:latest',
command: 'sleep',
args: 'infinity'
)
],
serviceAccount: 'jenkins',
namespace: 'default'
) {
node('warp-test-pod') {
stage('Create Buckets') {
container('kubectl') {
sh '''
for i in {1..10}; do
kubectl run mc-$i --image=minio/mc --restart=Never --command -- sh -c "mc alias set minio http://minio.local:9000 your-access-key your-secret-key && mc mb minio/test-bucket-$i"
done
'''
}
}
stage('Deploy Multiple Warp Jobs') {
container('kubectl') {
sh '''
for i in {1..10}; do
sed "s/warp-job/warp-job-$i/g; s/test-bucket/test-bucket-$i/g" warp-job.yaml | kubectl apply -f -
done
'''
}
}
stage('Wait for Job Completion') {
container('kubectl') {
sh '''
for i in {1..10}; do
kubectl wait --for=condition=complete job/warp-job-$i --timeout=5400s
done
'''
}
}
stage('Get Performance Logs') {
container('kubectl') {
sh '''
for i in {1..10}; do
POD_NAME=$(kubectl get pods -l job-name=warp-job-$i -o jsonpath="{.items[0].metadata.name}")
kubectl logs $POD_NAME > performance-$i.log
done
'''
archiveArtifacts artifacts: 'performance-*.log', allowEmptyArchive: true
}
}
stage('Cleanup') {
container('kubectl') {
sh '''
for i in {1..10}; do
kubectl delete job/warp-job-$i || true
kubectl delete pod -l app=mc-$i || true
done
'''
}
}
}
}
}
post {
always {
echo 'Pipeline completed.'
}
success {
echo 'Warp Jobs completed successfully and logs archived.'
}
failure {
echo 'Pipeline failed. Check logs for details.'
}
}
}
warp-job.yaml (멀티파트 테스트)24MB 객체에 멀티파트 업로드를 적용하고, 혼합 워크로드(4KB:50%, 24MB:50%)를 테스트하도록 설정:
apiVersion: batch/v1
kind: Job
metadata:
name: warp-job
namespace: default
spec:
template:
metadata:
labels:
app: warp-job
spec:
hostAliases:
- ip: "192.168.1.100"
hostnames:
- "minio.local"
- ip: "192.168.1.101"
hostnames:
- "test-server.local"
containers:
- name: warp
image: minio/warp:latest
command: ["/bin/sh", "-c"]
args:
- |
warp put \
--host minio.local:9000 \
--access-key your-access-key \
--secret-key your-secret-key \
--bucket test-bucket \
--obj.size=4k:50%,24m:50% \
--multipart \
--objects=10000000 \
--concurrent=100 \
--duration=5400s \
--no-lock \
--no-color \
--analyze.v \
> performance.log
env:
- name: MINIO_ACCESS_KEY
value: "your-access-key"
- name: MINIO_SECRET_KEY
value: "your-secret-key"
resources:
requests:
cpu: "2"
memory: "4Gi"
limits:
cpu: "4"
memory: "8Gi"
restartPolicy: Never
backoffLimit: 1
--obj.size=4k:50%,24m:50%: 4KB(50%)와 24MB(50%) 혼합 워크로드.--multipart: 24MB 객체에 멀티파트 업로드 적용(4KB는 무시됨).--duration=5400s: 1.5시간, 10개 Job 기준.performance-*.log에서 "Multipart: enabled"로 24MB 객체의 멀티파트 업로드 확인.--multipart-size 옵션 사용(예: --multipart-size=8m).