暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

ARM让PostgreSQL跑得更快

2893

译者简介

崔鹏,任职于海能达通信股份有限公司哈尔滨平台中心,数据库开发高级工程师,致力于PostgreSQL数据库在专网通信领域、公共安全领域的应用与推广,个人兴趣主要集中在:分布式数据库系统设计、高并发高可用数据库架构设计与开源数据库的源码研究。

校对者简介    

朱君鹏,博士研究生。主要研究方向为数据库管理系统,尤其是内存数据库、事务处理系统、软硬件协同设计、日志系统。

数据中心中ARM处理器的预期增长一直是讨论的热门话题,我们很好奇它在PostgreSQL中的表现。用于测试和评估的基于ARM的服务器普遍可用性是一个主要问题。2018年,AWS宣布在其云服务中提供基于ARM的处理器。但我们并没有立即看到太多令人兴奋的东西,因为许多人认为这是一种“实验性”的东西。我们对于将其用于关键用途也持谨慎态度,并且从未付出足够的努力来评估它。但是,当基于Graviton2的第二代实例于2020年5月发布时,我们想要认真思考。我们从运行PostgreSQL的角度来独立研究新实例的价格/性能。
重要提示:注意虽然把PostgreSQL在x86上和arm上做对比很吸引人,但这是不正确的。这些测试将PostgreSQL在两个虚拟云实例上进行了比较,其中包含了比CPU更多的移动组件。我们主要关注基于两种不同架构的两个特定AWS EC2实例的性价比。

测试设置

对于此测试,我们选择了两个类似的实例。一种是较旧的 m5d.8xlarge,另一个是基于Graviton2的新 m6gd.8xlarge。这两个实例都带有本地 “临时”存储,我们将在这里使用它们。使用速度快的本地驱动器有助于暴露系统其他部分的差异,并避免测试云存储。这些实例并不完全相同,如下所示,但它们非常接近,足以被认为是相同的等级。我们使用了来自pgdg repo的Ubuntu 20.04 AMI和PostgreSQL 13.1。我们使用的是Ubuntu 20.04 AMI和pgdg repo的PostgreSQL 13.1。我们使用较小(内存)和较大(IO密集型)的数据库大小进行了测试。

例子

根据AWS在北弗吉尼亚州的Linux定价信息,对实例进行规范和按需定价。以目前列出的价格,m6gd.8xlarge要便宜25%。

Graviton2(arm)实例

    Graviton2 (ARM) Instance
    Instance : m6gd.8xlarge
    Virtual CPUs : 32
    RAM  : 128 GiB
    Storage : 1 x 1900 NVMe SSD (1.9 TiB)
    Price : $1.4464 per Hour

    常规(x86)实例

      x86 Instance
      Instance : m5d.8xlarge
      Virtual CPUs : 32
      RAM : 128 GiB
      Storage : 2 x 600 NVMe SSD (1.2 TiB)
      Price : $1.808 per Hour

      OS和PostgreSQL设置

      我们选择了Ubuntu 20.04.1 LTS AMIs作为实例,并且在操作系统段做任何改变。m5d.8xlarge实例中,两个本地NVMe驱动器组成raid0设备中。PostgreSQL是使用PGDG存储库中可用的.deb包安装的。
      使用PostgreSQL版本查询函数version()确认操作系统架构
        Shell
          postgres=# select version();
          version
          -------------------------------------------------------------------------------
          PostgreSQL 13.1 (Ubuntu 13.1-1.pgdg20.04+1) on aarch64-unknown-linux-gnu, compiled by gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0, 64-bit
          (1 row)
          注:aarch64代表64位ARM架构
          以下PostgreSQL配置用于测试。
            Shell
            max_connections = '200'
            shared_buffers = '32GB'
            checkpoint_timeout = '1h'
            max_wal_size = '96GB'
            checkpoint_completion_target = '0.9'
            archive_mode = 'on'
            archive_command = '/bin/true'
            random_page_cost = '1.0'
            effective_cache_size = '80GB'
            maintenance_work_mem = '2GB'
            autovacuum_vacuum_scale_factor = '0.4'
            bgwriter_lru_maxpages = '1000'
            bgwriter_lru_multiplier = '10.0'
            wal_compression = 'ON'
            log_checkpoints = 'ON'    
            log_autovacuum_min_duration = '0'

            pgbench测试

            首先,使用pgbench进行初步测试,pgbench是PostgreSQL提供的微基准测试(micro-benchmarking)工具。这使我们能够使用多种客户端和作业的不同组合进行测试,例如:
              Shell
              pgbench -c 16 -j 16 -T 600 -r
              其中使用16个客户端连接和16个提供客户端连接的pgbench作业

              不启用校验和的读写测试

              pgbench创建的默认负载是类似tpcb的读写负载。我们在未启用校验和的PostgreSQL实例上使用了相同的命令。我们可以看到ARM的性能提高了19%。
              x86(tps)
              28878
              ARM(TPS)
              34409

              启用校验和的读写

              我们很好奇校验和计算是否会因为架构的不同而对性能产生影响。如果启用了PostgreSQL级别校验和。PostgreSQL 12以后,可以使用pg_checksum工具来启用校验和,如下所示:
                Shell
                pg_checksums -e -D $PGDATA
                x86tps
                29402
                ARMTPS
                34701
                令我们惊讶的是,结果稍微好一点!由于差异只有1.7%左右,我们认为这是一个噪音。至少我们觉得可以得出这样的结论:在这些处理器上启用校验和不会有任何明显的性能下降。

                不带校验和的只读

                只读负载以cpu为中心。因为我们选择了一个完全适合内存大小的数据库,所以我们可以消除IO相关的开销。
                x86tps
                221436.05
                ARMTPS
                288867.44
                结果表明,与x86架构上的PG实例相比,ARM的tps增长了30%。

                带有校验和的只读

                x86tps
                221436.0531
                ARMTPS
                288867.4406
                结果非常接近前一个,增加了26.5%。
                在pgbench测试中,我们观察到随着负载集中在CPU上,性能差异会增加。我们无法通过校验和观察到任何性能下降。
                注意:校验和
                当页面被写出并在缓冲池中读取时,PostgreSQL计算并写入页面的校验和。此外,启用校验和时,总是记录Hint Bits,从而增加了预写式日志的输入输出(WAL IO)压力。为了正确地验证总的校验和开销,我们需要更长和更大量的测试,类似于使用sysbench-tpcc时所做的测试。

                使用sysbench-tpcc进行测试

                我们决定使用sysbench-tpcc执行更详细的测试。我们主要感兴趣的是数据库能够装入内存的情况。另一方面,虽然在arm服务器上的PostgreSQL没有问题,但sysbench比x86要挑剔得多。
                每轮测试都包含几个步骤:
                1.恢复必要比例的数据目录(10/200)。
                2.使用与大型测试相同的参数运行10分钟的预热测试。
                3.PG检查点。
                4.运行实际测试。

                内存中的16个线程:

                在中等负载下,ARM实例的性能比x86实例高出约15.5%。在此前后,百分比差异是基于平均tps值。
                您可能想知道为什么在测试结束时性能突然下降。它与使用full_page_writes的检查点有关 。即使在内存测试中我们使用了pareto分布,每个检查点之后也会写出相当多的页面。在这种情况下,在本例中,实例显示了更多由WAL引发的检查点的性能问题。这些下降将在所有执行的测试中出现。

                内存中的32个线程:

                当并发数增加到32时,性能差异降低到近8%。

                内存中有64个线程

                将实例逼近性能临界点(记住,两个实例均为32 cpu),我们发现差异进一步降低到4.5%。

                内存中128个线程:

                当两个实例都超过其临界点时,性能的差异可以忽略不计,尽管仍然有1.4%的差异。此外,当并发时,我们可以观察到ARM的吞吐量(tps)下降了6-7%,而在这32台vCPU机器上,当并发从64增加到128时,x86的吞吐量下降了4%。
                并非我们所测量的所有内容都适合基于Graviton2的实例。在IO密集型(约200G数据集,200个仓库,均匀分布)的场景中,我们看到两个实例之间的差异较小,并且在64和128个线程下,常规m5d实例的性能更好。可以在下面的组合图中看到这一点。
                造成这种情况的一个可能原因,尤其是对于m6gd.8xlarge在128个线程处发生的严重崩溃是因为它缺少m5d.8xlarge那样的第二个驱动器。目前尚无完全可比的实例,因此我们认为这是一个合理的比较。每种实例类型都有其优点。因为我们预期本地驱动器对测试的影响可以忽略,为了正确识别原因,需要进行更多的测试和分析。可以执行EBS的IO密集型测试,以尝试从中删除本地驱动器。
                可从此GitHub存储库中获取测试相关内容,测试结果,使用的脚本以及测试期间生成的数据的更多详细信息。

                总结

                在我们执行的测试中,很少有ARM实例比x86实例慢的情况。在过去几天的整个测试过程中,测试结果均保持一致。尽管基于ARM的实例便宜25%,但在大多数测试中,与基于x86的实例相比,它可以显示15-20%的性能提升。因此,基于ARM的实例在所有方面具有更好的性价比。我们应该期望将来有越来越多的云提供商提供基于ARM的实例。如果您希望查看任何其他类型的基准测试,请告诉我们。
                请点击文章底部“阅读原文” 查看原文
                文章转载自PostgreSQL中文社区,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                评论