PostgreSQL on ECS 横向版本TPCB性能测试

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
云原生数据库 PolarDB 分布式版,标准版 2核8GB
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: 本文对比的是PostgreSQL 9.4, 9.5, 9.6, 以及某基于9.4的国产数据库在ECS上的性能。 硬件环境和搭配 Intel(R) Xeon(R) CPU E5-2680 v3 @ 2.50GHz 32核 128G 内存 500G 高效本地SSD , 15000

本文对比的是PostgreSQL 9.4, 9.5, 9.6, 以及某基于9.4的国产数据库在ECS上的性能。

硬件环境和搭配

Intel(R) Xeon(R) CPU E5-2680 v3 @ 2.50GHz
32核
128G 内存
500G 高效本地SSD  ,  15000 IOPS  ,  $PGDATA
700G * 2 高效SSD云盘  ,  20000 IOPS  ,  tbs1, tbs2

测试模型 TPCB
分别测试的数据量 10万乘以 1 10 100 500 1000 5000 10000
分别测试的并发数 1 2 4 8 16 32 64 128 256 512

环境部署

parted /dev/vdc
(parted) mklabel gpt
(parted) mkpart primary 1M 2049M
(parted) mkpart primary 2049M 710G
(parted) select /dev/vdb
Using /dev/vdb
(parted) rm 1         
(parted) mkpart primary 1M 2049M 
(parted) mkpart primary 2049M 710G
q

partx -a /dev/vdc
kpartx -a /dev/vdc
partprobe  /dev/vdc
partx -a /dev/vdb
kpartx -a /dev/vdb
partprobe  /dev/vdb

dmsetup remove vdc1
dmsetup remove vdc2

dmsetup remove vdb1
dmsetup remove vdb2

mkfs.xfs -f -b size=4096 -l logdev=/dev/vdc1,size=2047868928,sunit=16 -d agsize=134217728 /dev/vdc2
mkfs.xfs -f -b size=4096 -l logdev=/dev/vdb1,size=2047868928,sunit=16 -d agsize=134217728 /dev/vdb2

vi /etc/fstab
/dev/vdc2 /data02 xfs defaults,allocsize=16M,inode64,nobarrier,nolargeio,logbsize=262144,noatime,nodiratime,swalloc,logdev=/dev/vdc1 0 0
/dev/vdb2 /data01 xfs defaults,allocsize=16M,inode64,nobarrier,nolargeio,logbsize=262144,noatime,nodiratime,swalloc,logdev=/dev/vdb1 0 0


mkdir /data01
mkdir /data02
mkdir /data03

mount -a

mkdir -p /data01/pgdata
mkdir -p /data02/pgdata
mkdir -p /data03/pgdata
chown -R digoal:digoal /data*/*

还需要调整一些内核参数,LIMITS,本文略 .   

表空间目录

mkdir /data01/pgdata/9.4_tbs
mkdir /data02/pgdata/9.4_tbs
mkdir /data01/pgdata/9.5_tbs
mkdir /data02/pgdata/9.5_tbs
mkdir /data01/pgdata/9.6_tbs
mkdir /data02/pgdata/9.6_tbs
mkdir /data01/pgdata/sgrds_tbs
mkdir /data02/pgdata/sgrds_tbs
chown -R digoal:digoal /data*/*

配置环境变量

# vi env.sh  


#!/bin/bash 

if [ $# -ne 2 ]; then
  echo "$0 ver port"
else

export PS1="$USER@`/bin/hostname -s`-> "
export PGPORT=$2
export PGDATA=/data03/pgdata/pg_root$1
export LANG=en_US.utf8
export PGHOME=/home/digoal/pgsql$1
export LD_LIBRARY_PATH=$PGHOME/lib:/lib64:/usr/lib64:/usr/local/lib64:/lib:/usr/lib:/usr/local/lib:$LD_LIBRARY_PATH
export DATE=`date +"%Y%m%d%H%M"`
export PATH=$PGHOME/bin:$PATH:.
export MANPATH=$PGHOME/share/man:$MANPATH
export PGHOST=$PGDATA
export PGUSER=postgres
export PGDATABASE=postgres
alias rm='rm -i'
alias ll='ls -lh'
unalias vi

fi

初始化数据库集群

. ./env.sh 9.4 1920
initdb -D $PGDATA -E UTF8 --locale=C -U postgres

. ./env.sh 9.5 1921
initdb -D $PGDATA -E UTF8 --locale=C -U postgres

. ./env.sh 9.6 1922
initdb -D $PGDATA -E UTF8 --locale=C -U postgres

. ./env.sh sgrds 1923
initdb -D $PGDATA -E UTF8 --locale=C -U postgres

启动数据库

. ./env.sh 9.4 1920
pg_ctl stop -m fast
. ./env.sh 9.5 1921
pg_ctl stop -m fast
. ./env.sh 9.6 1922
pg_ctl stop -m fast
. ./env.sh sgrds 1923
pg_ctl stop -m fast


. ./env.sh 9.4 1920
nohup postgres -B 16GB \
-c port=$PGPORT \
-c max_connections=700 \
-c unix_socket_directories='.' \
-c listen_addresses='0.0.0.0' \
-c vacuum_cost_delay=0 \
-c vacuum_cost_limit=10000 \
-c bgwriter_delay=10ms \
-c bgwriter_lru_maxpages=1000 \
-c bgwriter_lru_multiplier=10.0 \
-c synchronous_commit=off \
-c full_page_writes=off \
-c wal_buffers=1900MB \
-c wal_writer_delay=10ms \
-c checkpoint_timeout=35min \
-c checkpoint_segments=1024 \
-c checkpoint_completion_target=0.9 \
-c random_page_cost=1.1 \
-c effective_cache_size=64GB \
-c log_destination='csvlog' \
-c logging_collector=on \
-c log_truncate_on_rotation=on \
-D $PGDATA \
>/dev/null 2>&1 &
sleep 2
psql -c "create tablespace tbs1 location '/data01/pgdata/$PGPORT_tbs';"
psql -c "create tablespace tbs2 location '/data02/pgdata/$PGPORT_tbs';"



. ./env.sh 9.5 1921
nohup postgres -B 16GB \
-c port=$PGPORT \
-c max_connections=700 \
-c unix_socket_directories='.' \
-c listen_addresses='0.0.0.0' \
-c vacuum_cost_delay=0 \
-c vacuum_cost_limit=10000 \
-c bgwriter_delay=10ms \
-c bgwriter_lru_maxpages=1000 \
-c bgwriter_lru_multiplier=10.0 \
-c synchronous_commit=off \
-c full_page_writes=off \
-c wal_buffers=1900MB \
-c wal_writer_delay=10ms \
-c checkpoint_timeout=35min \
-c max_wal_size=16GB \
-c checkpoint_completion_target=0.9 \
-c random_page_cost=1.1 \
-c effective_cache_size=64GB \
-c log_destination='csvlog' \
-c logging_collector=on \
-c log_truncate_on_rotation=on \
-D $PGDATA \
>/dev/null 2>&1 &
sleep 2
psql -c "create tablespace tbs1 location '/data01/pgdata/$PGPORT_tbs';"
psql -c "create tablespace tbs2 location '/data02/pgdata/$PGPORT_tbs';"


. ./env.sh 9.6 1922
nohup postgres -B 16GB \
-p $PGPORT \
-N 700 \
-c unix_socket_directories='.' \
-c listen_addresses='0.0.0.0' \
-c vacuum_cost_delay=0 \
-c vacuum_cost_limit=10000 \
-c bgwriter_delay=10ms \
-c bgwriter_lru_maxpages=1000 \
-c bgwriter_lru_multiplier=10.0 \
-c synchronous_commit=off \
-c wal_writer_flush_after=0 \
-c full_page_writes=off \
-c wal_buffers=1900MB \
-c wal_writer_delay=10ms \
-c checkpoint_timeout=35min \
-c max_wal_size=16GB \
-c checkpoint_completion_target=0.9 \
-c random_page_cost=1.1 \
-c effective_cache_size=64GB \
-c log_destination='csvlog' \
-c logging_collector=on \
-c log_truncate_on_rotation=on \
-D $PGDATA \
>/dev/null 2>&1 &
sleep 2
psql -c "create tablespace tbs1 location '/data01/pgdata/$PGPORT_tbs';"
psql -c "create tablespace tbs2 location '/data02/pgdata/$PGPORT_tbs';"


. ./env.sh sgrds 1923
nohup postgres -B 16GB \
-c port=$PGPORT \
-c max_connections=700 \
-c unix_socket_directories='.' \
-c listen_addresses='0.0.0.0' \
-c vacuum_cost_delay=0 \
-c vacuum_cost_limit=10000 \
-c bgwriter_delay=10ms \
-c bgwriter_lru_maxpages=1000 \
-c bgwriter_lru_multiplier=10.0 \
-c synchronous_commit=off \
-c full_page_writes=off \
-c wal_buffers=1900MB \
-c wal_writer_delay=10ms \
-c checkpoint_timeout=35min \
-c checkpoint_segments=1024 \
-c checkpoint_completion_target=0.9 \
-c random_page_cost=1.1 \
-c effective_cache_size=64GB \
-c log_destination='csvlog' \
-c logging_collector=on \
-c log_truncate_on_rotation=on \
-D $PGDATA \
>/dev/null 2>&1 &
sleep 2
psql -c "create tablespace tbs1 location '/data01/pgdata/$PGPORT_tbs';"
psql -c "create tablespace tbs2 location '/data02/pgdata/$PGPORT_tbs';"

测试脚本

# vi test.sh
#!/bin/bash

for s in 1 10 100 500 1000 5000 10000
do

################
. ~/env.sh 9.4 1920
pgbench -i -s $s --tablespace=tbs1 --index-tablespace=tbs2 --unlogged-tables

for i in 1 2 4 8 16 32 64 128 256 512
do
if [ $i -ge 16 ]; then
  j=16
else
  j=i
fi
pgbench -M prepared -n -r -c $i -j $i -T 120 > ./9.4.s_$s.i_$i.log 2>&1
done
pgbench -i -s 1
#################

################
. ~/env.sh 9.5 1921
pgbench -i -s $s --tablespace=tbs1 --index-tablespace=tbs2 --unlogged-tables

for i in 1 2 4 8 16 32 64 128 256 512
do
if [ $i -ge 16 ]; then
  j=16
else
  j=i
fi
pgbench -M prepared -n -r -c $i -j $i -T 120 > ./9.5.s_$s.i_$i.log 2>&1
done
pgbench -i -s 1
#################

################
. ~/env.sh 9.6 1922
pgbench -i -s $s --tablespace=tbs1 --index-tablespace=tbs2 --unlogged-tables

for i in 1 2 4 8 16 32 64 128 256 512
do
if [ $i -ge 16 ]; then
  j=16
else
  j=i
fi
pgbench -M prepared -n -r -c $i -j $i -T 120 > ./9.6.s_$s.i_$i.log 2>&1
done
pgbench -i -s 1
#################

################
. ~/env.sh sgrds 1923
pgbench -i -s $s --tablespace=tbs1 --index-tablespace=tbs2 --unlogged-tables

for i in 1 2 4 8 16 32 64 128 256 512
do
if [ $i -ge 16 ]; then
  j=16
else
  j=i
fi
pgbench -M prepared -n -r -c $i -j $i -T 120 > ./sgrds.s_$s.i_$i.log 2>&1
done
pgbench -i -s 1
#################

done

测试

chmod 500 test.sh
nohup ./test.sh >/dev/null 2>&1 &

测试结果

# vi result.sh

for s in 1 10 100 500 1000 5000 10000 
do

echo "9.4 s $s"
for i in 1 2 4 8 16 32 64 128 256 512
do 
cat 9.4.s_$s.i_$i.log | grep including | awk '{print $3}'
done

echo "9.5 s $s"
for i in 1 2 4 8 16 32 64 128 256 512
do 
cat 9.5.s_$s.i_$i.log | grep including | awk '{print $3}'
done

echo "9.6 s $s"
for i in 1 2 4 8 16 32 64 128 256 512
do 
cat 9.6.s_$s.i_$i.log | grep including | awk '{print $3}'
done

echo "sgrds s $s"
for i in 1 2 4 8 16 32 64 128 256 512
do 
cat sgrds.s_$s.i_$i.log | grep including | awk '{print $3}'
done

done


. ./result.sh

瓶颈分析请结合压测过程中的主机资源开销(io,cpu,调用,内存,网络等)和PROFILE来判断。
数据量小的时候,高并发的情况下行级锁等待较多,因为数据量少,高并发的UPDATE的原因。
1
2
3
4
5
6

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
18天前
|
关系型数据库 MySQL 数据库
mysql卸载、下载、安装(window版本)
mysql卸载、下载、安装(window版本)
|
1月前
|
存储 数据安全/隐私保护 索引
Windows Server 各版本搭建文件服务器实现共享文件(03~19)
Windows Server 各版本搭建文件服务器实现共享文件(03~19)
168 1
|
2月前
|
存储 弹性计算 运维
阿里云服务器ECS经济型e实例详细介绍_性能测试和租用价格
阿里云服务器ECS经济型e实例详细介绍_性能测试和租用价格,阿里云服务器ECS推出经济型e系列,经济型e实例是阿里云面向个人开发者、学生、小微企业,在中小型网站建设、开发测试、轻量级应用等场景推出的全新入门级云服务器,CPU采用Intel Xeon Platinum架构处理器,支持1:1、1:2、1:4多种处理器内存配比,e系列性价比优选
|
1月前
|
关系型数据库 MySQL 数据库
django4版本提示 django.db.utils.NotSupportedError: MySQL 8 or later is required (found 5.7.26)
在学习Django时,用户遇到`django.db.utils.NotSupportedError`,提示需要MySQL 8.0.25或更高版本,但其系统上是5.7.26。为解决这个问题,用户决定不升级MySQL,而是选择注释掉Django源码中的数据库版本检查。通过Python命令行找到Django安装路径,进入`db/backends/base/base.py`,注释掉`self.check_database_version_supported()`函数
127 0
|
28天前
|
SQL 关系型数据库 MySQL
【MySQL技术专题】「问题实战系列」深入探索和分析MySQL数据库的数据备份和恢复实战开发指南(8.0版本升级篇)
【MySQL技术专题】「问题实战系列」深入探索和分析MySQL数据库的数据备份和恢复实战开发指南(8.0版本升级篇)
96 0
|
17天前
|
Linux
centos 查看服务器信息 版本cpu
centos 查看服务器信息 版本cpu
12 0
|
19天前
|
弹性计算 前端开发 Java
使用阿里云 mqtt serverless 版本超低成本快速实现 webscoket 长链接服务器
使用阿里云 MQTT Serverless 可轻松实现弹性伸缩的 WebSocket 服务,每日成本低至几元。适用于小程序消息推送的 MQTT P2P 模式。前端需注意安全,避免 AK 泄露,采用一机一密方案。后端通过调用 `RegisterDeviceCredential` API 发送消息。示例代码包括 JavaScript 前端连接和 Java 后端发送。
183 0
|
1月前
|
弹性计算 分布式计算 DataWorks
DataWorks报错问题之ecs自建数据库连通性测试报错如何解决
DataWorks是阿里云提供的一站式大数据开发与管理平台,支持数据集成、数据开发、数据治理等功能;在本汇总中,我们梳理了DataWorks产品在使用过程中经常遇到的问题及解答,以助用户在数据处理和分析工作中提高效率,降低难度。
|
1月前
|
SQL 关系型数据库 OLAP
PostgreSQL从小白到高手教程 - 第46讲:poc-tpch测试
PostgreSQL从小白到高手教程 - 第46讲:poc-tpch测试
83 3
|
1月前
|
数据安全/隐私保护 Windows
Windows Server 各版本搭建终端服务器实现远程访问(03~19)
左下角开始➡管理工具➡管理您的服务器,点击添加或删除角色点击下一步勾选自定义,点击下一步蒂埃涅吉终端服务器,点击下一步点击确定重新登录后点击确定点击开始➡管理工具➡计算机管理,展开本地用户和组,点击组可以发现有个组关门用来远程登录右键这个组点击属性,点击添加输入要添加的用户名,点击确定添加成功后点击确定打开另一台虚拟机(前提是在同一个局域网内),按 WIN + R 输入 mstsc 后回车输入 IP 地址后点击连接输入用户名及密码后点击确定连接成功!
38 0

相关产品

  • 云原生数据库 PolarDB