PostgreSQL 通常通过pgbench 来进行压力测试,之前我们也是通过pgbench 来进行postgresql的压力测试,测试的指标变化挺多的,但是结果比较单一。所以对于pgbench的压力测试结果一直是不大满意。
基于后面还要对PostgreSQL的更多的性能指标进行压力测试并获得更多的数据做相关的指导。所以此次就需要通过sysbench来进行压力测试。sysbench默认安装是针对MYSQL 的压测首选,而如果通过他来对pg进行压力测试,还是需要在研究一下。
安装很简单,直接通过官网下载对应的安装脚本
wget https://packagecloud.io/install/repositories/akopytov/sysbench/script.rpm.sh
sbench/script.rpm.sh
然后在有PostgreSQL 变量环境的情况下,执行这个SHELL 脚本,安装sysbnech 软件。整体的可以调用的脚本的位置在如下的目录中
/usr/share/sysbench/tests/include/oltp_legacy
下面是这个目录里面的包含的lua的脚本
-rw-r--r-- 1 root root 1.2K Apr 24 2020 bulk_insert.lua
-rw-r--r-- 1 root root 4.6K Apr 24 2020 common.lua
-rw-r--r-- 1 root root 366 Apr 24 2020 delete.lua
-rw-r--r-- 1 root root 1.2K Apr 24 2020 insert.lua
-rw-r--r-- 1 root root 3.0K Apr 24 2020 oltp.lua
-rw-r--r-- 1 root root 368 Apr 24 2020 oltp_simple.lua
-rw-r--r-- 1 root root 527 Apr 24 2020 parallel_prepare.lua
-rw-r--r-- 1 root root 369 Apr 24 2020 select.lua
-rw-r--r-- 1 root root 1.5K Apr 24 2020 select_random_points.lua
-rw-r--r-- 1 root root 1.6K Apr 24 2020 select_random_ranges.lua
-rw-r--r-- 1 root root 369 Apr 24 2020 update_index.lua
-rw-r--r-- 1 root root 578 Apr 24 2020 update_non_index.lua
在压测前,我们需要注意以下一些配置上的问题
1 确认系统的隔离级别
2 确认wal 日志写入的方式
3 针对 checkpoint 的参数进行确认和调整
4 调整AUTOVACUUM 的参数。
在调整如上的一些数据库的参数,将数据库调整到较优的状态。后面就需要在我们的PG 数据库中灌入测试数据。
在我们灌入数据前,我们先建立测试数据库,和测试账号,数据库,用户,和密码均为 sbtest
sysbench --db-driver=pgsql --pgsql-host=127.0.0.1 --pgsql-port=5432 --pgsql-user=sbtest --pgsql-password=sbtest --pgsql-db=sbtest --oltp-table-size=200000 --oltp-tables-count=10 --rand-init=on --threads=10 --time=30 --events=0 --report-interval=10 --percentile=99 /usr/share/sysbench/tests/include/oltp_legacy/oltp.lua prepare
这里稍微说一下参数的问题
sysbench \
--db-driver=pgsql \ # 针对POSTGRESQL 数据库测试
--pgsql-host=127.0.0.1 \ #连接数据库地址
--pgsql-port=5432 \ #连接数据库端口号
--pgsql-user=sbtest \ #数据库用户,最好具有superuser
--pgsql-password=sbtest \ #密码
--pgsql-db=sbtest \ #数据库名
--oltp-table-size=200000 \ #每个表的数据行数
--oltp-tables-count=10 \ #在一个数据库中有多少表
--rand-init=on \ #数据的随机性是否打开
--threads=10 \ #工作是并行的线程数
--time=30 \ # 测试多长秒数
--events=0 \ #是否对事务执行的数据量进行限制 0 是不限制
--report-interval=10 \ #每10秒产生一次报告
--percentile=99 \ #针对测试数据进行汇总,汇总数据占据总数据的百分比
/usr/share/sysbench/tests/include/oltp_legacy/oltp.lua \ #使用哪个 lua脚本
prepare
其中需要注意的是选择的脚本应该从开始到测试是一致的,不能修改,测试的过程,也主要分为 prepare, run, cleanup
通过sysbench 测试的结果如下,实际上对比pgbench,sysbench 好处有以下几个
1 限定的时间内,可以通过测试可以分析出整体的, 读操作数,写操作数,以及总的操作数。
2 可以分析出每秒处理的事务数,每秒处理得查询数,每秒基于性能产生的操作失误错误的数字
3 可以得到总体的操作的延迟数据,包含最小的,最大的,平均的,和99TH的延迟数
以上的数据对比PGBENCH 的数据可以有更多的对比。
除此以外,对于测试中数据库处理数据的类型也可以有很好的选择,我们可以针对测试中的数据库本身提供如下的测试
1 select 测试包含3种测试,普通 select , 随即查询,范围查询
2 update 测试主要包含索引更新和非索引更新,这对PG 来说是比较重要的一个测试的指标。
3 oltp 普通的测试
4 bulk_insert 数据插入的测试
这也相对于pgbench比较单一的测试方式来说,对于不同类型的业务类型对数据库的产生的性能风险也能进行一定的测试,提早获取一些指标和具有意义的导引。
那么我们简单的用下面的测试实例来说明sysbench 针对PG 的压力测试的有利点在哪里,举一个例子,例如我们的下面的测试中主要针对PG 的数据库
1 PG 在随机查询的性能指标
2 PG 在范围查询的性能指标
实际上我们也测试了non index 和 index update 的性能差距。
可以看到下面的结果,中明显在同样的配置的情况下,PG在查询中的针对不同查询方式的性能反馈是不一样的,通过这样的查询方式可以了解,不同的查询方式对机器性能的损耗,以及我们后期优化的方向
sysbench \
--db-driver=pgsql \
--pgsql-host=127.0.0.1 \
--pgsql-port=5432 \
--pgsql-user=sbtest \
--pgsql-password=sbtest \
--pgsql-db=sbtest \
--oltp-table-size=200000 \
--oltp-tables-count=10 \
--rand-init=on \
--threads=10 --time=30 \
--events=0 \
--report-interval=10 \
--percentile=99 /usr/share/sysbench/tests/include/oltp_legacy/select_random_points.lua \
prepare
sysbench \
--db-driver=pgsql \
--pgsql-host=127.0.0.1 \
--pgsql-port=5432 \
--pgsql-user=sbtest \
--pgsql-password=sbtest \
--pgsql-db=sbtest \
--oltp-table-size=200000 \
--oltp-tables-count=10 \
--rand-init=on \
--threads=10 --time=30 \
--events=0 \
--report-interval=10 \
--percentile=99 /usr/share/sysbench/tests/include/oltp_legacy/select_random_points.lua \
run
sysbench \
--db-driver=pgsql \
--pgsql-host=127.0.0.1 \
--pgsql-port=5432 \
--pgsql-user=sbtest \
--pgsql-password=sbtest \
--pgsql-db=sbtest \
--oltp-table-size=200000 \
--oltp-tables-count=10 \
--rand-init=on \
--threads=10 --time=30 \
--events=0 \
--report-interval=10 \
--percentile=99 /usr/share/sysbench/tests/include/oltp_legacy/select_random_points.lua \
cleanup
[ 10s ] thds: 10 tps: 15955.93 qps: 15955.93 (r/w/o: 15955.93/0.00/0.00) lat (ms,99%): 2.71 err/s: 0.00 reconn/s: 0.00
[ 20s ] thds: 10 tps: 16033.47 qps: 16033.47 (r/w/o: 16033.47/0.00/0.00) lat (ms,99%): 2.66 err/s: 0.00 reconn/s: 0.00
[ 30s ] thds: 10 tps: 16145.02 qps: 16145.02 (r/w/o: 16145.02/0.00/0.00) lat (ms,99%): 2.66 err/s: 0.00 reconn/s: 0.00
SQL statistics:
queries performed:
read: 481380
write: 0
other: 0
total: 481380
transactions: 481380 (16042.84 per sec.)
queries: 481380 (16042.84 per sec.)
ignored errors: 0 (0.00 per sec.)
reconnects: 0 (0.00 per sec.)
General statistics:
total time: 30.0046s
total number of events: 481380
Latency (ms):
min: 0.10
avg: 0.62
max: 28.89
99th percentile: 2.66
sum: 299448.61
Threads fairness:
events (avg/stddev): 48138.0000/14694.89
execution time (avg/stddev): 29.9449/0.02
sysbench \
--db-driver=pgsql \
--pgsql-host=127.0.0.1 \
--pgsql-port=5432 \
--pgsql-user=sbtest \
--pgsql-password=sbtest \
--pgsql-db=sbtest \
--oltp-table-size=200000 \
--oltp-tables-count=10 \
--rand-init=on \
--threads=10 --time=30 \
--events=0 \
--report-interval=10 \
--percentile=99 /usr/share/sysbench/tests/include/oltp_legacy/select_random_ranges.lua \
prepare
sysbench \
--db-driver=pgsql \
--pgsql-host=127.0.0.1 \
--pgsql-port=5432 \
--pgsql-user=sbtest \
--pgsql-password=sbtest \
--pgsql-db=sbtest \
--oltp-table-size=200000 \
--oltp-tables-count=10 \
--rand-init=on \
--threads=10 --time=30 \
--events=0 \
--report-interval=10 \
--percentile=99 /usr/share/sysbench/tests/include/oltp_legacy/select_random_ranges.lua \
run
sysbench \
--db-driver=pgsql \
--pgsql-host=127.0.0.1 \
--pgsql-port=5432 \
--pgsql-user=sbtest \
--pgsql-password=sbtest \
--pgsql-db=sbtest \
--oltp-table-size=200000 \
--oltp-tables-count=10 \
--rand-init=on \
--threads=10 --time=30 \
--events=0 \
--report-interval=10 \
--percentile=99 /usr/share/sysbench/tests/include/oltp_legacy/select_random_ranges.lua \
cleanup
[ 10s ] thds: 10 tps: 4371.54 qps: 4371.54 (r/w/o: 4371.54/0.00/0.00) lat (ms,99%): 17.01 err/s: 0.00 reconn/s: 0.00
[ 20s ] thds: 10 tps: 4463.95 qps: 4463.95 (r/w/o: 4463.95/0.00/0.00) lat (ms,99%): 16.71 err/s: 0.00 reconn/s: 0.00
[ 30s ] thds: 10 tps: 4514.28 qps: 4514.28 (r/w/o: 4514.28/0.00/0.00) lat (ms,99%): 16.41 err/s: 0.00 reconn/s: 0.00
SQL statistics:
queries performed:
read: 133519
write: 0
other: 0
total: 133519
transactions: 133519 (4448.60 per sec.)
queries: 133519 (4448.60 per sec.)
ignored errors: 0 (0.00 per sec.)
reconnects: 0 (0.00 per sec.)
General statistics:
total time: 30.0122s
total number of events: 133519
Latency (ms):
min: 0.36
avg: 2.25
max: 67.31
99th percentile: 16.71
sum: 299801.49
Threads fairness:
events (avg/stddev): 13351.9000/3937.09
execution time (avg/stddev): 29.9801/0.01
———————————————————————————————
招聘信息:
高级DBA 一名
1 具有POSTGRESQL 证书PGCM PGCE 均可,有POSTGRESQL 工作经验,其他数据库相关经验8-10年
2 针对应用开发中的基于POSTGRESQL 的痛点有认知,可以帮助开发在使用POSTGRESQL 中更有效的利用数据库的特点
3 有项目经验,能带领相关人员,逐步完善项目中的缺陷和难点,将项目导入正轨。
4 能理解软件设计中的架构设计思维,能在整体软件项目中,合理利用数据库产品。
5 能理解业务,并进行表设计,或优化的能力。
6 具有基本的MYSQL 知识,redis知识,ORACLE 知识(加分)
我们将提供有竞争力的薪资
初中级DBA 一名
1 爱岗敬业,认真负责,对数据库有一定的了解,有一定的运维经验
2 快速的学习能力,针对POLARDB , MYSQL 的操作进行掌握和学习。
3 能举一反三,对出现的问题,能产生更多的展开
4 具备 REDIS , MONGODB 知识 (加分)
工作地点:天津空港商务西区 W11 棟
请将简历发送到:
文章评论