ITPub博客

首页 > 数据库 > 国内数据库 > Kunlun-Storage vs PostgreSQL OLTP 测试

Kunlun-Storage vs PostgreSQL OLTP 测试

原创 国内数据库 作者:KunlunDB 时间:2022-04-25 18:03:40 34 删除 编辑

一、Kunlun-Storage 简介

 
KunlunStorage 是泽拓科技基于Percona-mysql-8.0.26 优化的数据库存储服务器,作为 KunlunBase 分布式数据库的存储节点,我们对percona-mysql 做了大量性能增强,补足了其在XA 事务处理的容灾和错误处理方面的空白,并增加了一些昆仑数据库集群整体需要的功能,包括fullsync 复制,update/delete...returning 语句等。



二、测试环境

测试软件:


  • sysbench 1.1.0-df89d34 (using bundled LuaJIT 2.1.0-beta3(AWS 云上环境)

  • sysbench 1.0.20 (using system LuaJIT 2.1.0-beta3 ) (本地部署环境)


服务器配置: 


  • Postgre SQL和Kunlun-Storage各部署在一台:亚马逊i3.4xlarge(CPU 8cores 16 Threads,内存:122G,存储:2个1900 NVMe SSD)上(AWS 云上环境)


  • PostgreSQL和Kunlun-Storage各部署同一台服务器上(CPU 16 cores 32 Threads, 内存: 64G,存储:1个 NVMe SSD)上(本地部署环境)  


软件版本:


  • Postgresql: PostgreSQL 14.2 onx86_64-pc-linux-gnu

  • Kunlun-Storage: 8.0.26-16-kunlun-storage


数据库参数配置:


  • PostgreSQL: 

    shared_buffers = 32768MBwal_level = replicafsync = on         synchronous_commit = on       wal_sync_method = fdatasync full_page_writes = on


    • Kunlun-Storage:

      innodb_buffer_pool_size  32768MBinndo_flush_at_trx_commit=1sync_binlog=1innodb_use_fdatasync = 1

       

      测试背景: Postgre SQL和Kunlun-Storage采用默认的安装配置,只调整了内存参数及上述几个参数,整个测试过程Postgre SQL和Kunlun-Storage没有任何优化行为。




      三、 测试数据

      测试软件: 


      • sysbench 1.1.0-df89d34 (using bundled LuaJIT 2.1.0-beta3(AWS 云上环境)

      • sysbench 1.0.20 (using system LuaJIT 2.1.0-beta3)(本地部署环境)

       

      Sysbench测试场景:

       

      场景一 :oltp_write_only


      • 每个 事务执行如下4种操作:execute_index_updates()、execute_non_index_updates()、execute_delete_inserts()

       

      场景二:oltp_update_index


      • 每个 事务执行如下1种操作:execute_index_updates()

       

      场景三:oltp_update_non_index


      • 每个事务执行如下1种操作:execute_non_index_updates()

       

      场景四:oltp_read_write.lua


      • 每个事务执行如下7种操作:execute_simple_ranges(),execute_sum_ranges()、   execute_order_ranges()、execute_distinct_ranges()、execute_index_updates()、execute_non_index_updates()、execute_delete_inserts()

       

      各个操作操作对应的SQL语句如下:

        sum_ranges = {
              "SELECT SUM(k) FROMsbtest%u WHERE id BETWEEN ? AND ?",
               t.INT, t.INT},
               
        order_ranges = {
              "SELECT c FROMsbtest%u WHERE id BETWEEN ? AND ? ORDER BY c",
               t.INT, t.INT},
               
        distinct_ranges = {
              "SELECT DISTINCT cFROM sbtest%u WHERE id BETWEEN ? AND ? ORDER BY c",
              t.INT, t.INT},
              
        index_updates = {
              "UPDATE sbtest%uSET k=k+1 WHERE id=?",
              t.INT},
              
        non_index_updates = {
              "UPDATE sbtest%uSET c=? WHERE id=?",
              {t.CHAR, 120}, t.INT},
              
        deletes = {
              "DELETE FROMsbtest%u WHERE id=?",
              t.INT},
              
        inserts = {
              "INSERT INTOsbtest%u (id, k, c, pad) VALUES (?, ?, ?, ?)",
              t.INT, t.INT, {t.CHAR,120}, {t.CHAR, 60}}

         

        测试数据量:

          --tables=18  --table-size=10000000

           

          表占用操作系统存储空间: 36G

           

          测试脚本:

           

          测试的sysbench  的线程从64 到900 ,每个线程案列执行10分钟,每个场景连续测试时间140分钟。

           

          • Kunlun-Storage:

            
            sysbench /usr/
            local/share/sysbench/oltp_write_only.lua--db-driver=mysql --mysql-host=
            172.31.
            41.115 --mysql-port=
            6001 --mysql-user=pgx --mysql-password=pgx_pwd--mysql-db=vpgtest --tables=
            18 --table-size=
            10000000 --report-interval=
            10--threads=
            64 --
            time=
            600  run
            
             
            
            sysbench/usr/
            local/share/sysbench/oltp_update_index.lua --db-driver=mysql --mysql-host=
            172.31.
            41.115  --mysql-port=
            6001 --mysql-user=pgx--mysql-password=pgx_pwd --mysql-db=vpgtest --tables=
            18 --table-size=
            10000000--report-interval=
            10 --threads=
            64 --
            time=
            600  run 
            
            
            
            sysbench/usr/ local/share/sysbench/oltp_update_non_index.lua  --db-driver=mysql--mysql-host= 172.31. 41.115 --mysql-port= 6001 --mysql-user=pgx --mysql-password=pgx_pwd--mysql-db=vpgtest --tables= 18 --table-size= 10000000 --report-interval= 10--threads= 64 -- time= 600  run 

            Threads 变化范围:64-128-192-......900

             

            • PostgreSQL:

              
              sysbench/usr/
              local/share/sysbench/oltp_read_write.lua --db-driver=pgsql--pgsql-host=
              172.31.
              44.208 --pgsql-port=
              5432 --pgsql-user=postgres --pgsql-password=postgres--pgsql-db=postgres --tables=
              18 --table-size=
              10000000 --report-interval=
              10--threads=
              64  --
              time=
              600 run
              
               
              
              sysbench /usr/
              local/share/sysbench/oltp_update_index.lua--db-driver=pgsql --pgsql-host=
              172.31.
              44.208 --pgsql-port=
              5432 --pgsql-user=postgres --pgsql-password=postgres--pgsql-db=postgres --tables=
              18 --table-size=
              10000000 --report-interval=
              10--threads=
              64  --
              time=
              600 run
              
              
              
              sysbench/usr/ local/share/sysbench/oltp_update_non_index.lua --db-driver=pgsql--pgsql-host= 172.31. 44.208 --pgsql-port= 5432 --pgsql-user=postgres --pgsql-password=postgres--pgsql-db=postgres --tables= 18 --table-size= 10000000 --report-interval= 10--threads= 640  -- time= 600  run

              Threads 变化范围:64-128-192-......900




              四、  AWS 云上环境测试结果


              • oltp_write_only  测试



                 


               
               

               
               

              • oltp_update_index 测试


               


               
               

              •  oltp_update_non_index 测试

               





              五、本地部署测试结果


              • oltp_write_only 测试

               


                


              • oltp_update_index 测试


               


               

              • oltp_update_non_index 测试



               

              • oltp_read_write 测试

               


               


               


              六、 测试结果及总结

              1.  在OLTP write-only、oltp -read-write和OLTP update_index场景下,Kunlun-Storage性能明显优于PostgreSQL。


              需要强调的是,PostgreSQL只要更新任何一个索引字段,都需要在所有索引中插入新的索引行指向新版本的数据行,此时HOTupdate无法发挥作用。


              因此,update_index的性能会大幅落后于MySQL。 


              在实际生产系统中,更新到索引列是非常常见的现象,特别是还有Vacuum带来的IO消耗大幅增长,所以PostgreSQL的通用的写入性能就相对较差。

               

              2.  在OLTP update_non_index场景下,PostgreSQL的tps性能高于Kunlun-Storage,但95 percent delay也高于KunlunStorage,这表明在更新的字段不是索引字段的场景下,由于PostgreSQL通过保持 heap页面半空,可以实现大多数行的更新是HOT update,也就是不需要插入索引行,直接在与旧行同一个heap页面中写入新版本行数据即可,因此比平均的QPS比Kunlun-Storage高5%~30%。


              不过从测试结果可以看到,PostgreSQL的QPS和延时的波动比较大,因为无法做HOT update的那些更新语句的延时也会大幅提高,也就导致PostgreSQL95%延时反而比MySQL大10%到40%左右。


              由于大多数实际使用场景下是无法避免更新索引字段的,并且即使对于不更新索引字段的语句,HOT update也不能保证大概率发生( 只有不更新任何索引字段并且heap页面有足够空间存储那个被更新的行的新版本的时候 HOT Update 才能发生 ),因此PostgreSQL的这种性能优势的覆盖面过于狭窄。

               

              3.  PostgreSQL在负载动态变化过程中,有明显的延迟抖动,而Kunlun-Storage性能曲线相对平稳.


              点击阅读原文

              推荐阅读

              KunlunBase架构介绍
              KunlunBase技术优势介绍
              KunlunBase技术特点介绍
              PostgreSQL vs MySQL TPC-H 测试

              -END-


              来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70011764/viewspace-2888712/ ,如需转载,请注明出处,否则将追究法律责任。

              请登录后发表评论 登录
              全部评论

              注册时间:2021-12-27

              • 博文量
                103
              • 访问量
                31395