1 pgbench
1.1 介绍
pgbench是PostgreSQL自带的压测工具。
1.2 参数介绍
pgbench --help
点击查看代码
[postgres]$ pgbench --help
pgbench is a benchmarking tool for PostgreSQL.
Usage:
pgbench [OPTION]... [DBNAME]
Initialization options:
-i, --initialize invokes initialization mode
-F, --fillfactor=NUM set fill factor
-n, --no-vacuum do not run VACUUM after initialization
-q, --quiet quiet logging (one message each 5 seconds)
-s, --scale=NUM scaling factor
--foreign-keys create foreign key constraints between tables
--index-tablespace=TABLESPACE
create indexes in the specified tablespace
--tablespace=TABLESPACE create tables in the specified tablespace
--unlogged-tables create tables as unlogged tables
Options to select what to run:
-b, --builtin=NAME[@W] add builtin script NAME weighted at W (default: 1)
(use "-b list" to list available scripts)
-f, --file=FILENAME[@W] add script FILENAME weighted at W (default: 1)
-N, --skip-some-updates skip updates of pgbench_tellers and pgbench_branches
(same as "-b simple-update")
-S, --select-only perform SELECT-only transactions
(same as "-b select-only")
Benchmarking options:
-c, --client=NUM number of concurrent database clients (default: 1)
-C, --connect establish new connection for each transaction
-D, --define=VARNAME=VALUE
define variable for use by custom script
-j, --jobs=NUM number of threads (default: 1)
-l, --log write transaction times to log file
-L, --latency-limit=NUM count transactions lasting more than NUM ms as late
-M, --protocol=simple|extended|prepared
protocol for submitting queries (default: simple)
-n, --no-vacuum do not run VACUUM before tests
-P, --progress=NUM show thread progress report every NUM seconds
-r, --report-latencies report average latency per command
-R, --rate=NUM target rate in transactions per second
-s, --scale=NUM report this scale factor in output
-t, --transactions=NUM number of transactions each client runs (default: 10)
-T, --time=NUM duration of benchmark test in seconds
-v, --vacuum-all vacuum all four standard tables before tests
--aggregate-interval=NUM aggregate data over NUM seconds
--progress-timestamp use Unix epoch timestamps for progress
--sampling-rate=NUM fraction of transactions to log (e.g., 0.01 for 1%)
Common options:
-d, --debug print debugging output
-h, --host=HOSTNAME database server host or socket directory
-p, --port=PORT database server port number
-U, --username=USERNAME connect as specified database user
-V, --version output version information, then exit
-?, --help show this help, then exit
Report bugs to <pgsql-bugs@postgresql.org>.
常用参数:
类型 | 参数 | 说明 |
初始化 | -i, --initialize | 调用初始化模式 |
-F, --fillfactor=NUM | 填充元素个数 | |
-n, --no-vacuum | 初始化后不运行VACUUM | |
-q, --quiet | 记录日志(每5秒记录一条日志) | |
-s, --scale=NUM | 比例因子 | |
--foreign-keys | 创建表之间的外键约束 | |
--index-tablespace=TABLESPACE | 指定索引默认存储表空间 | |
--tablespace=TABLESPACE | 指定表默认存储表空间 | |
--unlogged-tables | 指定创建的表不记录日志 | |
select运行选项 | -b, --builtin=NAME[@W] | 指定运行脚本 |
-f, --file=FILENAME[@W] | 指定运行脚本 | |
-N, --skip-some-updates | 跳过pgbench_tellers和pgbench_branches的更新 | |
-S, --select-only | 只执行select操作 | |
压测选项 | -c, --client=NUM | 指定客户端数量 |
-C, --connect | 为每个事务建立新的连接 | |
-D, --define=VARNAME=VALUE | 定义变量以供自定义脚本使用 | |
-j, --jobs=NUM | 指定线程数 | |
-l, --log | 将事务时间写入日志文件 | |
-L, --latency-limit=NUM | 将持续时间超过M毫秒的事务计数为延迟 | |
-M, --protocol=simple|extended|prepared | 查询的协议(默认:simple) | |
-n, --no-vacuum | 测试前不运行VACUUM操作 | |
-P, --progress=NUM | 指定N秒显示线程进度报告 | |
-r, --report-latencies | 报告每个命令的平均延迟 | |
-R, --rate=NUM | 每秒事务处理的目标速率 | |
-s, --scale=NUM | 在输出中报告这个比例因素 | |
-t, --transactions=NUM | 每个客户端运行的事务数(默认为10) | |
-T, --time=NUM | 基准测试持续时间(以秒为单位) | |
-v, --vacuum-all | 在测试前清空4个标准表 | |
--aggregate-interval=NUM | 指定N秒内聚合数据 | |
--progress-timestamp | 进程使用Unix时间戳 | |
--sampling-rate=NUM | 事务占日志的百分比(例如,1%占0.01) | |
常用选项 | -d, --debug | 输出调试结果 |
-h, --host=HOSTNAME | 数据库主机或socket路径 | |
-p, --port=PORT | 数据库端口 | |
-U, --username=USERNAME | 指定连接数据库用户名 |
1.3 压力测试
初始化(生成4个测试表)
[postgres]$ pgbench -h 127.0.0.1 -p 5432 -U postgres --initialize
Password:
NOTICE: table "pgbench_history" does not exist, skipping
NOTICE: table "pgbench_tellers" does not exist, skipping
NOTICE: table "pgbench_accounts" does not exist, skipping
NOTICE: table "pgbench_branches" does not exist, skipping
creating tables...
100000 of 100000 tuples (100%) done (elapsed 0.02 s, remaining 0.00 s)
vacuum...
set primary keys...
done.
200个客户端,10个线程,将事务写入日志文件,每5秒报告进度,每个客户端100个事务,测试前清空标准的测试表
[postgres]$ pgbench -h 127.0.0.1 -p 5432 -U postgres --client=200 --connect --jobs=10 --log --progress=5 --transactions=100 --vacuum-all
Password:
starting vacuum...end.
starting vacuum pgbench_accounts...end.
progress: 5.0 s, 1217.7 tps, lat 152.132 ms stddev 197.571
progress: 10.0 s, 1025.9 tps, lat 188.665 ms stddev 314.154
progress: 15.0 s, 1185.9 tps, lat 170.930 ms stddev 235.899
transaction type: <builtin: TPC-B (sort of)>
scaling factor: 1
query mode: simple
number of clients: 200
number of threads: 10
number of transactions per client: 100
number of transactions actually processed: 20000/20000
latency average = 157.293 ms
latency stddev = 239.600 ms
tps = 1177.215350 (including connections establishing)
tps = 1189.014326 (excluding connections establishing)
2 sysbench
2.1 介绍
sysbench是一款开源的多线程性能压测工具,可以对CPU、内存、线程、IO、数据库等进行性能压力测试。
2.2 安装
源码安装
[root]# git clone https://github.com/akopytov/sysbench.git
[root]# cd sysbench
[root]# sh autogen.sh
[root]# ./configure --with-pgsql --with-pgsql-includes=/usr/local/pgsql/include --with-pgsql-libs=/usr/local/pgsql/lib --without-mysql
[root]# make && make install
查看sysbench版本
[root]# sysbench --version
sysbench 1.1.0-ead2689
2.3 参数介绍
查看帮助手册
点击查看代码
[root]# sysbench --help
Usage:
sysbench [options]... [testname] [command]
Commands implemented by most tests: prepare run cleanup help
General options:
--threads=N number of threads to use [1]
--events=N limit for total number of events [0]
--time=N limit for total execution time in seconds [10]
--warmup-time=N execute events for this many seconds with statistics disabled before the actual benchmark run with statistics enabled [0]
--forced-shutdown=STRING number of seconds to wait after the --time limit before forcing shutdown, or 'off' to disable [off]
--thread-stack-size=SIZE size of stack per thread [64K]
--thread-init-timeout=N wait time in seconds for worker threads to initialize [30]
--rate=N average transactions rate. 0 for unlimited rate [0]
--report-interval=N periodically report intermediate statistics with a specified interval in seconds. 0 disables intermediate reports [0]
--report-checkpoints=[LIST,...] dump full statistics and reset all counters at specified points in time. The argument is a list of comma-separated values representing the amount of time in seconds elapsed from start of test when report checkpoint(s) must be performed. Report checkpoints are off by default. []
--debug[=on|off] print more debugging info [off]
--validate[=on|off] perform validation checks where possible [off]
--help[=on|off] print help and exit [off]
--version[=on|off] print version and exit [off]
--config-file=FILENAME File containing command line options
--luajit-cmd=STRING perform LuaJIT control command. This option is equivalent to 'luajit -j'. See LuaJIT documentation for more information
Pseudo-Random Numbers Generator options:
--rand-type=STRING random numbers distribution {uniform, gaussian, pareto, zipfian} to use by default [uniform]
--rand-seed=N seed for random number generator. When 0, the current time is used as an RNG seed. [0]
--rand-pareto-h=N shape parameter for the Pareto distribution [0.2]
--rand-zipfian-exp=N shape parameter (exponent, theta) for the Zipfian distribution [0.8]
Log options:
--verbosity=N verbosity level {5 - debug, 0 - only critical messages} [3]
--percentile=N percentile to calculate in latency statistics (1-100). Use the special value of 0 to disable percentile calculations [95]
--histogram[=on|off] print latency histogram in report [off]
General database options:
--db-driver=STRING specifies database driver to use ('help' to get list of available drivers)
--db-ps-mode=STRING prepared statements usage mode {auto, disable} [auto]
--db-debug[=on|off] print database-specific debug information [off]
Compiled-in database drivers:
pgsql - PostgreSQL driver
pgsql options:
--pgsql-host=STRING PostgreSQL server host [localhost]
--pgsql-port=N PostgreSQL server port [5432]
--pgsql-user=STRING PostgreSQL user [sbtest]
--pgsql-password=STRING PostgreSQL password []
--pgsql-db=STRING PostgreSQL database name [sbtest]
Compiled-in tests:
fileio - File I/O test
cpu - CPU performance test
memory - Memory functions speed test
threads - Threads subsystem performance test
mutex - Mutex performance test
See 'sysbench <testname> help' for a list of options for each test.
常用参数:
类型 | 参数 | 说明 |
一般参数 | --threads=N | 指定线程数量(默认是1) |
--events=N | 指定总事件数(默认0) | |
--time=N | 指定压测运行时间(默认是10秒) | |
--warmup-time=N | 在启用统计信息的情况下运行实际基准测试之前,在禁用统计信息的情况下执行这一秒的事件(默认0) | |
--forced-shutdown=STRING | --time参数之后,指定是否强制关机(默认off) | |
--thread-stack-size=SIZE | 每个线程的堆栈大小(默认64K) | |
--thread-init-timeout=N | 以秒为单位的工作线程初始化的等待时间(默认30秒) | |
--rate=N | 平均事务率。0表示无限利率(默认0) | |
--report-interval=N | 以秒为单位,定期报告中间统计信息。0禁用中间报告(默认0) | |
--report-checkpoints=[LIST,...] | 转储全部统计数据并在指定的时间点重置所有计数器。该参数是一个以逗号分隔的值列表,表示从测试开始到必须执行报告检查点时所经过的时间(以秒为单位)。默认情况下,报告检查点是关闭的。 | |
--debug[=on|off] | 打印更多调试信息(默认off) | |
--validate[=on|off] | 在可能的情况下执行验证检查(off) | |
--help[=on|off] | 打印帮助并退出(默认off) | |
--version[=on|off] | 打印版本并退出(默认off) | |
--config-file=FILENAME | 包含命令行选项的文件 | |
伪随机数生成器选项 | --rand-type=STRING | 默认使用随机数分布{uniform, gaussian, pareto, zipfian}(默认uniform) |
--rand-seed=N | 随机数生成器的种子。当为0时,当前时间被用作RNG种子。 | |
--rand-pareto-h=N | 形状参数的帕累托分布(默认0.2) | |
--rand-zipfian-exp=N | 形状参数(exponent, theta)为Zipfian分布(默认0.8) | |
LOG选项 | --verbosity=N | 日志详细级别{5 - debug, 0 - only critical messages}(默认3) |
--percentile=N | 在延迟统计中要计算的百分比(1-100)。使用特殊值0禁用百分比计算(默认95) | |
--histogram[=on|off] | 在报告中打印延迟直方图(默认off) | |
数据库选项 | --db-driver=STRING | 指定要使用的数据库驱动程序 |
--db-ps-mode=STRING | 预置语句使用模式{auto, disable}(默认auto) | |
--db-debug[=on|off] | 打印特定于数据库的调试信息(默认off) | |
数据库驱动 | pgsql | PostgreSQL数据库驱动 |
pgsql选项 | --pgsql-host=STRING | 连接PostgreSQL的主机(默认是localhost) |
--pgsql-port=N | 连接PostgreSQL的服务端口(默认是5432) | |
--pgsql-user=STRING | 连接PostgreSQL的用户(默认是sbtest) | |
--pgsql-password=STRING | 连接PostgreSQL的用户密码 | |
--pgsql-db=STRING | 连接PostgreSQL的数据库名称(默认是sbtest) | |
其他 | fileio | 文件系统I/O测试 |
cpu | CPU性能测试 | |
memory | 内存功能速度测试 | |
threads | 线程子系统性能测试 | |
mutex | 互斥锁的性能测试 |
2.4 压力测试
提示:
在sysbench/src/lua路径有十几种压测脚本,应根据压测目的选择对应的压测脚本。
select_random_ranges.lua
select_random_points.lua
prime-test.lua
oltp_write_only.lua
oltp_update_non_index.lua
oltp_update_index.lua
oltp_read_write.lua
oltp_read_only.lua
oltp_point_select.lua
oltp_insert.lua
oltp_delete.lua
oltp_common.lua
empty-test.lua
bulk_insert.lua
准备数据
创建10张测试表,每张表100万行
[postgres]$ sysbench /home/postgres/sysbench/src/lua/oltp_insert.lua \
--db-driver=pgsql \
--pgsql-host=127.0.0.1 \
--pgsql-port=5432 \
--pgsql-user=postgres \
--pgsql-password=Passwd@123 \
--pgsql-db=postgres \
--tables=10 \
--table-size=1000000 \
prepare
sysbench 1.1.0-ead2689 (using bundled LuaJIT 2.1.0-beta3)
Creating table 'sbtest1'...
Inserting 1000000 records into 'sbtest1'
Creating a secondary index on 'sbtest1'...
Creating table 'sbtest2'...
Inserting 1000000 records into 'sbtest2'
Creating a secondary index on 'sbtest2'...
Creating table 'sbtest3'...
Inserting 1000000 records into 'sbtest3'
Creating a secondary index on 'sbtest3'...
Creating table 'sbtest4'...
Inserting 1000000 records into 'sbtest4'
Creating a secondary index on 'sbtest4'...
Creating table 'sbtest5'...
Inserting 1000000 records into 'sbtest5'
Creating a secondary index on 'sbtest5'...
Creating table 'sbtest6'...
Inserting 1000000 records into 'sbtest6'
Creating a secondary index on 'sbtest6'...
Creating table 'sbtest7'...
Inserting 1000000 records into 'sbtest7'
Creating a secondary index on 'sbtest7'...
Creating table 'sbtest8'...
Inserting 1000000 records into 'sbtest8'
Creating a secondary index on 'sbtest8'...
Creating table 'sbtest9'...
Inserting 1000000 records into 'sbtest9'
Creating a secondary index on 'sbtest9'...
Creating table 'sbtest10'...
Inserting 1000000 records into 'sbtest10'
Creating a secondary index on 'sbtest10'...
压力测试
10张测试表,每张表100万行,每5秒打印测试结果,100个线程,总运行100秒
[root]$ sysbench /home/postgres/sysbench/src/lua/oltp_insert.lua \
--db-driver=pgsql \
--pgsql-host=127.0.0.1 \
--pgsql-port=5432 \
--pgsql-user=postgres \
--pgsql-password=Passwd@123 \
--pgsql-db=postgres \
--tables=10 \
--table-size=1000000 \
--report-interval=5 \
--threads=100 \
--time=60 \
run
sysbench 1.1.0-ead2689 (using bundled LuaJIT 2.1.0-beta3)
Running the test with following options:
Number of threads: 100
Report intermediate results every 5 second(s)
Initializing random number generator from current time
Initializing worker threads...
Threads started!
[ 5s ] thds: 100 tps: 74693.84 qps: 74693.84 (r/w/o: 0.00/74693.84/0.00) lat (ms,95%): 3.96 err/s: 0.00 reconn/s: 0.00
[ 10s ] thds: 100 tps: 77222.15 qps: 77222.15 (r/w/o: 0.00/77222.15/0.00) lat (ms,95%): 3.89 err/s: 0.00 reconn/s: 0.00
[ 15s ] thds: 100 tps: 76497.68 qps: 76497.68 (r/w/o: 0.00/76497.68/0.00) lat (ms,95%): 3.89 err/s: 0.00 reconn/s: 0.00
[ 20s ] thds: 100 tps: 78223.86 qps: 78223.86 (r/w/o: 0.00/78223.86/0.00) lat (ms,95%): 3.68 err/s: 0.00 reconn/s: 0.00
[ 25s ] thds: 100 tps: 77842.72 qps: 77842.92 (r/w/o: 0.00/77842.92/0.00) lat (ms,95%): 3.89 err/s: 0.00 reconn/s: 0.00
[ 30s ] thds: 100 tps: 77398.63 qps: 77398.43 (r/w/o: 0.00/77398.43/0.00) lat (ms,95%): 3.82 err/s: 0.00 reconn/s: 0.00
[ 35s ] thds: 100 tps: 72489.04 qps: 72489.04 (r/w/o: 0.00/72489.04/0.00) lat (ms,95%): 3.96 err/s: 0.00 reconn/s: 0.00
[ 40s ] thds: 100 tps: 76023.09 qps: 76023.09 (r/w/o: 0.00/76023.09/0.00) lat (ms,95%): 3.82 err/s: 0.00 reconn/s: 0.00
[ 45s ] thds: 100 tps: 75742.57 qps: 75742.57 (r/w/o: 0.00/75742.57/0.00) lat (ms,95%): 3.82 err/s: 0.00 reconn/s: 0.00
[ 50s ] thds: 100 tps: 75072.73 qps: 75072.73 (r/w/o: 0.00/75072.73/0.00) lat (ms,95%): 3.82 err/s: 0.00 reconn/s: 0.00
[ 55s ] thds: 100 tps: 75156.60 qps: 75156.80 (r/w/o: 0.00/75156.80/0.00) lat (ms,95%): 3.89 err/s: 0.00 reconn/s: 0.00
[ 60s ] thds: 100 tps: 73926.29 qps: 73926.09 (r/w/o: 0.00/73926.09/0.00) lat (ms,95%): 3.89 err/s: 0.00 reconn/s: 0.00
SQL statistics:
queries performed:
read: 0
write: 4551688
other: 0
total: 4551688
transactions: 4551688 (75831.07 per sec.)
queries: 4551688 (75831.07 per sec.)
ignored errors: 0 (0.00 per sec.)
reconnects: 0 (0.00 per sec.)
Throughput:
events/s (eps): 75831.0714
time elapsed: 60.0240s
total number of events: 4551688
Latency (ms):
min: 0.09
avg: 1.32
max: 47.33
95th percentile: 3.89
sum: 5990512.42
Threads fairness:
events (avg/stddev): 45516.8800/281.21
execution time (avg/stddev): 59.9051/0.01
清除压测数据
[root]$ sysbench /home/postgres/sysbench/src/lua/oltp_insert.lua \
--db-driver=pgsql \
--pgsql-host=127.0.0.1 \
--pgsql-port=5432 \
--pgsql-user=postgres \
--pgsql-password=Passwd@123 \
--pgsql-db=postgres \
--tables=10 \
cleanup
sysbench 1.1.0-ead2689 (using bundled LuaJIT 2.1.0-beta3)
Dropping table 'sbtest1'...
Dropping table 'sbtest2'...
Dropping table 'sbtest3'...
Dropping table 'sbtest4'...
Dropping table 'sbtest5'...
Dropping table 'sbtest6'...
Dropping table 'sbtest7'...
Dropping table 'sbtest8'...
Dropping table 'sbtest9'...
Dropping table 'sbtest10'...
作者:高&玉