本文目录导读:

我来介绍几种Shell脚本中基准测试镜像性能的方法,主要包括拉取速度、构建速度和磁盘性能测试。
拉取速度测试
#!/bin/bash
# 镜像拉取性能测试脚本
test_image_pull() {
local image=$1
local test_count=3
echo "测试镜像: $image"
echo "- 清除已有镜像"
docker rmi $image 2>/dev/null
echo "- 拉取测试..."
for i in $(seq 1 $test_count); do
echo " 测试 #$i"
# 记录开始时间
start_time=$(date +%s%N)
# 拉取镜像
docker pull $image
# 记录结束时间
end_time=$(date +%s%N)
# 计算耗时(毫秒)
duration=$(( (end_time - start_time) / 1000000 ))
# 获取镜像大小
size=$(docker images $image --format "{{.Size}}" | sed 's/GB//;s/MB//')
# 计算速度(如果大小包含GB转换为MB)
if [[ $size == *"GB"* ]]; then
size_mb=$(echo "$size * 1024" | bc)
else
size_mb=$size
fi
speed=$(( size_mb * 1000 / duration ))
echo " 耗时: ${duration}ms"
echo " 大小: ${size_mb}MB"
echo " 速度: ${speed}MB/s"
# 清除镜像以便下次测试
docker rmi $image 2>/dev/null
done
}
# 测试不同镜像
test_image_pull "nginx:latest"
test_image_pull "alpine:latest"
test_image_pull "node:16-alpine"
构建速度测试
#!/bin/bash
# Docker构建性能测试
test_build_performance() {
local test_dir="/tmp/docker_build_test"
echo "测试Docker构建性能..."
# 创建测试文件
mkdir -p $test_dir
cat > $test_dir/Dockerfile << 'EOF'
FROM alpine:3.18
RUN apk add --no-cache curl wget git bash
COPY test.txt /test.txt
RUN echo "Build test" > /test.txt && cat /test.txt
EOF
echo "test content" > $test_dir/test.txt
# 测试不同构建策略
echo "1. 普通构建"
start_time=$(date +%s%N)
docker build -t test-build:latest $test_dir 2>&1 | grep -v "^Step\|^ --->"
end_time=$(date +%s%N)
echo "$(( (end_time - start_time) / 1000000 ))ms"
# 测试缓存
echo "2. 缓存构建"
start_time=$(date +%s%N)
docker build -t test-build:latest $test_dir 2>&1 | grep -v "^Step\|^ --->"
end_time=$(date +%s%N)
echo "$(( (end_time - start_time) / 1000000 ))ms"
# 测试多阶段构建
cat > $test_dir/Dockerfile << 'EOF'
FROM alpine:3.18 AS builder
RUN echo "Building..." > /output.txt
FROM alpine:3.18
COPY --from=builder /output.txt /
CMD ["cat", "/output.txt"]
EOF
echo "3. 多阶段构建"
start_time=$(date +%s%N)
docker build -t test-build:multi $test_dir 2>&1 | grep -v "^Step\|^ --->"
end_time=$(date +%s%N)
echo "$(( (end_time - start_time) / 1000000 ))ms"
# 清理
docker rmi test-build:latest test-build:multi 2>/dev/null
rm -rf $test_dir
}
test_build_performance
综合性能测试脚本
#!/bin/bash
# 完整的镜像性能测试套件
PERFORMANCE_LOG="docker_performance_$(date +%Y%m%d_%H%M%S).log"
log_result() {
echo "$1" >> "$PERFORMANCE_LOG"
echo "$1"
}
# 系统信息
log_result "=== Docker 性能测试报告 ==="
log_result "测试时间: $(date)"
log_result "Docker版本: $(docker version --format '{{.Server.Version}}')"
log_result "系统信息: $(uname -a)"
log_result ""
# 1. 磁盘IO测试
test_disk_io() {
log_result "=== 磁盘IO测试 ==="
# 测试Docker数据目录
docker_root=$(docker info | grep "Docker Root Dir" | awk '{print $4}')
log_result "Docker数据目录: $docker_root"
# 创建测试文件
dd if=/dev/zero of=/tmp/test_write bs=1M count=1024 2>&1 | tail -1
log_result "顺序写入测试完成"
# 使用fio测试(如果安装)
if command -v fio &> /dev/null; then
fio --randrepeat=1 --ioengine=libaio --direct=1 --gtod_reduce=1 \
--name=test --bs=4k --iodepth=64 --size=1G --readwrite=randrw \
--rwmixread=75 --directory=$docker_root 2>&1 | grep "IOPS\|BW="
fi
rm -f /tmp/test_write
}
# 2. 网络延迟测试
test_network_latency() {
log_result "=== 网络延迟测试 ==="
# 测试不同镜像仓库
registries=("docker.io" "registry.hub.docker.com" "gcr.io" "quay.io")
for registry in "${registries[@]}"; do
latency=$(ping -c 3 -q $registry 2>&1 | tail -1 | awk -F'/' '{print $5}')
log_result " $registry: ${latency}ms"
done
}
# 3. 并发拉取测试
test_concurrent_pull() {
log_result "=== 并发拉取测试 ==="
local images=(
"nginx:alpine"
"python:3.11-alpine"
"node:18-alpine"
"alpine:latest"
"busybox:latest"
)
echo "测试同时拉取 ${#images[@]} 个镜像..."
start_time=$(date +%s%N)
# 后台并行拉取
for image in "${images[@]}"; do
(docker pull $image 2>&1) &
done
# 等待所有完成
wait
end_time=$(date +%s%N)
duration=$(( (end_time - start_time) / 1000000 ))
log_result "并发拉取完成: ${duration}ms"
log_result ""
}
# 4. 镜像层缓存测试
test_layer_caching() {
log_result "=== 镜像层缓存测试 ==="
local test_dir="/tmp/docker_layer_test"
mkdir -p $test_dir
# 创建基础Dockerfile
cat > $test_dir/Dockerfile << 'EOF'
FROM alpine:3.18
RUN apk update
RUN apk add nginx
RUN echo "Layer 1" > /layer1.txt
RUN echo "Layer 2" > /layer2.txt
RUN echo "Layer 3" > /layer3.txt
EOF
log_result "初始构建:"
start_time=$(date +%s%N)
docker build -t layer-test:1 $test_dir 2>&1 | grep "Step\|Successfully"
end_time=$(date +%s%N)
log_result " 耗时: $(( (end_time - start_time) / 1000000 ))ms"
# 修改最后一行
sed -i '$d' $test_dir/Dockerfile
echo 'RUN echo "Layer 4" > /layer4.txt' >> $test_dir/Dockerfile
log_result "变更后构建(应使用缓存):"
start_time=$(date +%s%N)
docker build -t layer-test:2 $test_dir 2>&1 | grep "Using cache\|CACHED\|Step\|Successfully"
end_time=$(date +%s%N)
log_result " 耗时: $(( (end_time - start_time) / 1000000 ))ms"
# 清理
docker rmi layer-test:1 layer-test:2 2>/dev/null
rm -rf $test_dir
}
# 5. 生成报告
generate_report() {
log_result "=== 测试总结 ==="
# 计算平均值和统计信息
echo "统计信息生成中..."
log_result "详细报告已保存到: $PERFORMANCE_LOG"
}
# 运行所有测试
main() {
log_result "开始Docker性能测试..."
log_result ""
test_disk_io
test_network_latency
test_concurrent_pull
test_layer_caching
generate_report
log_result ""
log_result "测试完成!"
}
main
实时监控脚本
#!/bin/bash
# 实时监控Docker性能
monitor_docker_performance() {
local interval=1
local duration=${1:-60} # 默认60秒
echo "监控Docker性能 (${duration}秒)..."
echo "时间,CPU%,内存%,磁盘IO(读),磁盘IO(写),网络RX,网络TX"
end_time=$((SECONDS + duration))
while [ $SECONDS -lt $end_time ]; do
timestamp=$(date +%H:%M:%S)
# Docker统计信息
stats=$(docker stats --no-stream --format \
"table {{.CPUPerc}}\t{{.MemPerc}}\t{{.NetIO}}" 2>/dev/null | tail -2)
# 系统IO统计
io_stats=$(iostat -d 1 2 | tail -3 | head -1 | awk '{print $3","$4}')
echo "$timestamp,$stats,$io_stats"
sleep $interval
done
}
monitor_docker_performance 30
使用方法
# 赋予执行权限 chmod +x docker_benchmark.sh # 运行测试 ./docker_benchmark.sh # 查看报告 cat docker_performance_*.log # 实时监控 ./monitor_performance.sh 120 # 监控120秒
这些脚本涵盖了镜像性能测试的主要方面:拉取速度、构建性能、缓存效率、并发处理能力和磁盘IO,可以根据具体需求选择使用或组合测试。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播