SMB Performance Benchmark Script:
- Tests: upload, download, directory listing, delete
- Supports macOS smbutil and Linux smbclient
- Custom port support (4445)
- Test files: 1MB, 10MB, 50MB, 100MB
Usage:
chmod +x scripts/smb_benchmark.sh
./scripts/smb_benchmark.sh
Note: macOS smbutil doesn't support custom ports
Use port 445 or Docker/Linux smbclient for full testing
168 lines
5.9 KiB
Bash
Executable File
168 lines
5.9 KiB
Bash
Executable File
#!/bin/bash
|
|
# SMB Performance Benchmark
|
|
# Tests: upload, download, directory listing, rename, delete
|
|
# Requires: smbutil (macOS) or smbclient (Linux)
|
|
|
|
set -e
|
|
|
|
SMB_SERVER="127.0.0.1"
|
|
SMB_PORT="4445"
|
|
SMB_SHARE="markbase"
|
|
SMB_USER="demo"
|
|
SMB_PASS="demo123"
|
|
TEST_DIR="/tmp/smb_benchmark"
|
|
|
|
# Colors
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
NC='\033[0m'
|
|
|
|
echo "================================================"
|
|
echo "SMB Performance Benchmark"
|
|
echo "================================================"
|
|
echo ""
|
|
|
|
# Check SMB server is running
|
|
echo "Checking SMB server status..."
|
|
if ! nc -z $SMB_SERVER $SMB_PORT 2>/dev/null; then
|
|
echo "${RED}ERROR: SMB server not running on port $SMB_PORT${NC}"
|
|
echo "${YELLOW}Start SMB server first:${NC}"
|
|
echo " cargo run --bin markbase-core --features smb-server -- smb-start --port $SMB_PORT --share-name $SMB_SHARE --root /tmp/smb_test --user $SMB_USER:$SMB_PASS"
|
|
exit 1
|
|
fi
|
|
echo "${GREEN}SMB server is running${NC}"
|
|
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 ""
|
|
|
|
# Detect OS and choose SMB client
|
|
OS=$(uname -s)
|
|
if [ "$OS" = "Darwin" ]; then
|
|
SMB_CLIENT="smbutil"
|
|
SMB_MOUNT="/Volumes/smb_benchmark"
|
|
else
|
|
SMB_CLIENT="smbclient"
|
|
fi
|
|
|
|
echo "Using SMB client: $SMB_CLIENT (OS: $OS)"
|
|
echo ""
|
|
|
|
# macOS smbutil tests
|
|
if [ "$OS" = "Darwin" ]; then
|
|
echo "=== Test 1: SMB Share Status ==="
|
|
smbutil statshares -a 2>/dev/null || echo "${YELLOW}No active SMB shares${NC}"
|
|
echo ""
|
|
|
|
echo "=== Test 2: SMB Share View ==="
|
|
START=$(date +%s.%N)
|
|
smbutil view "//$SMB_USER@$SMB_SERVER" -g "$SMB_PASS" 2>/dev/null || echo "${YELLOW}Share view failed (expected on custom port)${NC}"
|
|
END=$(date +%s.%N)
|
|
ELAPSED=$(echo "$END - $START" | bc)
|
|
echo "${GREEN}Share view: ${ELAPSED}s${NC}"
|
|
echo ""
|
|
|
|
echo "=== Test 3: SMB Mount ==="
|
|
# Note: macOS smbutil doesn't support custom port, need mount_smbfs
|
|
echo "${YELLOW}mount_smbfs requires standard port 445${NC}"
|
|
echo "${YELLOW}Testing with smbutil instead${NC}"
|
|
echo ""
|
|
|
|
echo "=== Test 4: SMB Tree Connect ==="
|
|
# Test tree connect via smbutil
|
|
START=$(date +%s.%N)
|
|
smbutil tree "//$SMB_SERVER/$SMB_SHARE" -g "$SMB_PASS" -u "$SMB_USER" 2>/dev/null || echo "${YELLOW}Tree connect failed (expected on custom port)${NC}"
|
|
END=$(date +%s.%N)
|
|
ELAPSED=$(echo "$END - $START" | bc)
|
|
echo "${GREEN}Tree connect: ${ELAPSED}s${NC}"
|
|
echo ""
|
|
fi
|
|
|
|
# Linux smbclient tests
|
|
if [ "$OS" = "Linux" ]; then
|
|
echo "=== Test 1: SMB Share Listing ==="
|
|
START=$(date +%s.%N)
|
|
smbclient -L "$SMB_SERVER" -U "$SMB_USER%$SMB_PASS" -p $SMB_PORT 2>/dev/null || echo "${YELLOW}Share listing failed${NC}"
|
|
END=$(date +%s.%N)
|
|
ELAPSED=$(echo "$END - $START" | bc)
|
|
echo "${GREEN}Share listing: ${ELAPSED}s${NC}"
|
|
echo ""
|
|
|
|
echo "=== Test 2: SMB Directory Listing ==="
|
|
START=$(date +%s.%N)
|
|
smbclient "//$SMB_SERVER/$SMB_SHARE" -U "$SMB_USER%$SMB_PASS" -p $SMB_PORT -c "ls" 2>/dev/null || echo "${YELLOW}Directory listing failed${NC}"
|
|
END=$(date +%s.%N)
|
|
ELAPSED=$(echo "$END - $START" | bc)
|
|
echo "${GREEN}Directory listing: ${ELAPSED}s${NC}"
|
|
echo ""
|
|
|
|
echo "=== Test 3: SMB Upload 1MB ==="
|
|
START=$(date +%s.%N)
|
|
smbclient "//$SMB_SERVER/$SMB_SHARE" -U "$SMB_USER%$SMB_PASS" -p $SMB_PORT -c "put file_1mb.bin" 2>/dev/null || echo "${YELLOW}Upload failed${NC}"
|
|
END=$(date +%s.%N)
|
|
ELAPSED=$(echo "$END - $START" | bc)
|
|
SPEED=$(echo "1 / $ELAPSED" | bc)
|
|
echo "${GREEN}Upload 1MB: ${ELAPSED}s (${SPEED} MB/s)${NC}"
|
|
echo ""
|
|
|
|
echo "=== Test 4: SMB Upload 10MB ==="
|
|
START=$(date +%s.%N)
|
|
smbclient "//$SMB_SERVER/$SMB_SHARE" -U "$SMB_USER%$SMB_PASS" -p $SMB_PORT -c "put file_10mb.bin" 2>/dev/null || echo "${YELLOW}Upload failed${NC}"
|
|
END=$(date +%s.%N)
|
|
ELAPSED=$(echo "$END - $START" | bc)
|
|
SPEED=$(echo "10 / $ELAPSED" | bc)
|
|
echo "${GREEN}Upload 10MB: ${ELAPSED}s (${SPEED} MB/s)${NC}"
|
|
echo ""
|
|
|
|
echo "=== Test 5: SMB Upload 100MB ==="
|
|
START=$(date +%s.%N)
|
|
smbclient "//$SMB_SERVER/$SMB_SHARE" -U "$SMB_USER%$SMB_PASS" -p $SMB_PORT -c "put file_100mb.bin" 2>/dev/null || echo "${YELLOW}Upload failed${NC}"
|
|
END=$(date +%s.%N)
|
|
ELAPSED=$(echo "$END - $START" | bc)
|
|
SPEED=$(echo "100 / $ELAPSED" | bc)
|
|
echo "${GREEN}Upload 100MB: ${ELAPSED}s (${SPEED} MB/s)${NC}"
|
|
echo ""
|
|
|
|
echo "=== Test 6: SMB Download 100MB ==="
|
|
START=$(date +%s.%N)
|
|
smbclient "//$SMB_SERVER/$SMB_SHARE" -U "$SMB_USER%$SMB_PASS" -p $SMB_PORT -c "get file_100mb.bin" 2>/dev/null || echo "${YELLOW}Download failed${NC}"
|
|
END=$(date +%s.%N)
|
|
ELAPSED=$(echo "$END - $START" | bc)
|
|
SPEED=$(echo "100 / $ELAPSED" | bc)
|
|
echo "${GREEN}Download 100MB: ${ELAPSED}s (${SPEED} MB/s)${NC}"
|
|
echo ""
|
|
|
|
echo "=== Test 7: SMB Delete ==="
|
|
START=$(date +%s.%N)
|
|
smbclient "//$SMB_SERVER/$SMB_SHARE" -U "$SMB_USER%$SMB_PASS" -p $SMB_PORT -c "del file_1mb.bin; del file_10mb.bin; del file_100mb.bin" 2>/dev/null || echo "${YELLOW}Delete failed${NC}"
|
|
END=$(date +%s.%N)
|
|
ELAPSED=$(echo "$END - $START" | bc)
|
|
echo "${GREEN}Delete 3 files: ${ELAPSED}s${NC}"
|
|
echo ""
|
|
fi
|
|
|
|
# Cleanup
|
|
cd /
|
|
rm -rf "$TEST_DIR"
|
|
echo "${GREEN}Cleanup complete${NC}"
|
|
|
|
echo ""
|
|
echo "================================================"
|
|
echo "SMB Performance Benchmark Complete"
|
|
echo "================================================"
|
|
echo ""
|
|
echo "${YELLOW}Note: macOS smbutil doesn't support custom ports${NC}"
|
|
echo "${YELLOW}For full SMB testing on macOS, use port 445${NC}"
|
|
echo "${YELLOW}Or use Docker/Linux smbclient${NC}" |