postgres hook 测试成功

This commit is contained in:
2026-03-13 01:59:05 +00:00
parent a153ca5040
commit 544f532bf5
53 changed files with 5964 additions and 1674 deletions

77
scripts/do_pgbecnh.md Normal file
View File

@@ -0,0 +1,77 @@
```shell
# 1. 安装 PostgreSQL 和 pgbench
sudo apt-get update
sudo apt-get install -y postgresql postgresql-contrib
# 2. 找到 postgresql.confUbuntu 通常在这个目录)
ls /etc/postgresql/*/main/postgresql.conf
# 3. 配置禁用 mmap编辑 postgresql.conf
shared_memory_type = sysv
dynamic_shared_memory_type = sysv
# 4. 重启 PostgreSQL
sudo systemctl stop postgresql
rm -rf /home/lian/pg/pgdata
rm -rf /zvfs/pg_ts_bench
sudo chown -R postgres:postgres /home/lian/pg
sudo -u postgres mkdir -p /home/lian/pg/pgdata
sudo chown -R postgres:postgres /home/lian/pg/pgdata
sudo -u postgres env LD_PRELOAD=/home/lian/try/zvfs/src/libzvfs.so \
/usr/lib/postgresql/12/bin/initdb -D /home/lian/pg/pgdata
cp ./postgresql.conf /home/lian/pg/pgdata/
sudo -u postgres env LD_PRELOAD=/home/lian/try/zvfs/src/libzvfs.so \
/usr/lib/postgresql/12/bin/pg_ctl -D /home/lian/pg/pgdata -l /tmp/pg.log start
sudo -u postgres env LD_PRELOAD=/home/lian/try/zvfs/src/libzvfs.so \
/usr/lib/postgresql/12/bin/psql
sudo -u postgres env LD_PRELOAD=/home/lian/try/zvfs/src/libzvfs.so \
/usr/lib/postgresql/12/bin/pg_ctl -D /home/lian/pg/pgdata -l /tmp/pg.log restart
# 创建测试环境
sudo -u postgres mkdir -p /zvfs/pg_ts_bench
sudo chown -R postgres:postgres /zvfs/pg_ts_bench
sudo chmod 700 /zvfs/pg_ts_bench
CREATE TABLESPACE zvfs_ts LOCATION '/zvfs/pg_ts_bench';
DROP DATABASE IF EXISTS benchdb;
CREATE DATABASE benchdb TABLESPACE zvfs_ts;
DROP TABLE IF EXISTS hook_probe;
CREATE TABLE hook_probe(id int) TABLESPACE zvfs_ts;
INSERT INTO hook_probe VALUES (1);
INSERT INTO hook_probe VALUES (2);
INSERT INTO hook_probe VALUES (3);
INSERT INTO hook_probe VALUES (4);
SELECT * FROM hook_probe;
DELETE FROM hook_probe WHERE id = 1;
UPDATE hook_probe SET id = 11 WHERE id = 2;
SELECT * FROM hook_probe;
# 5. 验证配置生效
pid=$(pgrep -u postgres -xo postgres)
echo "pid=$pid"
sudo grep libzvfs /proc/$pid/maps
sudo -u postgres psql -p 5432 -c "show data_directory;"
sudo -u postgres psql -c "SHOW shared_memory_type;"
sudo -u postgres psql -c "SHOW dynamic_shared_memory_type;"
# 6. 创建测试库(如未创建)
sudo -u postgres createdb benchdb
# 7. 运行你的 bench 脚本
bash /home/lian/try/zvfs/scripts/run_pgbench_no_mmap.sh
```

View File

@@ -21,7 +21,7 @@ BENCHMARKS="fillrandom,readrandom"
# key数
# NUM=1000000
NUM=50000
NUM=500
# 线程数
THREADS=2

91
scripts/run_pgbench_no_mmap.sh Executable file
View File

@@ -0,0 +1,91 @@
#!/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}"

4
scripts/search_libzvfs.sh Executable file
View File

@@ -0,0 +1,4 @@
pgrep -u postgres -x postgres | while read p; do
echo "PID=$p"
sudo grep -m1 libzvfs /proc/$p/maps || echo " (no libzvfs)"
done