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

本文对比的是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的原因。





时间: 2024-09-22 03:24:06

PostgreSQL on ECS 横向版本TPCB性能测试的相关文章

PostgreSQL on ECS多云盘的部署、快照备份和恢复

标签 PostgreSQL , ECS , 云盘 , 快照 , 一致性备份 , 时间点恢复 , zfs , lvm , raid , 并行计算 背景 随着阿里云云盘的发展,云盘的性能已经越来越好了.IOPS可以做到十万以上,读写吞吐也超过1GB/s了.相信随着网络的发展,SSD云盘IOPS突破40万,读写吞吐突破4GB/s也不远了. 不过这里的IOPS和吞吐是指并发的IO能力,单次IO的延迟与本地还是不能比(将来RDMA网络也许能解决这个问题). PostgreSQL 如何解决SSD云盘IO延迟

PostgreSQL 9.6 更新版本发布说明

PostgreSQL是世界上最先进的开源数据库,9.6最新版本由PostgreSQL全球开发者今天发布. 此版本将允许用户纵向扩展(scale-up)和横向扩展(scale-out)来提高数据库的查询性能. 新功能包括并行查询.同步复制改进.短语搜索. 性能和易用性方面的改进,并提供了其他许多方面的功能. 纵向扩展的并行查询 9.6版本现支持一些并行查询操作,因而能够利用服务器上的几个或所有的CPU内核来进行运算,这样返回查询结果更快. 此版本的并行功能包括并行顺序表扫描.聚合和联接.根据详细信

阿里云云服务器ECS购买过程和VPS性能测试

经过这几年的整合与拓展,阿里旗下的云主机生态圈已经逐渐的行程,在上个月直接把一直发展挺好的万网直接取消合并到阿里云旗下的二级域名,包括老左在内的很多网友可能表示可惜,不过这些构架和布局思维是我们这些草根不能理解的,我们最终还是需要的是稳定和性价比好的产品,以及简单的过程环节.   老左一贯的建议是,如果我们是中文项目的网站或者其他项目,可能开始的过程因为政策比较麻烦,但是鉴于后续的稳定和速度,还是建议选择类似阿里云在内的等国内其他云主机产品,毕竟速度和稳定性比国外的好一些.当然,如果我们的项目不

PostgreSQL on ECS SLA 流复制备库+秒级快照+PITR+自动清理

标签 PostgreSQL , ECS , 阿里云 , 部署 , 物理镜像 , 流复制 , 快照备份 , 备份验证 , 自动清理 背景 介绍在阿里云ECS环境中,实现一个非常简单,但是可用性和可靠性满足一般企业要求的PostgreSQL环境. 包括: 1.自动启动数据库 2.包括一个物理流复制备库 3.包括自动的秒级快照备份 4.包括自动备份集有效性验证 5.包括自动清理N天以前的备份集.归档文件 6.监控请自建 部署环境介绍 1.ECS 111.111.111.199 (主) 111.111.

PostgreSQL 10 + PostGIS + Sharding(pg_pathman) + MySQL(fdw外部表) on ECS 部署指南(适合新用户)

标签 PostgreSQL , Linux , CentOS 背景 新用户部署PostgreSQL以及空间数据库插件PostGIS的指南. 内网环境RPM打包(可选项) 如果是内网环境,可以将包全部下载到本地再用rpm安装. 安装epel和postgresql yum rpm两个包后再执行: 1.使用yum-utils的yumdownloader下载需要的安装包,包括依赖包. yum install -y yum-utils yumdownloader --resolve --destdir=/

HTAP数据库 PostgreSQL 场景与性能测试之 1 - (OLTP) 点查

标签 PostgreSQL , HTAP , OLTP , OLAP , 场景与性能测试 背景 PostgreSQL是一个历史悠久的数据库,历史可以追溯到1973年,最早由2014计算机图灵奖得主,关系数据库的鼻祖Michael_Stonebraker 操刀设计,PostgreSQL具备与Oracle类似的功能.性能.架构以及稳定性. PostgreSQL社区的贡献者众多,来自全球各个行业,历经数年,PostgreSQL 每年发布一个大版本,以持久的生命力和稳定性著称. 2017年10月,Pos

HTAP数据库 PostgreSQL 场景与性能测试之 36 - (OLTP+OLAP) 不含索引单表批量写入

标签 PostgreSQL , HTAP , OLTP , OLAP , 场景与性能测试 背景 PostgreSQL是一个历史悠久的数据库,历史可以追溯到1973年,最早由2014计算机图灵奖得主,关系数据库的鼻祖Michael_Stonebraker 操刀设计,PostgreSQL具备与Oracle类似的功能.性能.架构以及稳定性. PostgreSQL社区的贡献者众多,来自全球各个行业,历经数年,PostgreSQL 每年发布一个大版本,以持久的生命力和稳定性著称. 2017年10月,Pos

HTAP数据库 PostgreSQL 场景与性能测试之 35 - (OLTP+OLAP) 含索引单表单点写入

标签 PostgreSQL , HTAP , OLTP , OLAP , 场景与性能测试 背景 PostgreSQL是一个历史悠久的数据库,历史可以追溯到1973年,最早由2014计算机图灵奖得主,关系数据库的鼻祖Michael_Stonebraker 操刀设计,PostgreSQL具备与Oracle类似的功能.性能.架构以及稳定性. PostgreSQL社区的贡献者众多,来自全球各个行业,历经数年,PostgreSQL 每年发布一个大版本,以持久的生命力和稳定性著称. 2017年10月,Pos

HTAP数据库 PostgreSQL 场景与性能测试之 37 - (OLTP+OLAP) 含索引单表批量写入

标签 PostgreSQL , HTAP , OLTP , OLAP , 场景与性能测试 背景 PostgreSQL是一个历史悠久的数据库,历史可以追溯到1973年,最早由2014计算机图灵奖得主,关系数据库的鼻祖Michael_Stonebraker 操刀设计,PostgreSQL具备与Oracle类似的功能.性能.架构以及稳定性. PostgreSQL社区的贡献者众多,来自全球各个行业,历经数年,PostgreSQL 每年发布一个大版本,以持久的生命力和稳定性著称. 2017年10月,Pos