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:
houseme
2026-05-19 18:20:24 +08:00
committed by GitHub
parent f695870626
commit 25c6bdf490
16 changed files with 1059 additions and 177 deletions
@@ -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
+26
View File
@@ -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