Postgresql 压力测试 pgbench 与 准不准
任何数据库都有压力测试的需求,每种数据库的压力测试都是要证明这个数据库本身在某种硬件的情况下,能达到的一种可以承受的工作上的压力。 那么有一个问题压力测试的数据准吗? 其实实际上我个人的回答是, 根本不准,反正我也不怎么信。
那么久会产生两个问题, 你不信你测他,有脑子有病吧 ? 另一个问题, 为什么不准,有没有准的压力测试?
那么下面就回答
1 压力测试中的方式,大多是测试某种数据库的QPS TPS ,或者这个数据库在每秒能插入多少条数据。 然后就可以大放厥词的说明这个数据库性能很棒。 可这并不是问题的所在,所在的是真有人信。
众多车企的工信部油耗,你信吗, 反正我不信,为什么是工信部有问题吗?是测试的方式有问题吗?是车子有问题吗?
都不是,汽车的油耗的测试,是在一个理想的环境中匀速测定出来的,他当然有一定的说服力,从哪里能开出有说服力。
例如某台湾和二汽的合资品牌,工信部测出的油耗有达到了10个,那就是告诉你这车可不省油。有的车子人家测出的油耗只有5.5个,但你开上他就9个油,你说是车子有毛病还是你脚“臭”。
放到数据库也是一样,测试的标准都不,怎么测试的,测试的数据,以及测试的复杂度都不一样,测试的结果能说明什么, 能说明的就是如果结果太差,那这个数据库一定不行,但如果数据好看,也不能说这个数据库就一定好。 因为一个车子的“跑得快” 一定不是他的主要的指标, 而一个数据库的性能指标,也不是能跑多少TPS ,一秒钟能插入多少数据。 但如果这些指标不行,那就一定不能用这个数据库。
这个问题就回答了, 数据我不大信,但还是要看,如果汽车安全五星批发部都告诉你这个车子的安全系数是 3星,那你要是买了他,准备好头盔。
那么对于一个数据库什么是准的测试,其实就是你数据库要上的系统应用,在上面用大的预估量来进行数据的测试, 如果数据库塌了,你就找到这个数据库的极限,当然如果你看出系统的问题,调整了软件在表设计的某些东西,然后这个数据库不崩溃了,那就说明.......
言归正传,postgresql的压力测试有么有必要,当然有,但是我们的测试大部分就属于五星批发部, 那么今天五星批发部pgbench 就来测测我们的postgresql 这辆多功能“车”。
1 产生测试的表
通过pg_bench -i 数据库名,来在指定的数据库下产生4个测试表
pgbench_accounts
pgbench_branches
pgbench_history
pgbench_tellers
那么他们在测试的时候使用了什么语句来进行的
select count(*) from pgbench_branches
INSERT INTO pgbench_history (tid, bid, aid,delta, mtime) VALUES ($1, $2, $3, $4, CURRENT_TIMESTAMP)
insert intopgbench_tellers(tid,bid,tbalance) values ($1,$2,$3)
UPDATE pgbench_accounts SET abalance =abalance + $1 WHERE aid = $2
UPDATE pgbench_tellers SET tbalance =tbalance + $1 WHERE tid = $2
SELECT abalance FROM pgbench_accounts WHEREaid = $1
insert into pgbench_branches(bid,bbalance)values($1,$2)
当然时间的问题,可能这里也没有总结全pg_bench 执行的语句,实际上pg_bench 执行语句分为两部分
一部分是上面的测试语句,还有一部分是在收集信息并进行测试数据分析的语句,这里就不给出了。
Pgbench 中测试的数据其实是分几个部分的
1 初始化数据
2 运行测试的语句,填充数据改变数据
3 收集运行中的结果,并分析总结计算
4 打印结果
其中–i 是初始化的步骤的参数,-F 主要是在于你是否想进行数据存储的优化,这里的调节可以让你对数据的存储方面的知识的验证得到一些答案,例如你的–fillfactor 在100 90 85 60 设置后,你的测试结果有什么变化。
pgbench test -c 10 -j 4 -l -M simple -r-T 30
下面同样的测试,仅仅是在–M 参数进行了变化,相关的测试结果中 prepared 的数据输入的方式比普通的方式的tps要好的多,所以可以更能证明,如果你更懂一个数据库,你将获得更多的性能的优势,当然如果你不懂也别把所有的问题都推到他的身上。
当然数据量也是很重要的,如果你需要测试更多的数据,也可以在初始化的时候通过 -s 来加大测试数据, 如果不给相关的测试数据默认是10万,-s 是测试的数据倍数。
另外一个事情是需要注意的是,你的 -c 参数是同时连接postgresql的客户端,注意你填写的客户端,这里不是要和你的大连接数持平,而是你要和你在某一秒同时工作的连接进行对比,可能一个非常繁忙的系统,在一秒钟同时进行工作的进程不会超过几十个。所以之类这个概念不要误会,否则你调整成1000个,可不是和你认为的1000个的概念一样。
相关文章