当前位置: 首页 > news >正文

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=# \dtList of relationsSchema |       Name       | Type  |  Owner   
--------+------------------+-------+----------public | pgbench_accounts | table | postgrespublic | pgbench_branches | table | postgrespublic | pgbench_history  | table | postgrespublic | pgbench_tellers  | table | postgres
(4 rows)

六,

pgbench的几种模式

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

内置模式:

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

[postgres@node1 ~]$ pgbench -b list
Available builtin scripts:tpcb-likesimple-updateselect-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 运行测试这么多秒,而不是为每个客户端运行固定数量的事务。

-D VARNAME=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 单位时间内执行的事务数

未完待续!!!

相关文章:

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

前言&#xff1a; 数据库是项目中的重要组件&#xff0c;也是一个基础的重要组件&#xff0c;其地位说是第一我想应该是没有什么太多问题的。 那么&#xff0c;数据库的设计这些方面是不用多说的&#xff0c;关键的第一步&#xff0c;主要是涉及数据库的部署方式&#xff0c;…...

代码随想录Day51 | 309.最佳买卖股票时机含冷冻期

309. 买卖股票的最佳时机含冷冻期 class Solution { public:int maxProfit(vector<int>& prices) {int n prices.size();if (n 0) return 0;vector<vector<int>> dp(n, vector<int>(4, 0));dp[0][0] - prices[0]; // 持股票for (int i 1; i &l…...

libopenssl 实现私钥加密公钥解密

在需要验证可信来源时&#xff0c;需要用到签名验签。因此&#xff0c;需要使用私钥加密&#xff0c;公钥解密&#xff0c;取得被加密的信息。这就会使用到私钥加密&#xff0c;公钥解密的场景了。 参考&#xff1a; https://github.com/openssl/openssl/issues/20493 https:/…...

代码随想录 Day - 51|#309 最佳买卖股票时机含冷冻期|#714 买卖股票的最佳时机含手续费

清单 ● 309.最佳买卖股票时机含冷冻期 ● 714.买卖股票的最佳时机含手续费 LeetCode #309 最佳买卖股票时机含冷冻期 1. 题目 给定一个整数数组&#xff0c;其中第 i 个元素代表了第 i 天的股票价格 。 设计一个算法计算出最大利润。在满足以下约束条件下&#xff0c;你可…...

.net 使用IL生成代理类实现AOP对比Java Spring Boot的AOP

首先&#xff0c;我们需要定义一个接口&#xff0c;代表我们要代理的目标对象的功能&#xff1a; // 日志记录器接口 public interface ILogger {/// <summary>/// 记录日志/// </summary>/// <param name"message">日志消息</param>void L…...

美容店预约小程序搭建流程

随着科技的不断发展&#xff0c;小程序已经成为了人们生活中不可或缺的一部分。对于美容店来说&#xff0c;搭建一个预约小程序不仅可以提高工作效率&#xff0c;还可以增加客户数量、提高服务质量。那么&#xff0c;如何搭建一个美容店预约小程序呢&#xff1f;本文将为你详细…...

ppt 作图 如何生成eps格式

需求 ppt中画的图&#xff0c;按照eps格式导出。 环境 软件: ppt, Gsview(用来将ps格式转成eps), Adobe 操作系统&#xff1a; win11 思路 直接在ppt里选择adobe打印机&#xff0c;将图片以文件形式打印到ps格式的文件中&#xff0c;再由gsview转化成eps。 建议在本身就…...

渗透测试中的前端调试(上)

一、前言 前端调试是安全测试的重要组成部分。它能够帮助我们掌握网页的运行原理&#xff0c;包括js脚本的逻辑、加解密的方法、网络请求的参数等。利用这些信息&#xff0c;我们就可以更准确地发现网站的漏洞&#xff0c;制定出有效的攻击策略。前端知识对于安全来说&#xff…...

跨境电商引流之Reddit营销,入门保姆级攻略

在当今竞争激烈的在线市场中&#xff0c;企业不断寻求新的方法来加强其数字营销工作。Reddit 是最受欢迎的社交媒体平台之一&#xff0c;为企业提供了巨大的潜力&#xff0c;可以通过引人入胜且相关的内容来接触目标受众。然而&#xff0c;将 Reddit 用于营销目的需要仔细考虑某…...

Linux下虚拟网卡的基本命令

文章目录 创建虚拟网卡查看虚拟网卡删除虚拟网卡 创建虚拟网卡 # 创建tap模式的虚拟网卡tap0 sudo ip tuntap add mode tap tap0 # 开启网卡 sudo ip link set tap0 up # 设置网卡的ip地址和子网掩码 sudo ip addr add 192.168.1.1/24 dev tap0查看虚拟网卡 # 查看虚拟网卡ta…...

conan入门(二十七):因profile [env]字段废弃导致的boost/1.81.0 在aarch64-linux-gnu下交叉编译失败

今天在尝试用conan 1.60.0使用aarch64-linux-gnu编译器交叉编译boost/1.81.0时报错了&#xff1a; conan install boost/1.81.0 -pr:h aarch64-linux-gnu.jinja -pr:b default --build boost输出如下&#xff1a; Configuration (profile_host): [settings] archarmv8 arch_b…...

BFS专题7 多终点迷宫问题

题目&#xff1a; 样例&#xff1a; 输入 3 3 0 0 0 1 0 0 0 1 0 输出 0 1 2 -1 2 3 -1 -1 4 思路&#xff1a; 单纯的 BFS 迷宫问题&#xff0c;只是标记一下每个点的 step&#xff0c;注意初始化答案数组都为 -1. 代码详解如下&#xff1a; #include <iostream> #…...

ES6中对象新增了哪些扩展?

一、属性的简写 当对象字面量的属性名与变量名相同时&#xff0c;可以省略属性名&#xff0c;直接使用变量名作为属性名。 const x 10; const y 20;// ES6之前 const obj1 { x: x, y: y };// ES6属性简写 const obj2 { x, y };注意&#xff1a;简写的对象方法不能用作构造…...

蓝桥杯每日一题2023.9.22

4960. 子串简写 - AcWing题库 题目描述 题目分析 原本为纯暴力但是发现会超时&#xff0c;可以加入前缀和&#xff0c;从前往后先记录一下每个位置c1出现的次数 再从前往后扫一遍&#xff0c;如果遇到c2就将答案加上此位置前的所有c1的个数&#xff08;直接加上此位置的前缀…...

vscode左键无法跳转到定义的文件

之前用vscode的时候&#xff0c;明明是可以ctrl键鼠标左键跳转到定义文件的&#xff0c;突然之间就不行了&#xff0c;鼠标移到引入上根本都没有下划线&#xff0c;无法跳转 解决方法&#xff1a; 项目的根目录新建 jsconfig.json 文件&#xff0c;代码如下 {"compiler…...

c、c++排序的相关知识(归并排序、计数排序、稳定性等)

排序&#xff0c;是对给定的一组数&#xff0c;按照某种逻辑关系&#xff0c;进行位置上的移动。由于排序至少需要将所有数过一遍&#xff08;正常情况下&#xff0c;非特殊数组&#xff09;&#xff0c;因此排序的时间复杂度一定不能小于O&#xff08;N&#xff09;。 归并排…...

oracle定时任务的使用

常见错误&#xff1a; PLS-00225: subprogram or cursor xxx reference is out of scope # job名字太长PLS-00201: identifier COUNT_JOB.SUBMIT must be declared # DBMS_JOB.SUBMIT是固定写法创建存储过程 -- 建表 CREATE TABLE TEST_A(TEST_ADD_DATA DATE); -- 存储过程 C…...

VSCode 配置 Lua 开发环境(清晰明了)

概述 由于 AutoJS 学得已经差不多了&#xff0c;基本都会了&#xff0c;现在开始向其他游戏脚本框架进发&#xff0c; Lua 语言很强大&#xff0c;就不多说&#xff0c; 按键精灵、触动精灵等等都是用该语言编程脚本的&#xff0c;由于按键精灵、触动精灵 和 AutoJS 类似,不是…...

JS合并2个远程pdf

要在HTML和JavaScript中读取远程PDF文件的矢量数据并合并两个PDF文件&#xff0c;您可以使用pdf-lib和Axios库。以下是使用pdf-lib和Axios在HTML和JavaScript中读取和合并远程PDF文件的步骤&#xff1a; 1. 引入 首先&#xff0c;确保您在HTML文件中引入了pdf-lib和Axios库。…...

TikTok的伦理挑战:虚拟世界与现实世界的交汇

在数字时代&#xff0c;社交媒体平台已经不再只是一个信息传播的工具&#xff0c;它已经深刻地改变了我们的社交行为、价值观和伦理观。 而在这一领域的佼佼者之一&#xff0c;TikTok&#xff0c;正面临着伦理挑战&#xff0c;这是虚拟世界与现实世界交汇的产物。 本文将深入…...

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业

6月9日&#xff0c;国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解&#xff0c;“超级…...

3403. 从盒子中找出字典序最大的字符串 I

3403. 从盒子中找出字典序最大的字符串 I 题目链接&#xff1a;3403. 从盒子中找出字典序最大的字符串 I 代码如下&#xff1a; class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

视觉slam十四讲实践部分记录——ch2、ch3

ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...

【Go语言基础【12】】指针:声明、取地址、解引用

文章目录 零、概述&#xff1a;指针 vs. 引用&#xff08;类比其他语言&#xff09;一、指针基础概念二、指针声明与初始化三、指针操作符1. &&#xff1a;取地址&#xff08;拿到内存地址&#xff09;2. *&#xff1a;解引用&#xff08;拿到值&#xff09; 四、空指针&am…...

Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换

目录 关键点 技术实现1 技术实现2 摘要&#xff1a; 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式&#xff08;自动驾驶、人工驾驶、远程驾驶、主动安全&#xff09;&#xff0c;并通过实时消息推送更新车…...

从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践

作者&#xff1a;吴岐诗&#xff0c;杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言&#xff1a;融合数据湖与数仓的创新之路 在数字金融时代&#xff0c;数据已成为金融机构的核心竞争力。杭银消费金…...

STM32---外部32.768K晶振(LSE)无法起振问题

晶振是否起振主要就检查两个1、晶振与MCU是否兼容&#xff1b;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容&#xff08;CL&#xff09;与匹配电容&#xff08;CL1、CL2&#xff09;的关系 2. 如何选择 CL1 和 CL…...

MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用

文章目录 一、背景知识&#xff1a;什么是 B-Tree 和 BTree&#xff1f; B-Tree&#xff08;平衡多路查找树&#xff09; BTree&#xff08;B-Tree 的变种&#xff09; 二、结构对比&#xff1a;一张图看懂 三、为什么 MySQL InnoDB 选择 BTree&#xff1f; 1. 范围查询更快 2…...