postgresql|数据库|数据库测试工具pgbench之使用

简介: postgresql|数据库|数据库测试工具pgbench之使用

前言:

数据库是项目中的重要组件,也是一个基础的重要组件,其地位说是第一我想应该是没有什么太多问题的。

那么,数据库的设计这些方面是不用多说的,关键的第一步,主要是涉及数据库的部署方式,运行方式,表的逻辑设计,合理的字段,合理的索引,必须的角色,安全方面的考虑,函数,视图,触发器,物化视图等等方面,也就是说项目中哪些数据需要存放到数据库,相关数据怎么存放到数据库是数据库设计阶段需要解决的问题。

数据库设计阶段完成后,进入数据库的运营阶段,在运营前,我们需要明确数据库应该达到的状态,简单来说,就是数据库能够具有三高(三高通常指高可用,高性能,高并发),而高可用是比较容易实现的,一般是通过搭建集群的方式来实现高可用(也就是HA),也比较容易的就可以明确是否达到了高可用(毕竟,集群搭建完毕了,主从切换几次就知道是否确实是高可用了),但高性能和高并发则需要反复的测试并结合实际上线后的运营来判断了,如果没有测试以及相关的测试报告,那么是无法确认数据库是否具有高性能和高并发的。

因此,数据库的测试工作是一个比较关键的但常常被人为忽视的工作。对于postgresql而言,测试并判断一个数据库是否符合我们的预期,可以使用的工具是比较多的,比如pg_profile ,pg_reset , pg_stat 这样的或内或外的插件来收集监控数据库,但这些工具生成的报告内容是比较多的并且生成效率不高,也不是特别的直观。

pgbench这个工具可以解决很大一部分痛点,该工具具有数据库测试流程简单,直接,高效,易于使用,关键是无需特意的安装部署,postgresql数据库自带的小工具。 给人的感觉就是pgbench等于web 测试里的ab工具,非常方便使用。

pgbench可以用于测试PostgreSQL的性能和并发能力。它模拟了一个简单的银行转账场景,可以通过设置参数来模拟不同的负载。pgbench支持多线程并发测试,可以测试事务吞吐量、延迟、并发连接数等指标。pgbench使用简单,但功能有限,只能进行基本的负载测试。

下面对pgbench的使用做一个简单的介绍

一,

pgbench在哪里?

pgbench一般是随数据库安装的内置命令

特别注意,此命令和其它命令基本一样,需要使用postgres用户来执行,root用户不可使用

[root@node1 ~]# whereis pgbench
pgbench: /usr/local/pgsql/bin/pgbench

二,

测试用的数据库介绍

操作系统是centos7,VMware虚拟机两台,内存4G,CPU4核

数据库使用的是postgresql-12.4版本,全部都是默认状态,也就是说没有进行优化,这里的优化指的是数据库的运行参数,操作系统内核参数优化,数据库是简单的主从复制集群。

主数据库  IP 192.168.123.11

从数据库 IP 192.168.123.12

三,

测试工作的数据准备

计划生成一个2000W条的大表,然后对该表做查询,写入的测试,从而得出数据库的性能和并发指标,下面是大表的创建代码:

随机数函数:

create or replace function gen_id(  
 a date,  
 b date  
)   
returns text as $$  
select lpad((random()*99)::int::text, 3, '0') ||   
    lpad((random()*99)::int::text, 3, '0') ||   
    lpad((random()*99)::int::text, 3, '0') ||   
    to_char(a + (random()*(b-a))::int, 'yyyymmdd') ||   
    lpad((random()*99)::int::text, 3, '0') ||   
    random()::int ||   
    (case when random()*10 >9 then 'xy' else (random()*9)::int::text end ) ;  
$$ language sql strict;

创建测试表结构:

CREATE SEQUENCE test START 1;
create table if not exists testpg (
  "id" int8 not null DEFAULT nextval('test'::regclass),
  CONSTRAINT "user_vendorcode_pkey" PRIMARY KEY ("id"),
  "suijishuzi" VARCHAR ( 255 ) COLLATE "pg_catalog"."default"
);

插入2000W条数据:

根据机器性能,大概5到10分钟左右

insert into testpg SELECT generate_series(1,20000000) as xm, gen_id('1949-01-01', '2023-10-16') as num;

四,

查看测试表

五,

pgbench初始化

注意,在初始化前,需要创建pgbench数据库,如何创建就不在这废话了

pgbench -U postgres -i pgbench

创建完毕后,将会看到pgbench数据库下有几个表,表的功能目前还不太清楚:

postgres=# \c pgbench 
You are now connected to database "pgbench" as user "postgres".
pgbench=# \dt
              List of relations
 Schema |       Name       | Type  |  Owner   
--------+------------------+-------+----------
 public | pgbench_accounts | table | postgres
 public | pgbench_branches | table | postgres
 public | pgbench_history  | table | postgres
 public | pgbench_tellers  | table | postgres
(4 rows)

六,

pgbench的几种模式

pgbench有内置模式和外置模式两种,内置就是使用pgbench刚刚创建的那四个表里的内容直接测试,一般是基准测试使用(基准测试指的是基础性的,准确度方面的测试),外置模式是使用自定义的SQL语句进行测试,一般是压力性能测试使用。

内置模式:

内建模式具体的细化有如下三种,根据名字大概猜测第一个是综合性能方面的简单测试,第二个是写入性能的简单测试,第三个是读性能的简单测试,都是使用pgbench自带的那四个表和它自己的逻辑来进行测试的。

[postgres@node1 ~]$ pgbench -b list
Available builtin scripts:
  tpcb-like
  simple-update
  select-only

第一种小模式(tpcb-like):

pgbench  -U postgres -T 10 -c 10 -h 192.168.123.11 -d pgbench   > 1111.txt  2>&1 >>1111.txt

截取输出的部分结果,可以看到pgbench有update,insert,和select这些动作,都是在上面四张表内完成,该过程不可控,也基本不是非常准确的测试

client 5 executing script "<builtin: TPC-B (sort of)>"
client 5 executing \set aid
client 5 executing \set bid
client 5 executing \set tid
client 5 executing \set delta
client 5 sending BEGIN;
client 5 receiving
client 0 receiving
client 0 sending END;
client 0 receiving
client 5 receiving
client 5 sending UPDATE pgbench_accounts SET abalance = abalance + -1444 WHERE aid = 99838;
client 5 receiving
client 9 receiving
client 9 sending UPDATE pgbench_tellers SET tbalance = tbalance + -1294 WHERE tid = 6;
client 9 receiving
client 0 receiving
client 5 receiving
client 5 sending SELECT abalance FROM pgbench_accounts WHERE aid = 99838;
client 5 receiving
client 8 receiving
client 8 sending INSERT INTO pgbench_history (tid, bid, aid, delta, mtime) VALUES (1, 1, 78380, -2573, CURRENT_TIMESTAMP);
client 8 receiving
client 0 executing script "<builtin: TPC-B (sort of)>"
client 0 executing \set aid
client 0 executing \set bid
client 0 executing \set tid
client 0 executing \set delta
client 0 sending BEGIN;
client 0 receiving
client 0 receiving
client 0 sending UPDATE pgbench_accounts SET abalance = abalance + -2452 WHERE aid = 40167;
client 0 receiving
client 5 receiving
client 5 sending UPDATE pgbench_tellers SET tbalance = tbalance + -1444 WHERE tid = 10;
client 5 receiving
client 8 receiving
client 8 sending END;
client 8 receiving
client 5 receiving
client 5 sending UPDATE pgbench_branches SET bbalance = bbalance + -1444 WHERE bid = 1;
client 5 receiving

第二种小模式(select-only);

pgbench  -U postgres -b select-only  -c 10 -h 192.168.123.11 -d pgbench    > 1111.txt  2>&1 >>1111.txt

第三种小模式(simple-update

pgbench  -U postgres -b simple-update  -c 10 -h 192.168.123.11 -d pgbench    > 1111.txt  2>&1 >>1111.txt

外置模式:

pgbench -M prepared -v -r -P 1 -f ./ro.sql -c 60 -j 60 -T 120 -D scale=10000 -D range=500000 -Upostgres test -P 5 -h 192.168.123.222 -p 15433

七,

pgbench命令的参数说明:

参数说明:

-r 在基准结束后,报告平均的每个命令的每语句等待时间(从客户端的角度来说是执行时间)。

-j pgbench中的工作者线程数量。在多 CPU 机器上使用多于一个线程会有用。客户端会尽可能均匀地分布到可用的线程上。默认为 1。

-c 模拟的客户端数量,也就是并发数据库会话数量。默认为 1。

-t 每个客户端运行的事务数量。默认为 10。

-T 运行测试这么多秒,而不是为每个客户端运行固定数量的事务。

-DVARNAME=VALUE 传递测试脚本中变量值

define variable for use by custom script

-v vacuum all four standard tables before tests一般测试的时候为了去除上次测试的结果影响,需要vacuum一下pgbench的数据库。

报告说明:

transaction type 表明本次测试所使用的测试类型

scaling factor 表明pgbench在初始化时设置的数据量的比例因子

query mode 表明指定的查询模式,包括 simple查询模式(默认)、extended查询模式和prepared 查询模式

number of clients表明指定的客户端连接数

number of threads表明测试时每个客户端的线程数

number of transactions actually processed 测试结束时实际处理的事务数

latency average 测试过程的平均响应时间

tps 单位时间内执行的事务数

未完待续!!!

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍如何基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
10月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS费用价格:MySQL、SQL Server、PostgreSQL和MariaDB引擎收费标准
阿里云RDS数据库支持MySQL、SQL Server、PostgreSQL、MariaDB,多种引擎优惠上线!MySQL倚天版88元/年,SQL Server 2核4G仅299元/年,PostgreSQL 227元/年起。高可用、可弹性伸缩,安全稳定。详情见官网活动页。
1593 152
|
10月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎,提供高性价比、稳定安全的云数据库服务,适用于多种行业与业务场景。
1106 156
|
10月前
|
关系型数据库 MySQL 分布式数据库
阿里云PolarDB云原生数据库收费价格:MySQL和PostgreSQL详细介绍
阿里云PolarDB兼容MySQL、PostgreSQL及Oracle语法,支持集中式与分布式架构。标准版2核4G年费1116元起,企业版最高性能达4核16G,支持HTAP与多级高可用,广泛应用于金融、政务、互联网等领域,TCO成本降低50%。
|
10月前
|
关系型数据库 分布式数据库 数据库
阿里云数据库收费价格:MySQL、PostgreSQL、SQL Server和MariaDB引擎费用整理
阿里云数据库提供多种类型,包括关系型与NoSQL,主流如PolarDB、RDS MySQL/PostgreSQL、Redis等。价格低至21元/月起,支持按需付费与优惠套餐,适用于各类应用场景。
|
10月前
|
人工智能 数据库 iOS开发
DBeaver Ultimate Edtion 25.2 发布 - 通用数据库工具
DBeaver Ultimate Edtion 25.2 Multilingual (macOS, Linux, Windows) - 通用数据库工具
847 0
|
11月前
|
存储 关系型数据库 数据库
【赵渝强老师】PostgreSQL数据库的WAL日志与数据写入的过程
PostgreSQL中的WAL(预写日志)是保证数据完整性的关键技术。在数据修改前,系统会先将日志写入WAL,确保宕机时可通过日志恢复数据。它减少了磁盘I/O,提升了性能,并支持手动切换日志文件。WAL文件默认存储在pg_wal目录下,采用16进制命名规则。此外,PostgreSQL提供pg_waldump工具解析日志内容。
1032 0
|
存储 关系型数据库 测试技术
拯救海量数据:PostgreSQL分区表性能优化实战手册(附压测对比)
本文深入解析PostgreSQL分区表的核心原理与优化策略,涵盖性能痛点、实战案例及压测对比。首先阐述分区表作为继承表+路由规则的逻辑封装,分析分区裁剪失效、全局索引膨胀和VACUUM堆积三大性能杀手,并通过电商订单表崩溃事件说明旧分区维护的重要性。接着提出四维设计法优化分区策略,包括时间范围分区黄金法则与自动化维护体系。同时对比局部索引与全局索引性能,展示后者在特定场景下的优势。进一步探讨并行查询优化、冷热数据分层存储及故障复盘,解决分区锁竞争问题。
1768 2
|
关系型数据库 分布式数据库 PolarDB
《阿里云产品手册2022-2023 版》——PolarDB for PostgreSQL
《阿里云产品手册2022-2023 版》——PolarDB for PostgreSQL
688 0
|
存储 缓存 关系型数据库
|
存储 SQL 并行计算
PolarDB for PostgreSQL 开源必读手册-开源PolarDB for PostgreSQL架构介绍(中)
PolarDB for PostgreSQL 开源必读手册-开源PolarDB for PostgreSQL架构介绍
886 0

推荐镜像

更多