Files
zvfs/scripts/run_pgbench_no_mmap.sh
2026-03-13 01:59:05 +00:00

92 lines
3.2 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env bash
set -euo pipefail
# 仅执行 pgbench 的脚本(不安装 PostgreSQL不 initdb不启停服务不改配置
#
# 前提条件:
# 1) PostgreSQL 已经在运行。
# 2) 测试库已经存在(默认 benchdb
# 3) PostgreSQL 已经在外部配置为禁用 mmap 共享内存:
# shared_memory_type = sysv
# dynamic_shared_memory_type = sysv
#
# 关于 Malloc0
# - 当前后端是内存虚拟设备,容量有限。
# - 默认参数故意设置得较小,避免一次灌入过多数据。
#
# 关于 LD_PRELOAD
# - USE_LD_PRELOAD_INIT=1初始化阶段pgbench -i启用 LD_PRELOAD
# - USE_LD_PRELOAD_RUN=1 :压测阶段启用 LD_PRELOAD
# - 设为 0 即可关闭对应阶段的 LD_PRELOAD
#
# 用法:
# bash codex/run_pgbench_no_mmap.sh
#
# 可选环境变量(含义):
# PG_HOST=127.0.0.1
# PostgreSQL 服务器地址。
# PG_PORT=5432
# PostgreSQL 服务器端口(默认改为 5432
# PG_DB=benchdb
# 压测数据库名。
# PG_SCALE=2
# pgbench 初始化规模因子(-s越大初始数据越多。
# PG_TIME=20
# 压测持续时间pgbench -T
# PG_CLIENTS=2
# 并发客户端数pgbench -c
# PG_JOBS=2
# 工作线程数pgbench -j
# PG_SUPERUSER=postgres
# 执行 pgbench 的系统用户(通常是 postgres
# LD_PRELOAD_PATH=/home/lian/try/zvfs/src/libzvfs.so
# LD_PRELOAD 目标库路径(你的 zvfs hook so
# PG_BIN_DIR=/usr/lib/postgresql/16/bin
# pgbench 所在目录;不填时自动从 PATH 查找。
# USE_LD_PRELOAD_INIT=1
# 初始化阶段pgbench -i是否启用 LD_PRELOAD1=启用0=关闭。
# USE_LD_PRELOAD_RUN=1
# 压测阶段是否启用 LD_PRELOAD1=启用0=关闭。
PG_HOST="${PG_HOST:-127.0.0.1}"
PG_PORT="${PG_PORT:-5432}"
PG_DB="${PG_DB:-benchdb}"
PG_SCALE="${PG_SCALE:-2}"
PG_TIME="${PG_TIME:-20}"
PG_CLIENTS="${PG_CLIENTS:-2}"
PG_JOBS="${PG_JOBS:-2}"
PG_SUPERUSER="${PG_SUPERUSER:-postgres}"
LD_PRELOAD_PATH="${LD_PRELOAD_PATH:-/home/lian/try/zvfs/src/libzvfs.so}"
PG_BIN_DIR="${PG_BIN_DIR:-$(dirname "$(command -v pgbench 2>/dev/null || true)")}"
USE_LD_PRELOAD_INIT="${USE_LD_PRELOAD_INIT:-1}"
USE_LD_PRELOAD_RUN="${USE_LD_PRELOAD_RUN:-1}"
if [[ -z "${PG_BIN_DIR}" || ! -x "${PG_BIN_DIR}/pgbench" ]]; then
echo "未找到 pgbench请设置 PG_BIN_DIR 或把 pgbench 放到 PATH 中。" >&2
exit 1
fi
run_pgbench_cmd() {
local use_preload="$1"
shift
if [[ "${use_preload}" == "1" ]]; then
sudo -u "${PG_SUPERUSER}" env LD_PRELOAD="${LD_PRELOAD_PATH}" "$@"
else
sudo -u "${PG_SUPERUSER}" "$@"
fi
}
echo "当前参数:"
echo " host=${PG_HOST} port=${PG_PORT} db=${PG_DB}"
echo " scale=${PG_SCALE} clients=${PG_CLIENTS} jobs=${PG_JOBS} time=${PG_TIME}s"
echo " preload_init=${USE_LD_PRELOAD_INIT} preload_run=${USE_LD_PRELOAD_RUN}"
echo "[1/2] 初始化数据pgbench -i"
run_pgbench_cmd "${USE_LD_PRELOAD_INIT}" \
"${PG_BIN_DIR}/pgbench" -h "${PG_HOST}" -p "${PG_PORT}" -i -s "${PG_SCALE}" "${PG_DB}"
echo "[2/2] 执行压测pgbench -T"
run_pgbench_cmd "${USE_LD_PRELOAD_RUN}" \
"${PG_BIN_DIR}/pgbench" -h "${PG_HOST}" -p "${PG_PORT}" \
-c "${PG_CLIENTS}" -j "${PG_JOBS}" -T "${PG_TIME}" -P 5 "${PG_DB}"