mirror of
https://github.com/rustfs/rustfs.git
synced 2026-08-05 12:57:42 +00:00
perf(filemeta): phase-1~3 rename_data metadata optimization (#3011)
* chore(perf): harden amd64 profiling benchmark flow * fix(profiling): isolate bench buckets and map protobuf conflict * perf: avoid blocking owned local writes * style: format profile admin handler * docs: clarify observability trace validation * perf: reduce mkdir overhead on local writes * perf: add rename_data meta microbenchmark * perf(filemeta): fast-path data_dir decode in version meta * perf(filemeta): collapse data-dir lookup into one scan * perf(filemeta): reduce scan allocs and refresh meta bench * perf(ecstore): skip mkdir path on read-only open * perf(filemeta): single-pass unshared data-dir scan * perf(filemeta): add two-key inline remove fast path * perf(filemeta): compare remove-two keys by bytes first * bench(ecstore): add remove_two-only micro benchmark * bench(ecstore): stabilize rename_data meta benchmark timing * bench(ecstore): align rename_data path with remove_two * perf(filemeta): avoid uuid string alloc in remove_two * perf(filemeta): add fast-path for empty inline data * perf(filemeta): streamline add_version match branch * perf(filemeta): fast-return remove_key on miss * perf(filemeta): speed up add_version insertion lookup * style(ecstore): normalize formatting in perf-tuning files * refactor(filemeta): unify inline data removal paths
This commit is contained in:
@@ -13,9 +13,11 @@ RUN_BENCHMARK="${RUN_BENCHMARK:-true}"
|
||||
KEEP_UP="${KEEP_UP:-false}"
|
||||
PRECHECK_AUTO_CLEANUP="${PRECHECK_AUTO_CLEANUP:-true}"
|
||||
WAIT_PROBE_MODE="${WAIT_PROBE_MODE:-service}"
|
||||
COMPOSE_UP_NO_BUILD="${COMPOSE_UP_NO_BUILD:-false}"
|
||||
|
||||
RUSTFS_ACCESS_KEY="${RUSTFS_ACCESS_KEY:-rustfs-cluster-admin}"
|
||||
RUSTFS_SECRET_KEY="${RUSTFS_SECRET_KEY:-rustfs-cluster-secret}"
|
||||
RUSTFS_DOCKER_PLATFORM="${RUSTFS_DOCKER_PLATFORM:-}"
|
||||
RUSTFS_OBS_ENDPOINT="${RUSTFS_OBS_ENDPOINT:-}"
|
||||
RUSTFS_UNSAFE_BYPASS_DISK_CHECK="${RUSTFS_UNSAFE_BYPASS_DISK_CHECK:-true}"
|
||||
|
||||
@@ -29,6 +31,8 @@ BENCH_WAIT_MODE="${BENCH_WAIT_MODE:-ready}"
|
||||
|
||||
BENCH_ENDPOINT="${BENCH_ENDPOINT:-http://127.0.0.1:9000}"
|
||||
BENCH_BUCKET="${BENCH_BUCKET:-rustfs-four-node-bench}"
|
||||
BENCH_AUTO_NEW_BUCKET="${BENCH_AUTO_NEW_BUCKET:-true}"
|
||||
BENCH_BUCKET_PREFIX="${BENCH_BUCKET_PREFIX:-rustfs-four-node-bench}"
|
||||
BENCH_CONCURRENCY="${BENCH_CONCURRENCY:-}"
|
||||
BENCH_CONCURRENCIES="${BENCH_CONCURRENCIES:-}"
|
||||
BENCH_DURATION="${BENCH_DURATION:-60s}"
|
||||
@@ -65,6 +69,7 @@ Options:
|
||||
Environment:
|
||||
CLUSTER_COMPOSE OBS_COMPOSE PROJECT_NAME IMAGE_TAG
|
||||
WITH_OBSERVABILITY BUILD_LOCAL_IMAGE RUN_FAILOVER RUN_BENCHMARK KEEP_UP
|
||||
COMPOSE_UP_NO_BUILD (true|false, default: false)
|
||||
RUSTFS_ACCESS_KEY RUSTFS_SECRET_KEY RUSTFS_OBS_ENDPOINT
|
||||
PRECHECK_AUTO_CLEANUP (true|false, default: true)
|
||||
WAIT_PROBE_MODE (service|ready, default: service)
|
||||
@@ -73,6 +78,8 @@ Environment:
|
||||
BENCH_CONCURRENCIES BENCH_DURATION BENCH_SIZES OUT_DIR
|
||||
BENCH_WAIT_MODE (ready|service, default: ready)
|
||||
BENCH_READY_TIMEOUT_SECS (default: 180)
|
||||
BENCH_AUTO_NEW_BUCKET (true|false, default: true)
|
||||
BENCH_BUCKET_PREFIX (default: rustfs-four-node-bench)
|
||||
USAGE
|
||||
}
|
||||
|
||||
@@ -543,6 +550,8 @@ run_benchmark() {
|
||||
local bench_out_dir
|
||||
local conc
|
||||
local conc_dir
|
||||
local bench_bucket
|
||||
local -a bench_extra_args=()
|
||||
bench_out_dir="${OUT_DIR}/benchmark"
|
||||
mkdir -p "${bench_out_dir}"
|
||||
|
||||
@@ -551,6 +560,11 @@ run_benchmark() {
|
||||
exit 1
|
||||
fi
|
||||
|
||||
bench_bucket="${BENCH_BUCKET}"
|
||||
if [[ "${BENCH_AUTO_NEW_BUCKET}" == "true" ]]; then
|
||||
bench_extra_args+=(--auto-new-bucket)
|
||||
fi
|
||||
|
||||
log_info "Waiting for benchmark endpoint readiness (mode=${BENCH_WAIT_MODE})"
|
||||
wait_bench_endpoint_ready
|
||||
|
||||
@@ -574,7 +588,9 @@ run_benchmark() {
|
||||
--endpoint "${BENCH_ENDPOINT}" \
|
||||
--access-key "${RUSTFS_ACCESS_KEY}" \
|
||||
--secret-key "${RUSTFS_SECRET_KEY}" \
|
||||
--bucket "${BENCH_BUCKET}" \
|
||||
--bucket "${bench_bucket}" \
|
||||
--bucket-prefix "${BENCH_BUCKET_PREFIX}" \
|
||||
"${bench_extra_args[@]}" \
|
||||
--concurrency "${conc}" \
|
||||
--duration "${BENCH_DURATION}" \
|
||||
--sizes "${BENCH_SIZES}" \
|
||||
@@ -690,6 +706,8 @@ main() {
|
||||
resolve_bool "RUN_FAILOVER" "${RUN_FAILOVER}"
|
||||
resolve_bool "RUN_BENCHMARK" "${RUN_BENCHMARK}"
|
||||
resolve_bool "KEEP_UP" "${KEEP_UP}"
|
||||
resolve_bool "COMPOSE_UP_NO_BUILD" "${COMPOSE_UP_NO_BUILD}"
|
||||
resolve_bool "BENCH_AUTO_NEW_BUCKET" "${BENCH_AUTO_NEW_BUCKET}"
|
||||
resolve_bool "PRECHECK_AUTO_CLEANUP" "${PRECHECK_AUTO_CLEANUP}"
|
||||
resolve_probe_mode
|
||||
resolve_bench_wait_mode
|
||||
@@ -731,7 +749,12 @@ main() {
|
||||
|
||||
if [[ "${BUILD_LOCAL_IMAGE}" == "true" ]]; then
|
||||
log_info "Building local image from Dockerfile.source: ${IMAGE_TAG}"
|
||||
docker build -f "${PROJECT_ROOT}/Dockerfile.source" -t "${IMAGE_TAG}" "${PROJECT_ROOT}"
|
||||
if [[ -n "${RUSTFS_DOCKER_PLATFORM}" ]]; then
|
||||
log_info "Using docker build platform: ${RUSTFS_DOCKER_PLATFORM}"
|
||||
docker build --platform "${RUSTFS_DOCKER_PLATFORM}" -f "${PROJECT_ROOT}/Dockerfile.source" -t "${IMAGE_TAG}" "${PROJECT_ROOT}"
|
||||
else
|
||||
docker build -f "${PROJECT_ROOT}/Dockerfile.source" -t "${IMAGE_TAG}" "${PROJECT_ROOT}"
|
||||
fi
|
||||
else
|
||||
log_info "Skipping image build"
|
||||
fi
|
||||
@@ -739,7 +762,11 @@ main() {
|
||||
run_precheck_after_build
|
||||
|
||||
log_info "Starting compose stack"
|
||||
compose up -d
|
||||
if [[ "${COMPOSE_UP_NO_BUILD}" == "true" ]]; then
|
||||
compose up -d --no-build
|
||||
else
|
||||
compose up -d
|
||||
fi
|
||||
|
||||
log_info "Waiting for 4-node cluster readiness (mode=${WAIT_PROBE_MODE})"
|
||||
wait_cluster_ready
|
||||
|
||||
@@ -11,6 +11,8 @@ ENDPOINT=""
|
||||
ACCESS_KEY=""
|
||||
SECRET_KEY=""
|
||||
BUCKET="rustfs-bench"
|
||||
AUTO_NEW_BUCKET=false
|
||||
BUCKET_PREFIX="rustfs-bench"
|
||||
REGION="us-east-1"
|
||||
CONCURRENCY=128
|
||||
DURATION="60s"
|
||||
@@ -38,6 +40,8 @@ Required:
|
||||
|
||||
Optional:
|
||||
--bucket Bucket name (default: rustfs-bench)
|
||||
--auto-new-bucket Auto-generate a unique bucket for this run
|
||||
--bucket-prefix Prefix used with --auto-new-bucket (default: rustfs-bench)
|
||||
--region Region (default: us-east-1)
|
||||
--concurrency Concurrency for all sizes (default: 128)
|
||||
--duration warp duration, e.g. 60s/2m (default: 60s)
|
||||
@@ -92,6 +96,8 @@ parse_args() {
|
||||
--access-key) ACCESS_KEY="$2"; shift 2 ;;
|
||||
--secret-key) SECRET_KEY="$2"; shift 2 ;;
|
||||
--bucket) BUCKET="$2"; shift 2 ;;
|
||||
--auto-new-bucket) AUTO_NEW_BUCKET=true; shift ;;
|
||||
--bucket-prefix) BUCKET_PREFIX="$2"; shift 2 ;;
|
||||
--region) REGION="$2"; shift 2 ;;
|
||||
--concurrency) CONCURRENCY="$2"; shift 2 ;;
|
||||
--duration) DURATION="$2"; shift 2 ;;
|
||||
@@ -156,6 +162,15 @@ setup_output() {
|
||||
echo "size,tool,concurrency,status,throughput,requests_per_sec,avg_latency,log_file" > "$SUMMARY_CSV"
|
||||
}
|
||||
|
||||
resolve_bucket() {
|
||||
if [[ "$AUTO_NEW_BUCKET" != "true" ]]; then
|
||||
return
|
||||
fi
|
||||
local suffix
|
||||
suffix="$(date +%Y%m%d%H%M%S)-$RANDOM"
|
||||
BUCKET="${BUCKET_PREFIX}-${suffix}"
|
||||
}
|
||||
|
||||
extract_value() {
|
||||
local pattern="$1"
|
||||
local file="$2"
|
||||
@@ -238,6 +253,14 @@ run_one() {
|
||||
fi
|
||||
fi
|
||||
|
||||
if [[ "$TOOL" == "warp" ]]; then
|
||||
# Warp may still exit with code 0 even when it prints runtime failures.
|
||||
# Treat explicit error lines as failed runs to keep summary.csv reliable.
|
||||
if rg -q 'warp: <ERROR>' "$log_file"; then
|
||||
status="failed"
|
||||
fi
|
||||
fi
|
||||
|
||||
local metrics throughput reqps latency
|
||||
metrics="$(collect_metrics "$log_file")"
|
||||
throughput="$(echo "$metrics" | cut -d',' -f1)"
|
||||
@@ -250,6 +273,7 @@ run_one() {
|
||||
main() {
|
||||
parse_args "$@"
|
||||
validate_args
|
||||
resolve_bucket
|
||||
require_cmd rg
|
||||
if [[ "$TOOL" == "warp" ]]; then
|
||||
require_cmd "$WARP_BIN"
|
||||
@@ -261,8 +285,10 @@ main() {
|
||||
|
||||
echo "Output dir: $OUT_DIR"
|
||||
echo "Tool: $TOOL"
|
||||
echo "Bucket: $BUCKET"
|
||||
echo "Sizes: $SIZES"
|
||||
echo "Concurrency: $CONCURRENCY"
|
||||
echo "$BUCKET" > "$OUT_DIR/bucket.txt"
|
||||
|
||||
IFS=',' read -r -a size_arr <<< "$SIZES"
|
||||
for raw_size in "${size_arr[@]}"; do
|
||||
|
||||
Reference in New Issue
Block a user