Citus的TPCC、TPCH性能测试
Citus的TPCC、TPCH性能测试
文章目录
- Citus的TPCC、TPCH性能测试
- 测试的目的
- 适用范围
- 测试环境
- 架构信息
- 硬件配置
- 操作系统
- 软件版本
- 测试结果
- TPCC测试测试结果
- TPCH测试测试结果
- 一、环境部署
- 1.1、安装BenchmarkSQL
- 1.2、PostgreSQL安装
- 1.3、nmon部署
- 1.4、TPC-H测试的生成数据工具安装
- 二、TPCC测试
- 2.1、测试用例描述
- 2.2、测试用例1(扩容前)
- 2.2.1、创建模式和初始化数据库
- 2.2.2、生成数据
- 2.2.3、调整参数、压力测试
- 2.2.4、测试结果输出
- 2.3、测试用例2:扩容
- 2.4、测试用例3(扩容后)
- 2.4.1、调整参数、压力测试
- 2.4.2、测试结果输出
- 2.5、测试结果汇总
- 三、TPCH测试
- 3.1、测试用例描述
- 3.2、测试用例1(扩容前)
- 3.2.1、初始化数据库、创建表格
- 3.2.2、调整参数、生成数据
- 3.2.3、调整参数、压力测试
- 3.2.4、输出测试结果
- 3.3、测试用例2:扩容
- 3.4、测试用例3(扩容后)
- 3.5、测试结果汇总
测试的目的
本次为Citus+PostgreSQL分片数据库性能测试,测试目的为测试Citus+PostgreSQL数据库的事务处理能力,编写本文档,以作参考.
适用范围
本测试计划适用于PostgreSQL数据库功能和性能测试.
测试环境
架构信息
主机名 | IP | 操作系统 | 内存/空间 | 角色 | 说明 |
---|---|---|---|---|---|
pgcn | 192.168.6.108 | rhel7 | 2c/18G 400G | coordinate | 安装PGDB16.4+ Citus 12.1-1 |
pgwk01 | 192.168.6.109 | rhel7 | 2c/18G 400G | worker | 安装PGDB16.4+ Citus 12.1-1 |
pgwk02 | 192.168.6.110 | rhel7 | 2c/18G 400G | worker | 安装PGDB16.4+ Citus 12.1-1 |
硬件配置
-
2*E5-2680 v4(2.40GHz 14核)
-
8*32GB RDIMM-2400内存
-
8*1.6T MLC SSD
-
2*双万兆光口网卡
操作系统
- Operating System: Red Hat Enterprise Linux Server 7.7 (Maipo)
- Architecture: x86-64
软件版本
-
PGDB-16.4-8k-rhel7-x86_64:PostgreSQL 16.4 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44), 64-bit
-
Citus:Citus 12.1.4 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44), 64-bit
-
BenchmarkSQL:Version 5.0
-
nmon:nmon version 16e
测试结果
TPCC测试测试结果
测试结果
以下是整理后的数据表格,包括扩容前后的变化对比:
扩容前 vs 扩容后 数据对比表
以下是根据您提供的数据更新后的表格:
指标 \ 阶段 | 扩容前 | 扩容后 | 变化 | 描述 |
---|---|---|---|---|
tpmC | 4725.59 | 5102.58 | +376.99 | 新订单事务每分钟数 |
tpmTOTAL | 10512.15 | 11363.44 | +851.29 | 总事务每分钟数 |
Transaction Count | 21123 | 22799 | +1676 | 事务总数 |
Citus集群节点数 | 1✖Coordinator + 2✖Worker | 1✖Coordinator + 3✖Worker | +1个Worker | 节点配置 |
每个节点所占有的分片数 | 节点 | 分片数 192.168.6.109 | 81 192.168.6.110 | 81 | 节点 | 分片数 192.168.6.107 | 63 192.168.6.109 | 45 192.168.6.110 | 54 | - | 节点和分片数 |
数据量 | 300万条 | 300万条 | 无变化 | 本次测试有300万条数据 |
重新分配分片所用的时间:Time: 22610.374 ms (00:22.610)
总结:
- tpmC 和 tpmTOTAL 指标在扩容后有所减少,变动幅度较小。
- Transaction Count 稍微减少。
- Citus集群节点数 增加了1个Worker节点,提高了扩展性。
- 每个节点所占有的分片数 调整后,分片在各节点间更为均匀。
TPCH测试测试结果
扩容前 vs 扩容后 数据对比表
阶段 | 指标 | 扩容前 | 扩容后 | 提升/下降百分比 |
---|---|---|---|---|
数据量 | 数据量 | 8661245(86万) | 8661245(86万) | 0% |
Q1查询响应时间 | 1151.499 ms (00:01.151) | 1169.370 ms (00:01.169) | -1.05% | |
Q2查询响应时间 | 225.830 ms | 224.707 ms | 0.5% | |
Q3查询响应时间 | 474.648 ms | 446.181 ms | 5.98% | |
Q4查询响应时间 | 342.354 ms | 318.128 ms | 7.07% | |
Q5查询响应时间 | 645.930 ms | 628.814 ms | 2.28% | |
Q6查询响应时间 | 234.146 ms | 258.494 ms | -10.41% | |
Q7查询响应时间 | 378.565 ms | 363.685 ms | 3.92% | |
Q8查询响应时间 | 689.490 ms | 580.927 ms | 15.75% | |
Q9查询响应时间 | 865.872 ms | 835.688 ms | 3.48% | |
Q10查询响应时间 | 567.329 ms | 545.771 ms | 3.79% | |
Q11查询响应时间 | 134.626 ms | 137.307 ms | -1.99% | |
Q12查询响应时间 | 332.472 ms | 311.096 ms | 6.39% | |
Q13查询响应时间 | 5030.917 ms (00:05.031) | 5671.297 ms (00:05.671) | -12.85% | |
Q14查询响应时间 | 265.414 ms | 261.195 ms | 1.65% | |
Q15查询响应时间 | 1134.336 ms (00:01.134) | 964.076 ms | 15% | |
Q16查询响应时间 | 273.432 ms | 274.727 ms | -0.47% | |
Q18查询响应时间 | 808.995 ms | 797.505 ms | 1.84% | |
Q19查询响应时间 | 412.101 ms | 375.844 ms | 8.76% | |
Q21查询响应时间 | 371.585 ms | 365.105 ms | 1.3% | |
Citus集群 | 节点数 | 1✖Coordinator + 2✖Worker | 1✖Coordinator + 3✖Worker | - |
每个节点所占有的分片数 | nodename | count 192.168.6.108 | 28 192.168.6.110 | 26 192.168.6.109 | 28 | nodename | count 192.168.6.108 | 22 192.168.6.107 | 22 192.168.6.110 | 22 192.168.6.109 | 22 | - |
扩容后重新分配分片持续时间:Time: 11652.738 ms (00:11.653)
总结
- 扩容后,多个查询的响应时间显著提升,尤其是Q15(提升15%)、Q8(提升15.75%)和Q4(提升7.07%),显示出明显的性能改进。
- 尽管部分查询如Q6和Q13的响应时间有所增加,但整体上大多数查询性能均有所提升。
- 整体来看,扩容后的系统在查询响应效率上表现优越,尤其在提升幅度较大的查询上,系统性能得到了明显改善。
一、环境部署
1.1、安装BenchmarkSQL
安装EPEL仓库
su -c 'rpm -Uvh https://download.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm'
配置yum源云环境
[root@postgres yum.repos.d]# cat CentOS-Base.repo
# CentOS-Base.repo
[base]
name=CentOS-$releasever - Base - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/7/os/x86_64/http://mirrors.aliyuncs.com/centos/7/os/$basearch/http://mirrors.cloud.aliyuncs.com/centos/7/os/$basearch/
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7#released updates
[updates]
name=CentOS-$releasever - Updates - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/7/updates/$basearch/http://mirrors.aliyuncs.com/centos/$releasever/updates/$basearch/http://mirrors.cloud.aliyuncs.com/centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7[root@postgres yum.repos.d]#
安装Ant
yum -y install ant
安装R语言
yum -y install epel-release
yum -y install R
检查jdk环境(要求JDK 7以上版本)
[root@postgres install]# java -version
openjdk version "1.8.0_412"
OpenJDK Runtime Environment (build 1.8.0_412-b08)
OpenJDK 64-Bit Server VM (build 25.412-b08, mixed mode)
下载并安装BenchmarkSQL
wget https://downloads.sourceforge.net/project/benchmarksql/benchmarksql-5.0.zipunzip ./benchmarksql-5.0.zip###编译BenchmarkSQL源码
[pg@postgres benchmarksql-5.0]$ pwd
/home/pg/benchmarksql-5.0
[pg@postgres benchmarksql-5.0]$ ant##创建配置文件,进入run目录, 复制props.pg文件并编辑产生的副本,设置与基准测试有关的参数:
[pg@postgres benchmarksql-5.0]$ cd run
[pg@postgres run]$ cp props.pg my_postgres.properties
[pg@postgres run]$ vi my_postgres.properties
参数配置说明
conn=jdbc:postgresql://localhost:5432/postgres
将其中的 “localhost” 修改为postgresql所在服务器的ip地址,将“5432”修改为 postgresql所在的端口,将末尾的 “postgres” 修改为所测量的数据库。本次实验,将其修改为 conn=jdbc:postgresql://localhost:5432/ benchmarksqluser=fbase
将“benchmarksql”修改为用来测试的用户。本次实验不做修改。password=fbase
将“PWbmsql”修改为测试的用户的密码。本次实验将其修改为“changeme”。
1.2、PostgreSQL安装
安装依赖包
yum -y install lrzsz sysstat e4fsprogs ntp readline-devel zlib zlib-devel openssl openssl-devel pam-devel libxml2-devel libxslt-devel python-devel tcl-devel gcc make flex bison perl perl-devel perl-ExtUtils* OpenIPMI-tools systemtap-sdt-devel smartmontools
安装PostgreSQL数据库软件
##上传软件压缩包,使用root用户
$ PGDB-16.4-8k-rhel7-x86_64.tar.gz
$ tar -xvf PGDB-16.4-8k-rhel7-x86_64.tar.gz$ cd PGDB-16.4-8k-rhel7-x86_64/extra_tools/install
sh install.sh -p 8432 -u fbase -b /usr/local/fbase/15.5 -d /data/fbase/fbdata -D HDD -c 100 -w
参数说明:
参数 | 配置值 | 说明 |
---|---|---|
-p | 8432 | 数据库监听端口,默认值为 8432 |
-u | 用户名 | 运行和安装 FBase 的系统用户 |
-b | /usr/local/fbase/‘fbase_version’ | FBase 的主目录,默认值为 /usr/local/fbase/‘fbase_version’ |
-d | 数据目录 | FBase 的数据目录 |
-D | SSD | 数据存储设备的类型,有效选项为 HDD 或 SSD,默认值为 SSD |
-c | 100 | FBase 的最大连接数,默认值为 100 |
-w | 是/否 | 是否使用默认密码 |
1.3、nmon部署
在命令行中使用wget 下载
官网下载路径
wget http://sourceforge.net/projects/nmon/files/nmon16m_helpsystems.tar.gz
下载与解压(不需要编译安装)
mkdir /nmon
cd nmon/
tar -zxvf nmon16m_helpsystems.tar.gz -解压
mv nmon_x86_64_centos7 nmon -重命名
[root@sdw-135 nmon]# cp nmon_x86_64_centos7 /usr/local/bin/nmon
[root@sdw-135 nmon]# nmon
nmon-16e------[H for help]---Hostname=postgres-----Refresh= 2secs ---13:56.44
| |
| ------------------------------ |
| _ __ _ __ ___ ___ _ __ For help type H or ... |
| | '_ \| '_ ` _ \ / _ \| '_ \ nmon -? - hint |
| | | | | | | | | | (_) | | | | nmon -h - full details |
| |_| |_|_| |_| |_|\___/|_| |_| |
| To stop nmon type q to Quit |
| ------------------------------ |
| |
| NAME="Red Hat Enterprise Linux Server" VERSION="7.7 (Maipo)" |
| AuthenticAMD AMD Ryzen 5 4600H with Radeon Graphics |
| MHz=2994.374 bogomips=5988.74 |
| ProcessorChips=1 PhyscalCores=1 |
| Hyperthreads =0 VirtualCPUs =2 |
| |
| Use these keys to toggle statistics on/off: |
| c = CPU l = CPU Long-term - = Faster screen updates |
| C = " WideView U = Utilisation + = Slower screen updates |
| m = Memory V = Virtual memory j = File Systems |
| d = Disks n = Network . = only busy disks/procs |
| r = Resource N = NFS h = more options |
| k = Kernel t = Top-processes q = Quit |
|----------------------------------------------------------------------------|
| |
| |
+----------------------------------------------------------------------------+
开启nmon收集系统数据
#创建收集数据目录
mkdir /home/pg/nmonlognohup ./runBenchmark.sh my_postgres.properties > citus.txt 2>&1 &
nohup ./runBenchmark.sh my_single.properties > single.txt 2>&1 &
#开启收集(-s 每隔x秒收集一次; -c 收集次数)
nmon -f -s 2 -c 960 -m /root/nmonlog
ps -ef | grep nmon[root@postgres ~]# nmon -f -s 5 -c 10 -m /home/pg/nmonlog
[root@postgres ~]# ps -ef|grep nmon
root 32060 1 0 13:58 pts/1 00:00:00 nmon -f -s 5 -c 10 -m /home/pg/nmonlog
root 32131 28389 0 13:58 pts/1 00:00:00 grep --color=auto nmon
[root@postgres ~]# cd /home/pg/nmonlog
[root@postgres nmonlog]# ls
postgres_240911_0627.nmon postgres_240911_1358.nmon
postgres_240911_0629.nmon#下载postgres_240911_1358.nmon文件到本地。
1.4、TPC-H测试的生成数据工具安装
tpch-kit
组件:GitHub 仓库地址
编译安装
编辑项目定义的头文件 tpch-kit-master/dbgen/tpcd.h,不同的数据库使用不用的定义。文件中内置了一些数据库,根据自己需要使用的数据库配置,如果文件中已经包含了,那么不需要配置。如果没有可以参考下方,增加到文件中即可。
【PostgreSQL定义】
#ifdef POSTGRESQL
#define GEN_QUERY_PLAN "explain"
#define START_TRAN "start transaction"
#define END_TRAN "commit;"
#define SET_OUTPUT ""
#define SET_ROWCOUNT "limit %d;\n"
#define SET_DBASE ""
#endif
【修改编译文件】
编辑编译文件 tpch-kit-master/dbgen/Makefile,找到如下内容按情况修改。
################
## CHANGE NAME OF ANSI COMPILER HERE
################
CC = gcc
# Current values for DATABASE are: INFORMIX, DB2, TDAT (Teradata)
# SQLSERVER, SYBASE, ORACLE, VECTORWISE, POSTGRESQL
# Current values for MACHINE are: ATT, DOS, HP, IBM, ICL, MVS, MACOS
# SGI, SUN, U2200, VMS, LINUX, WIN32
# Current values for WORKLOAD are: TPCH
DATABASE = POSTGRESQL
MACHINE = LINUX
WORKLOAD = TPCH
上述2个文件配置完成后,cd tpch-kit-master/dbgen/ 执行 make 命令
pg@postgres tpch-kit-master]$ make
编译完成后会自动生成2个执行文件
[pg@postgres dbgen]$ ls *gen
dbgen qgen
[pg@postgres dbgen]$
- dbgen:生成表数据(csv文件)
- qgen:生成复杂查询SQL
**需要注意:**直接执行 qgen 会出现找不到的错误
设置环境变量
export DSS_QUERY=./queries
再次执行qgen(成功),生成22条复杂查询SQL
二、TPCC测试
测试过程
生产测试数据->压测-> 扩容-> 压测。
1)测试过程benchmarksql采用相同配置,配置如下:
db=postgres # 数据库类型,设置为 PostgreSQL
driver=org.postgresql.Driver # JDBC 驱动程序类
conn=jdbc:postgresql://localhost:5432/postgres # JDBC 连接 URL,连接到本地 PostgreSQL 数据库
user=fbase # 数据库用户名
password=fbase # 数据库用户密码warehouses=100 # 使用的仓库数量
loadWorkers=50 # 负载生成器的工作线程数量terminals=60 # 运行的终端数量
runTxnsPerTerminal=0 # 每个终端要运行的事务数量,0表示不限制
runMins=2 # 测试运行时间,单位为分钟
limitTxnsPerMin=30000000 # 每分钟允许的最大事务数
terminalWarehouseFixed=true # 是否每个终端固定使用一个仓库
newOrderWeight=45 # 新订单事务的权重
paymentWeight=43 # 支付事务的权重
orderStatusWeight=4 # 订单状态查询事务的权重
deliveryWeight=4 # 配送事务的权重
stockLevelWeight=4 # 库存水平查询事务的权重
resultDirectory=my_result_%tY-%tm-%td_%tH%tM%tS # 结果数据保存的目录名称模板
osCollectorScript=./misc/os_collector_linux.py # 操作系统性能数据收集脚本的路径
osCollectorInterval=1 # 操作系统性能数据收集的间隔时间,单位为秒
//osCollectorSSHAddr=user@dbhost # 操作系统性能数据收集的 SSH 地址(被注释掉)
osCollectorDevices=net_ens34 blk_sda # 指定要监控的系统设备
2)整个citus数据库集群和系统,调整不同节点数进程测试,其中这些测试用例的参数配置完全一致,改变的只有citus集群节点数。
2.1、测试用例描述
各个节点的磁盘I/O速率
使用命令dd if=/dev/sda of=/tmp/test bs=64k count=40k oflag=dsync
测出磁盘I/O速率如下所示:
节点 | 速度 |
---|---|
108节点 | 246 MB/s |
109节点 | 162 MB/s |
110节点 | 151 MB/s |
107节点 | 180 MB/s |
参数说明
参数 | 说明 |
---|---|
if=/dev/sda | 输入文件或设备(从 /dev/sda 读取数据) |
of=/tmp/test | 输出文件(写入到 /tmp/test ) |
bs=64k | 块大小(每次读写 64 KB 数据) |
count=40k | 数据块数量(总共 40,000 个块) |
oflag=dsync | 输出标志(每次写入同步到磁盘) |
benchmarksql的参数配置说明:
**主要调整以下参数**warehouses=100 # 使用的仓库数量,数值越大,生成的数据量越大。
loadWorkers=50 # 负载生成器的工作线程数量terminals=60 # 运行的终端数量,可以模拟连接数据库的客户端数量。
runTxnsPerTerminal=0 # 每个终端要运行的事务数量,0表示不限制
runMins=2 # 测试运行时间,单位为分钟,一般测试为1~3小时
limitTxnsPerMin=30000000 # 每分钟允许的最大事务数
注意:warehouses不建议设置的很多,不然生成数据的时间过长
测试用例1和测试用例2主要区别在于Citus节点数量不同,测试用例2使用的citus节点比测试用例1多一个。
主要测试的内容为:添加一个节点,citus分片集群性能是否有明显的提升
2.2、测试用例1(扩容前)
本次测试使用的配置参数如下所示:
warehouses=6 ##表示数据量的大小,大约有11张表、6G的数据量
loadWorkers=18 ##工作进程数目terminals=10 ##表示并发数runTxnsPerTerminal=0
runMins=2
limitTxnsPerMin=3000000 ##每分钟允许的最大事务数,这表示测试过程中每分钟的最大事务负载为 300 万次。如果内存较小,不建议设置特别大。##查看每个节点的分片数
SELECT nodename, COUNT(*)
FROM citus_shards
GROUP BY nodename;nodename | count
---------------+-------192.168.6.110 | 81192.168.6.109 | 81
(2 rows)##大约有300万条数据
SELECT (SELECT COUNT(*) FROM public.bmsql_config) +(SELECT COUNT(*) FROM public.bmsql_customer) +(SELECT COUNT(*) FROM public.bmsql_district) +(SELECT COUNT(*) FROM public.bmsql_history) +(SELECT COUNT(*) FROM public.bmsql_item) +(SELECT COUNT(*) FROM public.bmsql_new_order) +(SELECT COUNT(*) FROM public.bmsql_oorder) +(SELECT COUNT(*) FROM public.bmsql_order_line) +(SELECT COUNT(*) FROM public.bmsql_stock) +(SELECT COUNT(*) FROM public.bmsql_warehouse) AS total_rows;total_rows
------------3093093
(1 row)
2.2.1、创建模式和初始化数据库
##清除环境
./runDatabaseDestroy.sh my_postgres.properties##保证分片平衡
set citus.shard_count = 18;
-- Create table statements
create table bmsql_config (cfg_name varchar(30) primary key,cfg_value varchar(50)
);create table bmsql_warehouse (w_id integer not null,w_ytd decimal(12,2),w_tax decimal(4,4),w_name varchar(10),w_street_1 varchar(20),w_street_2 varchar(20),w_city varchar(20),w_state char(2),w_zip char(9),primary key (w_id)
);create table bmsql_district (d_w_id integer not null,d_id integer not null,d_ytd decimal(12,2),d_tax decimal(4,4),d_next_o_id integer,d_name varchar(10),d_street_1 varchar(20),d_street_2 varchar(20),d_city varchar(20),d_state char(2),d_zip char(9),primary key (d_w_id, d_id)
);create table bmsql_customer (c_w_id integer not null,c_d_id integer not null,c_id integer not null,c_discount decimal(4,4),c_credit char(2),c_last varchar(16),c_first varchar(16),c_credit_lim decimal(12,2),c_balance decimal(12,2),c_ytd_payment decimal(12,2),c_payment_cnt integer,c_delivery_cnt integer,c_street_1 varchar(20),c_street_2 varchar(20),c_city varchar(20),c_state char(2),c_zip char(9),c_phone char(16),c_since timestamp,c_middle char(2),c_data varchar(500),primary key (c_w_id, c_d_id, c_id)
);create table bmsql_history (hist_id integer,h_c_id integer,h_c_d_id integer,h_c_w_id integer,h_d_id integer,h_w_id integer,h_date timestamp,h_amount decimal(6,2),h_data varchar(24)
);create table bmsql_new_order (no_w_id integer not null,no_d_id integer not null,no_o_id integer not null,primary key (no_w_id, no_d_id, no_o_id)
);create table bmsql_oorder (o_w_id integer not null,o_d_id integer not null,o_id integer not null,o_c_id integer,o_carrier_id integer,o_ol_cnt integer,o_all_local integer,o_entry_d timestamp,primary key (o_w_id, o_d_id, o_id)
);create table bmsql_order_line (ol_w_id integer not null,ol_d_id integer not null,ol_o_id integer not null,ol_number integer not null,ol_i_id integer not null,ol_delivery_d timestamp,ol_amount decimal(6,2),ol_supply_w_id integer,ol_quantity integer,ol_dist_info char(24),primary key (ol_w_id, ol_d_id, ol_o_id, ol_number)
);create table bmsql_item (i_id integer not null,i_name varchar(24),i_price decimal(5,2),i_data varchar(50),i_im_id integer,primary key (i_id)
);create table bmsql_stock (s_w_id integer not null,s_i_id integer not null,s_quantity integer,s_ytd integer,s_order_cnt integer,s_remote_cnt integer,s_data varchar(50),s_dist_01 char(24),s_dist_02 char(24),s_dist_03 char(24),s_dist_04 char(24),s_dist_05 char(24),s_dist_06 char(24),s_dist_07 char(24),s_dist_08 char(24),s_dist_09 char(24),s_dist_10 char(24),primary key (s_w_id, s_i_id)
);-- Create distributed table statements
SELECT create_distributed_table('bmsql_config', 'cfg_name');
SELECT create_distributed_table('bmsql_district', 'd_w_id');
SELECT create_distributed_table('bmsql_customer', 'c_w_id');
SELECT create_distributed_table('bmsql_oorder', 'o_w_id');
SELECT create_distributed_table('bmsql_item', 'i_id');
SELECT create_distributed_table('bmsql_warehouse', 'w_id');
select create_distributed_table('bmsql_new_order', 'no_w_id');
select create_distributed_table('bmsql_stock', 's_w_id');
select create_distributed_table('bmsql_order_line', 'ol_w_id');
select create_distributed_table('bmsql_history', 'h_c_id');create index bmsql_customer_idx1on bmsql_customer (c_w_id, c_d_id, c_last, c_first);create unique index bmsql_oorder_idx1on bmsql_oorder (o_w_id, o_d_id, o_carrier_id, o_id)
2.2.2、生成数据
## 生成数据
./runDatabaseBuild.sh my_postgres.properties
2.2.3、调整参数、压力测试
##开始测试
./runBenchmark.sh my_postgres.properties
2.2.4、测试结果输出
##生成具有html的报告,其中也包括系统IO等性能。
./generateReport.sh my_result_2024-09-11_131737/
输出的信息
--查看citus初始节点数
postgres=# select * from pg_dist_node;nodeid | groupid | nodename | nodeport | noderack | hasmetadata | isactive | noderole | nodecluster | metadatasynced | shouldhaveshards
--------+---------+---------------+----------+----------+-------------+----------+----------+-------------+----------------+------------------1 | 0 | 192.168.6.108 | 8432 | default | t | t | primary | default | t | f2 | 1 | 192.168.6.109 | 8432 | default | t | t | primary | default | t | t3 | 2 | 192.168.6.110 | 8432 | default | t | t | primary | default | t | t
(3 rows)--清除环境,删除原来的表
[fbase@postgres run]$ ./runDatabaseDestroy.sh my_postgres.properties
# ------------------------------------------------------------
# Loading SQL file ./sql.common/tableDrops.sql
# ------------------------------------------------------------
drop table bmsql_config;
drop table bmsql_new_order;
drop table bmsql_order_line;
drop table bmsql_oorder;
drop table bmsql_history;
drop table bmsql_customer;
drop table bmsql_stock;
drop table bmsql_item;
drop table bmsql_district;
drop table bmsql_warehouse;
drop sequence bmsql_hist_id_seq;
[fbase@postgres run]$ psql
psql (16.4)
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES128-GCM-SHA256, compression: off)
Type "help" for help.--表格分片已经分发成功
postgres=# select * from citus_tables ;table_name | citus_table_type | distribution_column | colocation_id | table_size | sh
ard_count | table_owner | access_method
------------------+------------------+---------------------+---------------+------------+---
----------+-------------+---------------bmsql_config | distributed | cfg_name | 218 | 400 kB | 32 | fbase | heapbmsql_customer | distributed | c_w_id | 219 | 128 MB | 32 | fbase | heapbmsql_district | distributed | d_w_id | 219 | 544 kB | 32 | fbase | heapbmsql_history | distributed | h_c_id | 219 | 18 MB | 32 | fbase | heapbmsql_item | distributed | i_id | 219 | 14 MB | 32 | fbase | heapbmsql_new_order | distributed | no_w_id | 219 | 5096 kB | 32 | fbase | heapbmsql_oorder | distributed | o_w_id | 219 | 25 MB | 32 | fbase | heapbmsql_order_line | distributed | ol_w_id | 219 | 241 MB | 32 | fbase | heapbmsql_stock | distributed | s_w_id | 219 | 223 MB | 32 | fbase | heapbmsql_warehouse | distributed | w_id | 219 | 544 kB | 32 | fbase | heap
(10 rows)--两个worker节点
postgres=# select distinct nodename from citus_shards;nodename
---------------192.168.6.109192.168.6.110
(2 rows)--生成数据(这里不建议把warehouses配置的特别多,因为生成数据很慢)
[fbase@postgres run]$ ./runDatabaseBuild.sh my_postgres.properties
# ------------------------------------------------------------
# Loading SQL file ./sql.common/tableCreates.sql
# ------------------------------------------------------------
Starting BenchmarkSQL LoadDataWorker 000: Loading ITEM
Worker 001: Loading Warehouse 1
Worker 002: Loading Warehouse 2Worker 000: Loading ITEM done
CWorker 002: Loading Warehouse 2 done
Worker 001: Loading Warehouse 1 done--查看表中数据的分布信息
postgres=# select * from citus_tables ;table_name | citus_table_type | distribution_column | colocation_id | table_size | shard_count | table_owner | access_method
-----------------+------------------+---------------------+---------------+------------+-------------+-------------+---------------bmsql_config | distributed | cfg_name | 22 | 400 kB | 32 | fbase | heapbmsql_customer | distributed | c_w_id | 23 | 21 MB | 32 | fbase | heapbmsql_district | distributed | d_w_id | 23 | 304 kB | 32 | fbase | heapbmsql_item | distributed | i_id | 23 | 14 MB | 32 | fbase | heapbmsql_oorder | distributed | o_w_id | 23 | 4520 kB | 32 | fbase | heapbmsql_warehouse | distributed | w_id | 23 | 304 kB | 32 | fbase | heap
(6 rows)postgres=# \d+List of relationsSchema | Name | Type | Owner | Persistence | Access method | Size | Description
--------+-------------------+----------+-------+-------------+---------------+------------+-------------public | bmsql_config | table | fbase | permanent | heap | 0 bytes | public | bmsql_customer | table | fbase | permanent | heap | 8192 bytes | public | bmsql_district | table | fbase | permanent | heap | 0 bytes | public | bmsql_hist_id_seq | sequence | fbase | permanent | | 8192 bytes | public | bmsql_history | table | fbase | permanent | heap | 2648 kB | public | bmsql_item | table | fbase | permanent | heap | 0 bytes | public | bmsql_new_order | table | fbase | permanent | heap | 440 kB | public | bmsql_oorder | table | fbase | permanent | heap | 0 bytes | public | bmsql_order_line | table | fbase | permanent | heap | 29 MB | public | bmsql_stock | table | fbase | permanent | heap | 34 MB | public | bmsql_warehouse | table | fbase | permanent | heap | 0 bytes | public | citus_schemas | view | fbase | permanent | | 0 bytes | public | citus_tables | view | fbase | permanent | | 0 bytes |
(13 rows)--开始测试
[fbase@postgres run]$ ./runBenchmark.sh my_postgres.properties
15:27:16,888 [main] INFO jTPCC : Term-00,
15:27:16,892 [main] INFO jTPCC : Term-00, +-------------------------------------------------------------+
15:27:16,892 [main] INFO jTPCC : Term-00, BenchmarkSQL v5.0
15:27:16,893 [main] INFO jTPCC : Term-00, +-------------------------------------------------------------+
15:27:16,893 [main] INFO jTPCC : Term-00, (c) 2003, Raul Barbosa
15:27:16,893 [main] INFO jTPCC : Term-00, (c) 2004-2016, Denis Lussier
15:27:16,898 [main] INFO jTPCC : Term-00, (c) 2016, Jan Wieck
15:27:16,898 [main] INFO jTPCC : Term-00, +-------------------------------------------------------------+
15:27:16,898 [main] INFO jTPCC : Term-00,
15:27:16,899 [main] INFO jTPCC : Term-00, db=postgres
15:27:16,899 [main] INFO jTPCC : Term-00, driver=org.postgresql.Driver
15:27:16,899 [main] INFO jTPCC : Term-00, conn=jdbc:postgresql://localhost:8432/postgres
15:27:16,899 [main] INFO jTPCC : Term-00, user=fbase
15:27:16,899 [main] INFO jTPCC : Term-00,
15:27:16,899 [main] INFO jTPCC : Term-00, warehouses=10
15:27:16,899 [main] INFO jTPCC : Term-00, terminals=10
15:27:16,900 [main] INFO jTPCC : Term-00, runMins=3
15:27:16,900 [main] INFO jTPCC : Term-00, limitTxnsPerMin=300000
15:27:16,900 [main] INFO jTPCC : Term-00, terminalWarehouseFixed=true
15:27:16,901 [main] INFO jTPCC : Term-00,
15:27:16,901 [main] INFO jTPCC : Term-00, newOrderWeight=45
15:27:16,901 [main] INFO jTPCC : Term-00, paymentWeight=43
15:27:16,901 [main] INFO jTPCC : Term-00, orderStatusWeight=4
15:27:16,901 [main] INFO jTPCC : Term-00, deliveryWeight=4
15:27:16,901 [main] INFO jTPCC : Term-00, stockLevelWeight=4
15:27:16,901 [main] INFO jTPCC : Term-00,
15:27:16,901 [main] INFO jTPCC : Term-00, resultDirectory=my_result_%tY-%tm-%td_%tH%tM%tS
15:27:16,901 [main] INFO jTPCC : Term-00, osCollectorScript=./misc/os_collector_linux.py
15:27:16,901 [main] INFO jTPCC : Term-00,
15:27:16,925 [main] INFO jTPCC : Term-00, copied my_postgres.properties to my_result_2024-09-13_152716/run.properties
15:27:16,925 [main] INFO jTPCC : Term-00, created my_result_2024-09-13_152716/data/runInfo.csv for runID 22
15:27:16,925 [main] INFO jTPCC : Term-00, writing per transaction results to my_result_2024-09-13_152716/data/result.csv
15:27:16,926 [main] INFO jTPCC : Term-00, osCollectorScript=./misc/os_collector_linux.py
15:27:16,926 [main] INFO jTPCC : Term-00, osCollectorInterval=1
15:27:16,926 [main] INFO jTPCC : Term-00, osCollectorSSHAddr=null
15:27:16,926 [main] INFO jTPCC : Term-00, osCollectorDevices=net_ens34 blk_sda
15:27:17,019 [main] INFO jTPCC : Term-00,
15:27:17,109 [main] INFO jTPCC : Term-00, C value for C_LAST during load: 32
15:27:17,110 [main] INFO jTPCC : Term-00, C value for C_LAST this run: 116
15:27:17,110 [main] INFO jTPCC : Term-00,
Term-00, Running Average tpmTOTAL: 10531.62 Current tpmTOTAL: 140244 Memory Usage: 38M08:43:03,249 [Thread-9] INFO jTPCC : Term-00,
08:43:03,249 [Thread-9] INFO jTPCC : Term-00,
08:43:03,250 [Thread-9] INFO jTPCC : Term-00, Measured tpmC (NewOrders) = 4725.59
08:43:03,250 [Thread-9] INFO jTPCC : Term-00, Measured tpmTOTAL = 10512.15
08:43:03,250 [Thread-9] INFO jTPCC : Term-00, Session Start = 2024-09-19 08:41:02
08:43:03,250 [Thread-9] INFO jTPCC : Term-00, Session End = 2024-09-19 08:43:03
08:43:03,250 [Thread-9] INFO jTPCC : Term-00, Transaction Count = 21123
[fbase@postgres run]$
测试报告分析
在进行TPC-C(Transaction Processing Performance Council Benchmark C)测试时,通常需要关注以下几个主要指标:
- tpmC (Transactions Per Minute for New Orders): 表示每分钟处理的新订单事务数。
- tpmTOTAL (Total Transactions Per Minute): 表示每分钟处理的所有事务的总数。
- Session Start Time: 测试会话的开始时间。
- Session End Time: 测试会话的结束时间。
- Transaction Count: 测试会话期间处理的事务总数。
根据提供的测试报告,我们可以将这些指标整理到一个表格中:
指标 | 值 | 描述 |
---|---|---|
tpmC | 4725.59 | 新订单事务每分钟数 |
tpmTOTAL | 10512.15 | 总事务每分钟数 |
Session Start Time | 2024-09-18 15:34:14 | 会话开始时间 |
Session End Time | 2024-09-18 15:36:14 | 会话结束时间 |
Transaction Count | 21123 | 事务总数 |
这个表格展示了测试的关键性能指标,帮助了解数据库在TPC-C负载下的性能表现。
生成具有HTML的报告
测试结束后,run目录下会生成一个新目录,它的命名格式为 my_result_%tY-%tm-%td_%tH%tM%tS。
使用 generateReport.sh my_result_* 脚本创建具有图形的 HTML 文件:
[fbase@postgres run]$ ./generateReport.sh my_result_2024-09-12_110847/
Generating my_result_2024-09-12_110847//tpm_nopm.png ... OK
Generating my_result_2024-09-12_110847//latency.png ... OK
Generating my_result_2024-09-12_110847//cpu_utilization.png ... OK
Generating my_result_2024-09-12_110847//dirty_buffers.png ... OK
Generating my_result_2024-09-12_110847//blk_sda_iops.png ... OK
Generating my_result_2024-09-12_110847//blk_sda_kbps.png ... OK
Generating my_result_2024-09-12_110847//net_ens34_iops.png ... OK
Generating my_result_2024-09-12_110847//net_ens34_kbps.png ... OK
Generating my_result_2024-09-12_110847//report.html ... OK
[fbase@postgres run]$
测试结果展示
2.3、测试用例2:扩容
使用的命令
##使用命令添加节点
select master_add_node('192.168.6.107',5432);##创建复制标识
alter table bmsql_history REPLICA IDENTITY full;##重新分配分片
select * from rebalance_table_shards();##验证分配完成
select distinct nodename,count(*) from citus_shards group by nodename;
输出的信息
--添加节点前的分片状态
postgres=# select distinct nodename from citus_shards;nodename
---------------192.168.6.110192.168.6.109
(2 rows)
--执行开始重新分配命令
postgres=# select * from rebalance_table_shards();
NOTICE: Moving shard 112323 from 192.168.6.110:8432 to 192.168.6.107:5432 ...
NOTICE: Moving shard 112320 from 192.168.6.109:8432 to 192.168.6.107:5432 ...
NOTICE: Moving shard 112352 from 192.168.6.109:8432 to 192.168.6.107:5432 ...
NOTICE: Moving shard 112357 from 192.168.6.110:8432 to 192.168.6.107:5432 ...rebalance_table_shards
------------------------(1 row)Time: 22610.374 ms (00:22.610)--验证分配完成
postgres=# select distinct nodename,count(*) from citus_shards group by nodename;nodename | count
---------------+-------192.168.6.109 | 45192.168.6.107 | 63192.168.6.110 | 54
(3 rows)
2.4、测试用例3(扩容后)
本次测试使用的配置参数如下所示:
warehouses=10 ##表示数据量的大小,大约有11张表、1G的数据量
loadWorkers=20 ##工作进程数目terminals=10 ##表示并发数runTxnsPerTerminal=0
runMins=3
limitTxnsPerMin=3000000 ##每分钟允许的最大事务数,这表示测试过程中每分钟的最大事务负载为 300 万次。如果内存较小,不建议设置特别大。##查看每个节点的分片数
select nodename,count(*) from citus_shards group by nodename;nodename | count
---------------+-------192.168.6.107 | 36192.168.6.109 | 72192.168.6.110 | 54
(3 rows)##大约有300万条数据
SELECT (SELECT COUNT(*) FROM public.bmsql_config) +(SELECT COUNT(*) FROM public.bmsql_customer) +(SELECT COUNT(*) FROM public.bmsql_district) +(SELECT COUNT(*) FROM public.bmsql_history) +(SELECT COUNT(*) FROM public.bmsql_item) +(SELECT COUNT(*) FROM public.bmsql_new_order) +(SELECT COUNT(*) FROM public.bmsql_oorder) +(SELECT COUNT(*) FROM public.bmsql_order_line) +(SELECT COUNT(*) FROM public.bmsql_stock) +(SELECT COUNT(*) FROM public.bmsql_warehouse) AS total_rows;total_rows
------------3093093
(1 row)
2.4.1、调整参数、压力测试
必要的时候,可以修改my_postgres.properties
参数文件
##执行测试命令
./runBenchmark.sh my_postgres.properties
2.4.2、测试结果输出
##生成具有html的报告,其中也包括系统IO等性能。
./generateReport.sh my_result_2024-09-11_131737/
信息输出
[fbase@postgres run]$ ./runBenchmark.sh my_postgres.properties
15:44:32,740 [main] INFO jTPCC : Term-00,
15:44:32,742 [main] INFO jTPCC : Term-00, +-------------------------------------------------------------+
15:44:32,742 [main] INFO jTPCC : Term-00, BenchmarkSQL v5.0
15:44:32,743 [main] INFO jTPCC : Term-00, +-------------------------------------------------------------+
15:44:32,743 [main] INFO jTPCC : Term-00, (c) 2003, Raul Barbosa
15:44:32,743 [main] INFO jTPCC : Term-00, (c) 2004-2016, Denis Lussier
15:44:32,745 [main] INFO jTPCC : Term-00, (c) 2016, Jan Wieck
15:44:32,745 [main] INFO jTPCC : Term-00, +-------------------------------------------------------------+
15:44:32,745 [main] INFO jTPCC : Term-00,
15:44:32,745 [main] INFO jTPCC : Term-00, db=postgres
15:44:32,745 [main] INFO jTPCC : Term-00, driver=org.postgresql.Driver
15:44:32,745 [main] INFO jTPCC : Term-00, conn=jdbc:postgresql://localhost:8432/postgres
15:44:32,745 [main] INFO jTPCC : Term-00, user=fbase
15:44:32,745 [main] INFO jTPCC : Term-00,
15:44:32,745 [main] INFO jTPCC : Term-00, warehouses=10
15:44:32,745 [main] INFO jTPCC : Term-00, terminals=10
15:44:32,747 [main] INFO jTPCC : Term-00, runMins=3
15:44:32,747 [main] INFO jTPCC : Term-00, limitTxnsPerMin=300000
15:44:32,747 [main] INFO jTPCC : Term-00, terminalWarehouseFixed=true
15:44:32,747 [main] INFO jTPCC : Term-00,
15:44:32,747 [main] INFO jTPCC : Term-00, newOrderWeight=45
15:44:32,747 [main] INFO jTPCC : Term-00, paymentWeight=43
15:44:32,747 [main] INFO jTPCC : Term-00, orderStatusWeight=4
15:44:32,747 [main] INFO jTPCC : Term-00, deliveryWeight=4
15:44:32,747 [main] INFO jTPCC : Term-00, stockLevelWeight=4
15:44:32,747 [main] INFO jTPCC : Term-00,
15:44:32,747 [main] INFO jTPCC : Term-00, resultDirectory=my_result_%tY-%tm-%td_%tH%tM%tS
15:44:32,748 [main] INFO jTPCC : Term-00, osCollectorScript=./misc/os_collector_linux.py
15:44:32,748 [main] INFO jTPCC : Term-00,
15:44:32,758 [main] INFO jTPCC : Term-00, copied my_postgres.properties to my_result_2024-09-13_154432/run.properties
15:44:32,758 [main] INFO jTPCC : Term-00, created my_result_2024-09-13_154432/data/runInfo.csv for runID 23
15:44:32,758 [main] INFO jTPCC : Term-00, writing per transaction results to my_result_2024-09-13_154432/data/result.csv
15:44:32,759 [main] INFO jTPCC : Term-00, osCollectorScript=./misc/os_collector_linux.py
15:44:32,759 [main] INFO jTPCC : Term-00, osCollectorInterval=1
15:44:32,759 [main] INFO jTPCC : Term-00, osCollectorSSHAddr=null
15:44:32,759 [main] INFO jTPCC : Term-00, osCollectorDevices=net_ens34 blk_sda
15:44:32,822 [main] INFO jTPCC : Term-00,
15:44:32,896 [main] INFO jTPCC : Term-00, C value for C_LAST during load: 32
15:44:32,897 [main] INFO jTPCC : Term-00, C value for C_LAST this run: 131
15:44:32,897 [main] INFO jTPCC : Term-00,
Term-00, Running Average tpmTOTAL: 11370.40 Current tpmTOTAL: 151512 Memory Usage: 35M08:51:35,353 [Thread-24] INFO jTPCC : Term-00,
08:51:35,353 [Thread-24] INFO jTPCC : Term-00,
08:51:35,354 [Thread-24] INFO jTPCC : Term-00, Measured tpmC (NewOrders) = 5102.58
08:51:35,354 [Thread-24] INFO jTPCC : Term-00, Measured tpmTOTAL = 11363.44
08:51:35,354 [Thread-24] INFO jTPCC : Term-00, Session Start = 2024-09-19 08:49:34
08:51:35,354 [Thread-24] INFO jTPCC : Term-00, Session End = 2024-09-19 08:51:35
08:51:35,356 [Thread-24] INFO jTPCC : Term-00, Transaction Count = 22799
[fbase@postgres run]$
测试结果分析
根据提供的测试报告,我们可以将这些指标整理到一个表格中:
指标 | 值 | 描述 |
---|---|---|
tpmC | 5102.58 | 新订单事务每分钟数 |
tpmTOTAL | 11363.44 | 总事务每分钟数 |
Session Start Time | 2024-09-13 15:44:32 | 会话开始时间 |
Session End Time | 2024-09-13 15:47:33 | 会话结束时间 |
Transaction Count | 22799 | 事务总数 |
这个表格展示了测试的关键性能指标,帮助了解数据库在TPC-C负载下的性能表现。
HTML的图片暂时先不展示了
2.5、测试结果汇总
综合两次测试结果来看,正常情况下添加一个节点性能会线性增长,由于条件有限(服务器无法承载大量的数据),没有达到预期。
三、TPCH测试
测试过程
生产测试数据->压测-> 扩容-> 压测
3.1、测试用例描述
一定要修改citus为OlAP模式set citus.enable_repartition_joins = on;set citus.task_executor_type='task-tracker';set citus.task_executor_type='real-time'; 使得分片更均衡
SELECT master_set_node_property('192.168.6.108', 8432, 'shouldhaveshards', true);
测试用例1比测试用例2少一个节点,测试的目的为:添加一个节点,citus分片集群性能是否有明显的提升
测试的数据量
##查看每个节点的分片数
select nodename,count(*) from citus_shards group by nodename;nodename | count
---------------+-------192.168.6.108 | 28192.168.6.110 | 26192.168.6.109 | 28
(3 rows)##大约有86万条数据
SELECT(SELECT COUNT(*) FROM t_user) +(SELECT COUNT(*) FROM t_user_log_20191212) +(SELECT COUNT(*) FROM customer) +(SELECT COUNT(*) FROM lineitem) +(SELECT COUNT(*) FROM nation) +(SELECT COUNT(*) FROM orders) +(SELECT COUNT(*) FROM part) +(SELECT COUNT(*) FROM partsupp) +(SELECT COUNT(*) FROM region) +(SELECT COUNT(*) FROM supplier) AS total_rows;total_rows
------------8661245
(1 row)
3.2、测试用例1(扩容前)
3.2.1、初始化数据库、创建表格
DROP TABLE IF EXISTS public.citus_schemas CASCADE;
DROP TABLE IF EXISTS public.citus_tables CASCADE;
DROP TABLE IF EXISTS public.customer CASCADE;
DROP TABLE IF EXISTS public.lineitem CASCADE;
DROP TABLE IF EXISTS public.nation CASCADE;
DROP TABLE IF EXISTS public.orders CASCADE;
DROP TABLE IF EXISTS public.part CASCADE;
DROP TABLE IF EXISTS public.partsupp CASCADE;
DROP TABLE IF EXISTS public.region CASCADE;
DROP TABLE IF EXISTS public.supplier CASCADE;CREATE TABLE NATION ( N_NATIONKEY INTEGER NOT NULL,N_NAME CHAR(25) NOT NULL,N_REGIONKEY INTEGER NOT NULL,N_COMMENT VARCHAR(152));CREATE TABLE REGION ( R_REGIONKEY INTEGER NOT NULL,R_NAME CHAR(25) NOT NULL,R_COMMENT VARCHAR(152));CREATE TABLE PART ( P_PARTKEY INTEGER NOT NULL,P_NAME VARCHAR(55) NOT NULL,P_MFGR CHAR(25) NOT NULL,P_BRAND CHAR(10) NOT NULL,P_TYPE VARCHAR(25) NOT NULL,P_SIZE INTEGER NOT NULL,P_CONTAINER CHAR(10) NOT NULL,P_RETAILPRICE DECIMAL(15,2) NOT NULL,P_COMMENT VARCHAR(23) NOT NULL );CREATE TABLE SUPPLIER ( S_SUPPKEY INTEGER NOT NULL,S_NAME CHAR(25) NOT NULL,S_ADDRESS VARCHAR(40) NOT NULL,S_NATIONKEY INTEGER NOT NULL,S_PHONE CHAR(15) NOT NULL,S_ACCTBAL DECIMAL(15,2) NOT NULL,S_COMMENT VARCHAR(101) NOT NULL);CREATE TABLE CUSTOMER ( C_CUSTKEY INTEGER NOT NULL,C_NAME VARCHAR(25) NOT NULL,C_ADDRESS VARCHAR(40) NOT NULL,C_NATIONKEY INTEGER NOT NULL,C_PHONE CHAR(15) NOT NULL,C_ACCTBAL DECIMAL(15,2) NOT NULL,C_MKTSEGMENT CHAR(10) NOT NULL,C_COMMENT VARCHAR(117) NOT NULL);-- For table REGION
ALTER TABLE REGION
ADD PRIMARY KEY (R_REGIONKEY);-- For table NATION
ALTER TABLE NATION
ADD PRIMARY KEY (N_NATIONKEY);ALTER TABLE NATION
ADD FOREIGN KEY (N_REGIONKEY) references REGION;-- For table PART
ALTER TABLE PART
ADD PRIMARY KEY (P_PARTKEY);-- For table SUPPLIER
ALTER TABLE SUPPLIER
ADD PRIMARY KEY (S_SUPPKEY);ALTER TABLE SUPPLIER
ADD FOREIGN KEY (S_NATIONKEY) references NATION;-- For table CUSTOMER
ALTER TABLE CUSTOMER
ADD PRIMARY KEY (C_CUSTKEY);ALTER TABLE CUSTOMER
ADD FOREIGN KEY (C_NATIONKEY) references NATION;-- 将 'nation' 表创建为参考表
SELECT create_reference_table('nation');-- 将 'part' 表创建为参考表
SELECT create_reference_table('part');-- 将 'region' 表创建为参考表
SELECT create_reference_table('region');-- 将 'supplier' 表创建为参考表
SELECT create_reference_table('supplier');CREATE TABLE PARTSUPP ( PS_PARTKEY INTEGER NOT NULL,PS_SUPPKEY INTEGER NOT NULL,PS_AVAILQTY INTEGER NOT NULL,PS_SUPPLYCOST DECIMAL(15,2) NOT NULL,PS_COMMENT VARCHAR(199) NOT NULL );-- For table PARTSUPP
ALTER TABLE PARTSUPP
ADD PRIMARY KEY (PS_PARTKEY, PS_SUPPKEY);-- For table PARTSUPP
ALTER TABLE PARTSUPP
ADD FOREIGN KEY (PS_SUPPKEY) references SUPPLIER;ALTER TABLE PARTSUPP
ADD FOREIGN KEY (PS_PARTKEY) references PART;-- 将表设置为参考表
SELECT create_reference_table('partsupp');SELECT create_reference_table('customer');CREATE TABLE ORDERS ( O_ORDERKEY INTEGER NOT NULL,O_CUSTKEY INTEGER NOT NULL,O_ORDERSTATUS CHAR(1) NOT NULL,O_TOTALPRICE DECIMAL(15,2) NOT NULL,O_ORDERDATE DATE NOT NULL,O_ORDERPRIORITY CHAR(15) NOT NULL, O_CLERK CHAR(15) NOT NULL, O_SHIPPRIORITY INTEGER NOT NULL,O_COMMENT VARCHAR(79) NOT NULL);-- For table ORDERS
ALTER TABLE ORDERS
ADD PRIMARY KEY (O_ORDERKEY);-- For table ORDERS
ALTER TABLE ORDERS
ADD FOREIGN KEY (O_CUSTKEY) references CUSTOMER;-- 将表设置为分布式表
select create_distributed_table('orders', 'o_orderkey');CREATE TABLE LINEITEM ( L_ORDERKEY INTEGER NOT NULL,L_PARTKEY INTEGER NOT NULL,L_SUPPKEY INTEGER NOT NULL,L_LINENUMBER INTEGER NOT NULL,L_QUANTITY DECIMAL(15,2) NOT NULL,L_EXTENDEDPRICE DECIMAL(15,2) NOT NULL,L_DISCOUNT DECIMAL(15,2) NOT NULL,L_TAX DECIMAL(15,2) NOT NULL,L_RETURNFLAG CHAR(1) NOT NULL,L_LINESTATUS CHAR(1) NOT NULL,L_SHIPDATE DATE NOT NULL,L_COMMITDATE DATE NOT NULL,L_RECEIPTDATE DATE NOT NULL,L_SHIPINSTRUCT CHAR(25) NOT NULL,L_SHIPMODE CHAR(10) NOT NULL,L_COMMENT VARCHAR(44) NOT NULL);-- For table LINEITEM
ALTER TABLE LINEITEM
ADD PRIMARY KEY (L_ORDERKEY, L_LINENUMBER);-- For table LINEITEM
ALTER TABLE LINEITEM
ADD FOREIGN KEY (L_ORDERKEY) references ORDERS;--设置为分布表
select create_distributed_table('lineitem', 'l_orderkey');ALTER TABLE LINEITEM
ADD FOREIGN KEY (L_PARTKEY, L_SUPPKEY) references PARTSUPP;
3.2.2、调整参数、生成数据
--生成数据./dbgen -s 1 -f -v-s 1 表示生成1G数据
-f 覆盖之前产生的文件--多(8)个线程生成数据
#!/bin/sh
./dbgen -vf -s 500 -S 1 -C 8 &
./dbgen -vf -s 500 -S 2 -C 8 &
./dbgen -vf -s 500 -S 3 -C 8 &
./dbgen -vf -s 500 -S 4 -C 8 &
./dbgen -vf -s 500 -S 5 -C 8 &
./dbgen -vf -s 500 -S 6 -C 8 &
./dbgen -vf -s 500 -S 7 -C 8 &
./dbgen -vf -s 500 -S 8 -C 8 &##转换成csv格式
for i in `ls *.tbl`;do sed 's/|$//' $i > ${i/tbl/csv};echo $i;done;##查看生成的数据
[fbase@postgres dbgen]$ ls *.tbl
customer.tbl nation.tbl partsupp.tbl region.tbl
lineitem.tbl orders.tbl part.tbl supplier.tbl
[fbase@postgres dbgen]$ ###导入数据脚本
$ cat import_tables.sh #!/bin/bash
# 确保脚本接收到一个参数
if [ "$#" -ne 1 ]; thenecho "Usage: $0 <filename>"exit 1
fi
file=$1
# 确保输入的文件存在
if [ ! -f "$file" ]; thenecho "File $file does not exist."exit 1
fi
# 提取文件名(不包括扩展名)
name=$(basename "$file" .tbl)
# 处理文件
echo "Processing $file"
sed -i 's/|$//' "$file"
psql -c "COPY $name FROM '$(pwd)/$file' DELIMITER '|' ENCODING 'LATIN1';"##导入顺序
sh import_tables.sh region.tbl
sh import_tables.sh nation.tbl
sh import_tables.sh part.tbl
sh import_tables.sh supplier.tbl
sh import_tables.sh customer.tbl
sh import_tables.sh partsupp.tbl
sh import_tables.sh orders.tbl
sh import_tables.sh lineitem.tbl##添加索引##查看分布式集群的分片数
postgres=# SELECT nodename, COUNT(*)
FROM citus_shards
GROUP BY nodename;nodename | count
---------------+-------192.168.6.108 | 28192.168.6.110 | 26192.168.6.109 | 28
(3 rows)
3.2.3、调整参数、压力测试
生成SQL查询语句
##生成SQL查询语句for i in {1..22}
do
name="./sql/d$i.sql"
echo $name
./qgen -d $i >$name
done
编写查询脚本,自动获取SQL响应时间
##编写查询脚本,自动获取SQL响应时间
cat execute.sh #!/bin/bash# 定义数据库名称和结果目录
DB_NAME="postgres"
RESULT_DIR="./result"# 确保结果目录存在
mkdir -p $RESULT_DIR# 执行 SQL 文件
for i in {1..21}
doif [[ $i -ne 17 && $i -ne 20 ]]thenSQL_FILE="d${i}.sql"RESULT_FILE="${RESULT_DIR}/result${i}.txt"echo "Running $SQL_FILE..."psql -d $DB_NAME -f $SQL_FILE > $RESULT_FILEelseecho "Skipping d${i}.sql"fi
done# 提取出SQL语句的响应时间 for i in {1..21}
doRESULT_FILE="${RESULT_DIR}/result${i}.txt"if [[ $i -eq 15 ]]; thenecho -n "Q$i response " && tail -n 3 $RESULT_FILE | head -n 1elif [[ $i -ne 17 && $i -ne 20 ]]; thenecho -n "Q$i response " && tail -n 1 $RESULT_FILEfi
done
开启nmon的时候测试tpch
##开启检测进程
[root@postgres ~]# nmon -f -s 2 -c 100 -m /home/pg/nmonlog##查看状态
[root@postgres ~]# ps -ef|grep nmon
3.2.4、输出测试结果
输出信息
[fbase@postgres dbgen]$ sh import_tables.sh part.tbl
Processing part.tbl
COPY 200000
[fbase@postgres dbgen]$ sh import_tables.sh supplier.tbl
Processing supplier.tbl
COPY 10000
[fbase@postgres dbgen]$ sh import_tables.sh customer.tbl
Processing customer.tbl
COPY 150000
[fbase@postgres dbgen]$ sh import_tables.sh partsupp.tbl
Processing partsupp.tbl
COPY 800000
[fbase@postgres dbgen]$ sh import_tables.sh orders.tbl
Processing orders.tbl
COPY 1500000
[fbase@postgres dbgen]$ sh import_tables.sh lineitem.tbl
Processing lineitem.tbl
COPY 6001215
[fbase@postgres dbgen]$ sh execute.sh
Running d1.sql...
Running d2.sql...
Running d3.sql...
Running d4.sql...
Running d5.sql...
Running d6.sql...
Running d7.sql...
Running d8.sql...
Running d9.sql...
Running d10.sql...
Running d11.sql...
Running d12.sql...
Running d13.sql...
Running d14.sql...
Running d15.sql...
Running d16.sql...
Skipping d17.sql
Running d18.sql...
Running d19.sql...
Skipping d20.sql
Running d21.sql...
Q1 response Time: 1151.499 ms (00:01.151)
Q2 response Time: 225.830 ms
Q3 response Time: 474.648 ms
Q4 response Time: 342.354 ms
Q5 response Time: 645.930 ms
Q6 response Time: 234.146 ms
Q7 response Time: 378.565 ms
Q8 response Time: 689.490 ms
Q9 response Time: 865.872 ms
Q10 response Time: 567.329 ms
Q11 response Time: 134.626 ms
Q12 response Time: 332.472 ms
Q13 response Time: 5030.917 ms (00:05.031)
Q14 response Time: 265.414 ms
Q15 response Time: 1134.336 ms (00:01.134)
Q16 response Time: 273.432 ms
Q18 response Time: 808.995 ms
Q19 response Time: 412.101 ms
Q21 response Time: 371.585 ms
nmon系统使用收集指标
可以使用nmonchart
生成html格式的,但是需要VPN去Google浏览器渲染图片,也可以下载nmon_analyser_v
分析组件,但是需要商业版的wps才可以打开他。
现在生成的nmon文件到本地windows,用官方提供的分析工具打开,设置excel宏打开。
打开nmon分析文件
3.3、测试用例2:扩容
添加节点到citus集群,执行命令
##添加节点
select citus_add_node('192.168.6.107',5432);
##平衡分片
select rebalance_table_shards();
##查看个个节点的分片数
select nodename,count(*) from citus_shards group by nodename;
输出的信息
##添加节点
postgres=# select citus_add_node('192.168.6.107',5432);citus_add_node
----------------16
(1 row)##平衡分片
postgres=# select rebalance_table_shards();
NOTICE: replicating reference table 'nation' to 192.168.6.107:5432 ...
NOTICE: Moving shard 116770 from 192.168.6.108:8432 to 192.168.6.107:5432 ...
NOTICE: Moving shard 116774 from 192.168.6.109:8432 to 192.168.6.107:5432 ...
NOTICE: Moving shard 116776 from 192.168.6.108:8432 to 192.168.6.107:5432 ...
NOTICE: Moving shard 116754 from 192.168.6.110:8432 to 192.168.6.107:5432 ...
NOTICE: Moving shard 116771 from 192.168.6.109:8432 to 192.168.6.107:5432 ...
NOTICE: Moving shard 116758 from 192.168.6.108:8432 to 192.168.6.107:5432 ...
NOTICE: Moving shard 116775 from 192.168.6.110:8432 to 192.168.6.107:5432 ...
NOTICE: Moving shard 116753 from 192.168.6.109:8432 to 192.168.6.107:5432 ...rebalance_table_shards
------------------------(1 row)Time: 11652.738 ms (00:11.653)
##查看个个节点的分片数
postgres=# select nodename,count(*) from citus_shards group by nodename;nodename | count
---------------+-------192.168.6.108 | 22192.168.6.107 | 22192.168.6.110 | 22192.168.6.109 | 22
(4 rows)
3.4、测试用例3(扩容后)
执行命令,获取查询语句响应时间
##执行测试脚本,获取查询语句响应时间
sh execute.sh
输出的信息
##执行测试脚本,获取查询语句响应时间
[fbase@postgres sql]$ sh execute.sh
Running d1.sql...
Running d2.sql...
Running d3.sql...
Running d4.sql...
Running d5.sql...
Running d6.sql...
Running d7.sql...
Running d8.sql...
Running d9.sql...
Running d10.sql...
Running d11.sql...
Running d12.sql...
Running d13.sql...
Running d14.sql...
Running d15.sql...
Running d16.sql...
Skipping d17.sql
Running d18.sql...
Running d19.sql...
Skipping d20.sql
Running d21.sql...
Q1 response Time: 1169.370 ms (00:01.169)
Q2 response Time: 224.707 ms
Q3 response Time: 446.181 ms
Q4 response Time: 318.128 ms
Q5 response Time: 628.814 ms
Q6 response Time: 258.494 ms
Q7 response Time: 363.685 ms
Q8 response Time: 580.927 ms
Q9 response Time: 835.688 ms
Q10 response Time: 545.771 ms
Q11 response Time: 137.307 ms
Q12 response Time: 311.096 ms
Q13 response Time: 5671.297 ms (00:05.671)
Q14 response Time: 261.195 ms
Q15 response Time: 964.076 ms
Q16 response Time: 274.727 ms
Q18 response Time: 797.505 ms
Q19 response Time: 375.844 ms
Q21 response Time: 365.105 ms
3.5、测试结果汇总
以下是整理后的数据表格,展示了扩容前后的关键指标对比:
扩容前 vs 扩容后 数据对比表
阶段 | 指标 | 扩容前 | 扩容后 | 提升/下降百分比 |
---|---|---|---|---|
数据量 | 数据量 | 8661245(86万) | 8661245(86万) | 0% |
Q1查询响应时间 | 1151.499 ms (00:01.151) | 1169.370 ms (00:01.169) | -1.05% | |
Q2查询响应时间 | 225.830 ms | 224.707 ms | 0.5% | |
Q3查询响应时间 | 474.648 ms | 446.181 ms | 5.98% | |
Q4查询响应时间 | 342.354 ms | 318.128 ms | 7.07% | |
Q5查询响应时间 | 645.930 ms | 628.814 ms | 2.28% | |
Q6查询响应时间 | 234.146 ms | 258.494 ms | -10.41% | |
Q7查询响应时间 | 378.565 ms | 363.685 ms | 3.92% | |
Q8查询响应时间 | 689.490 ms | 580.927 ms | 15.75% | |
Q9查询响应时间 | 865.872 ms | 835.688 ms | 3.48% | |
Q10查询响应时间 | 567.329 ms | 545.771 ms | 3.79% | |
Q11查询响应时间 | 134.626 ms | 137.307 ms | -1.99% | |
Q12查询响应时间 | 332.472 ms | 311.096 ms | 6.39% | |
Q13查询响应时间 | 5030.917 ms (00:05.031) | 5671.297 ms (00:05.671) | -12.85% | |
Q14查询响应时间 | 265.414 ms | 261.195 ms | 1.65% | |
Q15查询响应时间 | 1134.336 ms (00:01.134) | 964.076 ms | 15% | |
Q16查询响应时间 | 273.432 ms | 274.727 ms | -0.47% | |
Q18查询响应时间 | 808.995 ms | 797.505 ms | 1.84% | |
Q19查询响应时间 | 412.101 ms | 375.844 ms | 8.76% | |
Q21查询响应时间 | 371.585 ms | 365.105 ms | 1.3% | |
Citus集群 | 节点数 | 1✖Coordinator + 2✖Worker | 1✖Coordinator + 3✖Worker | - |
个个节点分片数 | nodename | count 192.168.6.108 | 28 192.168.6.110 | 26 192.168.6.109 | 28 | nodename | count 192.168.6.108 | 22 192.168.6.107 | 22 192.168.6.110 | 22 192.168.6.109 | 22 | - |
扩容后重新分配分片持续时间:Time: 11652.738 ms (00:11.653)
总结
- 扩容后,多个查询的响应时间显著提升,尤其是Q15(提升15%)、Q8(提升15.75%)和Q4(提升7.07%),显示出明显的性能改进。
- 尽管部分查询如Q6和Q13的响应时间有所增加,但整体上大多数查询性能均有所提升。
- 整体来看,扩容后的系统在查询响应效率上表现优越,尤其在提升幅度较大的查询上,系统性能得到了明显改善。
TPCH度量指标
测试中测量的基础数据都与执行时间有关,这些时间又可分为:装载数据的每一步操作时间、每个查询执行时间和每个更新操作执行时间,由这些时间可计算出:数据装载时间、QphH@Size, Power@Size, and Throughput@Size.
相关文章:

Citus的TPCC、TPCH性能测试
Citus的TPCC、TPCH性能测试 文章目录 Citus的TPCC、TPCH性能测试测试的目的适用范围测试环境架构信息硬件配置操作系统软件版本 测试结果TPCC测试测试结果TPCH测试测试结果 一、环境部署1.1、安装BenchmarkSQL1.2、PostgreSQL安装1.3、nmon部署1.4、TPC-H测试的生成数据工具安装…...

蓝桥杯---颜色分类(leetcode第75题)题解
文章目录 1.问题重述2.思路分析3.代码分析 1.问题重述 颜色分类,实际上就是赋予了三种颜色不同的数值,0,1,2分别代表的就是一个类型的颜色,我们题目说的是对于颜色进行分类,实际上就是对于0,1,2进行分类,我们把很多数…...

C语言基础13:循环结构 for和while
循环结构 什么是循环结构 代码在满足某种条件的前提下,重复执行,就叫做循环结构。 循环的分类 无限循环:其实就是死循环,程序设计中尽量避免无限循环,如果非要使用,那么这个循环一定要在可控范围内。有…...

六西格玛设计培训如何破解风电设备制造质量与成本困局
2023年,中国风电行业装机容量突破4.3亿千瓦,稳居全球第一,但高速扩张背后暗藏隐忧: 质量痛点:叶片开裂、齿轮箱故障等缺陷频发,运维成本占项目全生命周期成本超30%;成本压力:原材料…...
【Android开发】安卓手机APP使用机器学习进行QR二维码识别
前言:本项目是一个 Android 平台的二维码扫描应用,具备二维码扫描和信息展示功能。借助 AndroidX CameraX 库实现相机的预览、图像捕获与分析,使用 Google ML Kit 进行二维码识别。为方便大家了解项目全貌,以下将介绍项目核心代码文件 MainActivity.java 和 AndroidManifes…...

Zabbix-监控SSL证书有效期
背景 项目需要,需要监控所有的SSL证书的有效期,因此需要自定义一个监控项 实现 创建自定义脚本 在Zabbix的scripts目录(/etc/zabbix/scripts/)下创建一个新的shell脚本check_ssl.sh,内容如下 #!/bin/bash time$(echo | openssl s_client…...

生成式聊天机器人 -- 基于Pytorch + Global Attention + 双向 GRU 实现的SeqToSeq模型 -- 上
生成式聊天机器人 -- 基于Pytorch Global Attention 双向 GRU 实现的SeqToSeq模型 -- 上 前言数据预处理下载并加载数据原始数据格式化数据清洗与字典映射转换为模型需要的数据格式 SeqToSeq 模型Encoder 编码器Decoder 解码器全局注意力机制解码器实现 前言 本文会介绍使用…...
Kickstart自动化安装过程中自动选择较小的磁盘安装操作系统
Kickstart自动化安装过程中自动选择较小的磁盘安装操作系统 需求 在实际生成操作过程中,一般会遇到物理服务器存在多块盘的情况。 安装过程中,磁盘的标签是随机分配的,并不是空间较小的盘,就会使用较小的磁盘标签 而需求往往需要…...

基于进化式大语言模型的下一代漏洞挖掘范式:智能对抗与自适应攻防体系
摘要 本文提出了一种基于进化式大语言模型(Evolutionary LLM)的智能漏洞挖掘框架,突破了传统静态分析的局限,构建了具备对抗性思维的动态攻防体系。通过引入深度强化学习与多模态感知机制,实现了漏洞挖掘过程的自适应进化,在RCE、SQLi、XXE等关键漏洞类型的检测中达到97…...

游戏引擎学习第99天
仓库:https://gitee.com/mrxiao_com/2d_game_2 黑板:制作一些光场(Light Field) 当前的目标是为游戏添加光照系统,并已完成了法线映射(normal maps)的管道,但还没有创建可以供这些正常映射采样的光场。为了继续推进&…...
脉冲当量含义
前言: 大家好,我是上位机马工,硕士毕业4年年入40万,目前在一家自动化公司担任软件经理,从事C#上位机软件开发8年以上!我们在开发C#的运动控制程序的时候,一个必要的步骤就是设置每个轴的脉冲当…...

docker compose部署flink集群
本次部署2个jobmanager和3个taskmanager 一、部署zookeeper集群 flink使用zookeeper用作高可用 部署集群参考:docker compose部署zookeeper集群-CSDN博客 二、创建目录及配置文件 创建timezone文件,内容填写Asia/Shanghai 手动创建目录:…...
docker compose快速部署kafka-connect集群
先部署kafka集群,启动 参考:docker compose部署kafka集群-CSDN博客 创建timezone文件,内容填写Asia/Shanghai 再部署kafka-connect集群 networks: net: external: true services: kafka-connect1: restart: always image:…...
【核心特性】Go 模块化开发入门(go mod 深度解析)
Go 模块化开发入门(go mod 深度解析) 一、引言 在 Go 语言的开发过程中,随着项目规模的不断扩大,依赖管理变得愈发重要。Go Modules 作为 Go 语言官方的依赖管理工具,自 Go 1.11 版本引入后,极大地简化了项…...

国产ARM处理器工控机如何助力企业实现自主可控?
选择国产ARM处理器工控机的原因可以从多个角度来考虑,包括技术、经济、安全和政策等方面。以下是一些关键理由: 技术优势 低功耗高效能:ARM架构以其出色的能效比著称,适合需要长时间运行的工业控制应用。适应性强:国…...
dns功能及工作原理是什么?
在互联网的浩瀚海洋中,域名系统(DNS)扮演着至关重要的角色。它就像一个巨大的地址簿,将用户友好的域名转换为机器可识别的IP地址,确保用户能够访问到正确的服务器。本文将深入探讨DNS的功能和工作原理,揭示这一互联网基础设施的奥…...
Java中的Map集合与文件操作详解
1. Map集合概述 Map是一种键值对(key-value)的集合,常用于存储具有映射关系的数据。与List和Set不同,Map的键(key)是唯一的,而值(value)可以重复。Map集合的主要实现类有…...

SAP-ABAP:dialog界面中的数据块Event Block详解举例
在SAP的Dialog程序开发中,Event Block(事件块)是屏幕流逻辑(Flow Logic)中的关键部分,用于定义屏幕在特定事件触发时执行的逻辑。Event Block通常与ABAP模块(Module)结合使用&#x…...

PostgreSQL 开发利器:Navicat 核心功能与资源攻略
近几年,🐘 PostgreSQL 在全球数据库排名中表现优异。在 2025 年 2 月 DB-Engines 排名中 (如图),PostgreSQL 稳居第四名,并逐渐逼近第三名的 Microsoft SQL Server,其评分和受欢迎度持续增长,成为开源数据库…...

飞算 JavaAI:加速 AI + 行业趋势的智能化进程
在数字化浪潮奔涌的当下,“AI 行业” 已然成为不可逆的发展趋势,各行业都在积极探索 AI 技术与自身业务的融合,期望借此实现创新突破与转型升级。在这一进程中,飞算 JavaAI凭借其卓越的技术实力和独特的功能优势,为加…...

Houdini POP入门学习05 - 物理属性
接下来随着教程学习碰撞部分,当粒子较为复杂或者下载了一些粒子模板进行修改时,会遇到一些较奇怪问题,如粒子穿透等,这些问题实际上可以通过调节参数解决。 hip资源文件:https://download.csdn.net/download/grayrail…...

html 滚动条滚动过快会留下边框线
滚动条滚动过快时,会留下边框线 但其实大部分时候是这样的,没有多出边框线的 滚动条滚动过快时留下边框线的问题通常与滚动条样式和滚动行为有关。这种问题可能出现在使用了自定义滚动条样式的情况下。 注意:使用方法 6 好使,其它…...
【区块链基础】区块链的 Fork(分叉)深度解析:原理、类型、历史案例及共识机制的影响
区块链的 Fork(分叉)全面解析:原理、类型、历史案例及共识机制的影响 在区块链技术的发展过程中,Fork(分叉)现象是不可避免且极具影响力的一个环节。理解区块链分叉的形成原因、具体表现以及共识机制对分叉的作用,对于深入把握区块链技术架构及其治理机制至关重要。 本…...

蓝耘服务器与DeepSeek的结合:引领智能化时代的新突破
🌟 嗨,我是Lethehong!🌟 🌍 立志在坚不欲说,成功在久不在速🌍 🚀 欢迎关注:👍点赞⬆️留言收藏🚀 🍀欢迎使用:小智初学…...

【PDF PicKiller】PDF批量删除固定位置图片工具,默认解密,可去一般图、背景图、水印图!
PDF批量删除固定位置图片工具 PDF PicKiller <center>PDF PicKiller [Download](https://github.com/Peaceful-World-X/PDF-PicKiller)🤩 工具介绍🥳 主要功能🤪 软件使用🤪 参数解释🤪 关键代码🤩 项…...

电力系统时间同步系统之三
2.6 电力系统时间同步装置 时间同步装置主要完成时间信号和时间信息的同步传递,并提供相应的时间格式和物理接口。时间同步装置主要由三大部分组成:时间输入、内部时钟和时间输出,如图 2-25 所示。输入装置的时间信号和时间信息的精度必须不…...

【win | docker开启远程配置】使用 SSH 隧道访问 Docker的前操作
在主机A pycharm如何连接远程主机B win docker? 需要win docker配置什么? 快捷配置-主机B win OpenSSH SSH Server https://blog.csdn.net/z164470/article/details/121683333 winR,打开命令行,输入net start sshd,启动SSH。 或者右击我的电脑&#…...

IDEA中的debug使用技巧
详细教学视频见b站链接:IDEA的debug调试 CSDN详细博客文章链接:debug文章学习 以下为个人学习记录总结: idea中的debug模式界面如下: 现在详细介绍图标作用: 图标一(Show Execution Point)&…...
[蓝桥杯]采油
采油 题目描述 LQ 公司是世界著名的石油公司,为世界供应优质石油。 最近,LQ 公司又在森林里发现了一大片区域的油田,可以在这个油田中开采 nn 个油井。 LQ 公司在这 nn 个油井之间修建了 n−1n−1 条道路,每条道路连接两个油井…...

初识结构体,整型提升及操作符的属性
目录 一、结构体成员访问操作符1.1 结构体二、操作符的属性:优先级、结合性2.1 优先级2.2 结合性C 运算符优先级 三、表达式求值3.1 整型提升3.2 算数转化 总结 一、结构体成员访问操作符 1.1 结构体 C语言已经提供了内置类型,如:char,shor…...