diff --git a/scripts/s3_benchmark.sh b/scripts/s3_benchmark.sh new file mode 100755 index 0000000..33b8c26 --- /dev/null +++ b/scripts/s3_benchmark.sh @@ -0,0 +1,160 @@ +#!/bin/bash +# S3 Performance Benchmark +# Tests: PUT, GET, LIST, Multipart upload + +set -e + +S3_URL="http://127.0.0.1:11438/s3" +BUCKET="demo" +TEST_DIR="/tmp/s3_benchmark" +ACCESS_KEY="markbase_access_key_001" +SECRET_KEY="markbase_secret_key_xyz123" + +# Colors +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0;33m' + +echo "================================================" +echo "S3 Performance Benchmark" +echo "================================================" +echo "" + +# Setup test directory +rm -rf "$TEST_DIR" +mkdir -p "$TEST_DIR" +cd "$TEST_DIR" + +# Generate test files +echo "Generating test files..." +dd if=/dev/urandom of=file_1mb.bin bs=1M count=1 2>/dev/null +dd if=/dev/urandom of=file_10mb.bin bs=1M count=10 2>/dev/null +dd if=/dev/urandom of=file_50mb.bin bs=1M count=50 2>/dev/null +dd if=/dev/urandom of=file_100mb.bin bs=1M count=100 2>/dev/null +echo "${GREEN}Test files generated${NC}" +echo "" + +# Test 1: PUT 1MB file +echo "=== Test 1: PUT 1MB file ===" +START=$(date +%s.%N) +curl -s -X PUT -T file_1mb.bin "$S3_URL/$BUCKET/benchmark/file_1mb.bin" +END=$(date +%s.%N) +ELAPSED=$(echo "$END - $START" | bc) +THROUGHPUT=$(echo "scale=2; 1 / $ELAPSED" | bc) +echo "${GREEN}PUT 1MB: ${ELAPSED}s (${THROUGHPUT} MB/s)${NC}" +echo "" + +# Test 2: PUT 10MB file +echo "=== Test 2: PUT 10MB file ===" +START=$(date +%s.%N) +curl -s -X PUT -T file_10mb.bin "$S3_URL/$BUCKET/benchmark/file_10mb.bin" +END=$(date +%s.%N) +ELAPSED=$(echo "$END - $START" | bc) +THROUGHPUT=$(echo "scale=2; 10 / $ELAPSED" | bc) +echo "${GREEN}PUT 10MB: ${ELAPSED}s (${THROUGHPUT} MB/s)${NC}" +echo "" + +# Test 3: GET 10MB file +echo "=== Test 3: GET 10MB file ===" +START=$(date +%s.%N) +curl -s "$S3_URL/$BUCKET/benchmark/file_10mb.bin" -o /tmp/s3_download_10mb.bin +END=$(date +%s.%N) +ELAPSED=$(echo "$END - $START" | bc) +THROUGHPUT=$(echo "scale=2; 10 / $ELAPSED" | bc) +echo "${GREEN}GET 10MB: ${ELAPSED}s (${THROUGHPUT} MB/s)${NC}" +echo "" + +# Test 4: PUT 50MB file +echo "=== Test 4: PUT 50MB file ===" +START=$(date +%s.%N) +curl -s -X PUT -T file_50mb.bin "$S3_URL/$BUCKET/benchmark/file_50mb.bin" +END=$(date +%s.%N) +ELAPSED=$(echo "$END - $START" | bc) +THROUGHPUT=$(echo "scale=2; 50 / $ELAPSED" | bc) +echo "${GREEN}PUT 50MB: ${ELAPSED}s (${THROUGHPUT} MB/s)${NC}" +echo "" + +# Test 5: GET 50MB file +echo "=== Test 5: GET 50MB file ===" +START=$(date +%s.%N) +curl -s "$S3_URL/$BUCKET/benchmark/file_50mb.bin" -o /tmp/s3_download_50mb.bin +END=$(date +%s.%N) +ELAPSED=$(echo "$END - $START" | bc) +THROUGHPUT=$(echo "scale=2; 50 / $ELAPSED" | bc) +echo "${GREEN}GET 50MB: ${ELAPSED}s (${THROUGHPUT} MB/s)${NC}" +echo "" + +# Test 6: PUT 100MB file +echo "=== Test 6: PUT 100MB file ===" +START=$(date +%s.%N) +curl -s -X PUT -T file_100mb.bin "$S3_URL/$BUCKET/benchmark/file_100mb.bin" +END=$(date +%s.%N) +ELAPSED=$(echo "$END - $START" | bc) +THROUGHPUT=$(echo "scale=2; 100 / $ELAPSED" | bc) +echo "${GREEN}PUT 100MB: ${ELAPSED}s (${THROUGHPUT} MB/s)${NC}" +echo "" + +# Test 7: GET 100MB file +echo "=== Test 7: GET 100MB file ===" +START=$(date +%s.%N) +curl -s "$S3_URL/$BUCKET/benchmark/file_100mb.bin" -o /tmp/s3_download_100mb.bin +END=$(date +%s.%N) +ELAPSED=$(echo "$END - $START" | bc) +THROUGHPUT=$(echo "scale=2; 100 / $ELAPSED" | bc) +echo "${GREEN}GET 100MB: ${ELAPSED}s (${THROUGHPUT} MB/s)${NC}" +echo "" + +# Test 8: LIST objects (bucket listing) +echo "=== Test 8: LIST objects ===" +START=$(date +%s.%N) +curl -s "$S3_URL/$BUCKET" > /dev/null +END=$(date +%s.%N) +ELAPSED=$(echo "$END - $START" | bc) +echo "${GREEN}LIST bucket: ${ELAPSED}s${NC}" +echo "" + +# Test 9: HEAD object (metadata) +echo "=== Test 9: HEAD object ===" +START=$(date +%s.%N) +curl -s -I "$S3_URL/$BUCKET/benchmark/file_10mb.bin" > /dev/null +END=$(date +%s.%N) +ELAPSED=$(echo "$END - $START" | bc) +echo "${GREEN}HEAD object: ${ELAPSED}s${NC}" +echo "" + +# Test 10: DELETE objects (cleanup) +echo "=== Test 10: DELETE objects ===" +START=$(date +%s.%N) +curl -s -X DELETE "$S3_URL/$BUCKET/benchmark/file_1mb.bin" +curl -s -X DELETE "$S3_URL/$BUCKET/benchmark/file_10mb.bin" +curl -s -X DELETE "$S3_URL/$BUCKET/benchmark/file_50mb.bin" +curl -s -X DELETE "$S3_URL/$BUCKET/benchmark/file_100mb.bin" +END=$(date +%s.%N) +ELAPSED=$(echo "$END - $START" | bc) +echo "${GREEN}DELETE 4 files: ${ELAPSED}s${NC}" +echo "" + +# Test 11: Multipart upload simulation (split 50MB into 5 parts) +echo "=== Test 11: Multipart upload simulation ===" +# Split file into 10MB parts +split -b 10M file_50mb.bin part_ + +START=$(date +%s.%N) +# Upload each part sequentially (simulating multipart) +for i in part_aa part_ab part_ac part_ad part_ae; do + curl -s -X PUT -T "$i" "$S3_URL/$BUCKET/benchmark/mp_$i" 2>/dev/null || true +done +END=$(date +%s.%N) +ELAPSED=$(echo "$END - $START" | bc) +THROUGHPUT=$(echo "scale=2; 50 / $ELAPSED" | bc) +echo "${GREEN}Multipart (5x10MB): ${ELAPSED}s (${THROUGHPUT} MB/s)${NC}" +echo "" + +# Cleanup +rm -rf "$TEST_DIR" +rm -f /tmp/s3_download_*.bin part_* + +echo "================================================" +echo "${GREEN}S3 Performance Benchmark Complete${NC}" +echo "================================================" \ No newline at end of file