使用FreeBSD,CentOS,Ubuntu Debian和openSUSE对PostgreSQL进行基准测试

图片 哈Ha! 我向您介绍了MartinKováčik的原始文章“ FreeBSD,CentOS,Ubuntu Debian和openSUSE上的PostgreSQL基准测试”的译文。 它在各种UNIX系统上接近实际条件的环境中检查PostgreSQL 10.1 DBMS测试。

笔译


在这篇文章中,我将展示最近发布的PostgreSQL 10.1的测试结果。 我检查了这些操作系统(全部为64位)上的数据库:

  • Ubuntu 16.04 ,内核4.10.0-38-通用
  • openSUSE 42.3,内核4.4.87-25-默认
  • CentOS 7.4 ,内核3.10.0-693.2.2.el7.x86_64
  • Debian 9.2 ,内核4.9.0-4-amd64
  • FreeBSD 11.1

测试方法


该测试的目的是在类似于(典型)生产部署的条件下测量PostgreSQL的性能:

  • 客户端通过连接池进行连接,以确保不存在与数据库的永久重新连接(我没有使用连接池,而是没有使用-C pgbench标志)
  • 客户端通过网络而不是通过UNIX套接字连接
  • RAID 1镜像上的PostgreSQL数据目录

对于每个经过测试的操作系统,都创建了约74 GB的控制数据库:

pgbench -i -s 5000 pgbench 

测试基础结构由连接到1 Gbps网络的两台专用服务器组成:

  • EX41-SSD:Intel i7-6700、4核,8线程,32 GB DDR4 RAM,用于使用pgbench生成SQL查询
  • PX121-SSD:Intel Xeon E5-1650 v3、6核心,12线程,256 GB RAM DDR4 ECC,2 x 480 GB SATA 6 Gb / s,SSD系列的数据中心,用作PostgreSQL服务器

我对以下测试组合感兴趣:

  • 32 GB只读 :只读测试(仅样本而不更改数据),数据集不适合PostgreSQL缓存
  • 200 GB只读 :只读测试,数据集缓存在PostgreSQL中
  • 32 GB TCP-B :读写,数据集不适合PostgreSQL缓存
  • TCP-B 200 GB :读取,写入,数据集存储在PostgreSQL中

pgbench设置


在另一台FreeBSD 11.1计算机上运行的pgbench版本10.1程序用于生成负载。 测试脚本包括三个部分:真空+加热,只读测试和读写测试。 在每次读写测试之前,都要清除pgbench表(使用了-v标志)。 在测试期间,我逐渐增加了访问数据库的客户端数量。

 #!/bin/sh THREADS=8 DURATION=1800 PGIP=192.168.1.120 # warmup pgbench -h ${PGIP} -U pgbench -j ${THREADS} -c 10 -T ${DURATION} -S -v pgbench for clients in 1 10 20 30 40 50 60 70 80 90 100 110 120 do echo "RO ${clients}" pgbench -h ${PGIP} -U pgbench -j ${THREADS} -c ${clients} -T ${DURATION} -S pgbench > pgbench_ro_${clients}.log done for clients in 1 10 20 30 40 50 60 70 80 90 100 110 120 do echo "RW ${clients}" pgbench -h ${PGIP} -U pgbench -j ${THREADS} -c ${clients} -T ${DURATION} -v pgbench > pgbench_rw_${clients}.log done 

PostgreSQL服务器设置


对于Linux发行版,PostgreSQL在两个禁用了atime的 SSD上的RAID1设置(使用mdraid的软件RAID)中的RAID1设置中安装在ext4文件系统上。 对于FreeBSD,在配置RAID1时,在两个SSD上使用了OpenZFS文件系统。 使用以下参数创建了具有PostgreSQL数据的ZFS数据集:

 zfs get recordsize,logbias,primarycache,atime,compression zroot/var/db/postgres NAME PROPERTY VALUE SOURCE zroot/var/db/postgres recordsize 8K local zroot/var/db/postgres logbias throughput local zroot/var/db/postgres primarycache all default zroot/var/db/postgres atime off inherited from zroot zroot/var/db/postgres compression lz4 local 

除文件路径(所有操作系统使用其自己的目录结构)外,所有操作系统上的PostgreSQL服务器配置均相同。 32 GB实例的postgresql.conf文件的内容(基本设置):

 autovacuum = off default_statistics_target = 100 maintenance_work_mem = 1GB checkpoint_completion_target = 0.9 effective_cache_size = 24GB work_mem = 104MB wal_buffers = 16MB shared_buffers = 8GB max_connections = 300 

200 GB实例的postgresql.conf文件的内容:

 autovacuum = off default_statistics_target = 100 maintenance_work_mem = 2GB checkpoint_completion_target = 0.9 effective_cache_size = 144GB work_mem = 640MB wal_buffers = 16MB shared_buffers = 48GB max_connections = 300 

标杆管理


我在两种模式下的五个不同操作系统上测试了PostgreSQL,即只读模式和具有两种不同内存配置文件的TCP-B(读写)。 每个操作系统的测试大约花费了30个小时(不包括配置操作系统所需的时间)。 保存每个pgbench运行的结果以供以后评估。

结果-只读










结果-TCP-B










总结


测试表明,各种GNU / Linux发行版之间的差异不是很大。 在只读测试中,OpenSUSE 42.3是最好的操作系统,而FreeBSD的运行速度要慢40%。 不幸的是,我不知道是什么原因导致了FreeBSD如此出色的性能。

在读写测试(TCP-B)中获得了有关PostgreSQL性能的更真实的描述。 在GNU / Linux发行版中,Centos 7.4最快,而Debian 9.2最低。 尽管FreeBSD使用了ZFS(即写时复制文件系统),但FreeBSD 11.1的运行速度却是最佳Linux的两倍,这让我感到惊喜。 我以为这种差异是由Linux中软件RAID的成本引起的,所以我又对100个并发客户端进行了三项TCP-B测试,这次没有软件RAID:

  • FreeBSD 11.1 + UFS :5623.86 TPS
  • FreeBSD 11.1 + ZFS :8331.85 TPS
  • CentOS 7.4 + ext4 :8987.65 TPS

结果显示Linux SW RAID效​​率低下(或ZFS RAID效​​率低下)。 没有SW RAID的CentOS 7.4的性能仅比具有ZFS RAID的FreeBSD 11.1的性能略高(对于TCP-B和100个并发客户端)。

Source: https://habr.com/ru/post/zh-CN458156/


All Articles