Kunlun-Storage vs PostgreSQL OLTP 測試
一、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 ) (本地部署環境)
伺服器配置:
-
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
-
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效能曲線相對平穩.
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70011764/viewspace-2888712/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- PostgreSQL sharding : citus 系列1 - 多機部署(含OLTP(TPC-B)測試)- 含Citus MX模式...SQL模式
- 利用sysbench進行MySQL OLTP基準測試MySql
- 解密!傳統測試 vs 大資料測試解密大資料
- 混合列壓縮(HCC)在OLAP及OLTP場景中的測試
- postgresql無序uuid效能測試SQLUI
- postgresql:pgbench基準效能測試SQL
- windows vs 編譯postgresqlWindows編譯SQL
- 測試速度比較:Selenium vs Playwright vs Cypress vs Puppeteer vs TestCafe
- 敏捷測試VS傳統測試對比,6招玩轉敏捷測試!敏捷測試
- PostgreSQL DBA(6) - SeqScan vs IndexScan vs Bit...SQLIndex
- PostgreSQL DBA(131) - Develop(numeric vs float vs int)SQLdev
- PostgreSQL DBA(121) - pgAdmin(HA:PAF vs repmgr vs Patroni)SQL
- PostgreSQL:資料庫連結測試SQL資料庫
- PostgreSQL TPROC-C基準測試:PostgreSQL 12與PostgreSQL 13效能對比SQL
- Oracle vs PostgreSQL Develop(17) - ARRAYOracleSQLdev
- Oracle vs PostgreSQL Develop(15) - DISTINCT ONOracleSQLdev
- Oracle vs PostgreSQL Develop(18) - BooleanOracleSQLdevBoolean
- PostgreSQL DBA(34) - (HashAggregate vs GroupAggregate)SQL
- linux tinydrm vs fbtft 效能對比測試Linux
- Spring Boot中用嵌入式PostgreSQL測試Spring BootSQL
- Oracle vs PostgreSQL DBA(21)- Oracle VPDOracleSQL
- PostgreSQL DBA(89) - Linux(Buffer vs Cache)SQLLinux
- Oracle vs PostgreSQL Develop(16) - Prepared StatementOracleSQLdev
- Oracle vs PostgreSQL Develop(20) - Materialized ViewOracleSQLdevZedView
- Oracle vs PostgreSQL Develop(19) - PIPE ROWOracleSQLdev
- Oracle vs PostgreSQL Develop(28) - function overloadOracleSQLdevFunction
- PostgreSQL DBA(169) - Develop(Distinct vs Group by)SQLdev
- Oracle vs PostgreSQL Develop(26) - ASCII 0OracleSQLdevASCII
- PostgreSQL的MVCC vs InnoDB的MVCCSQLMVC
- Oracle vs PostgreSQL Develop(29) - COMMIT in PLSQLOracleSQLdevMIT
- OLTP 與 OLAP
- OLTP和OLAP
- Oracle vs PostgreSQL Develop(27) - PLSQL vs PLPGSQL(輸出引數)OracleSQLdev
- 使用sysbench測試mysql及postgresql(完整版)MySql
- Oracle vs PostgreSQL Develop(25) - plsql vs plpgsql(語法嚴謹性)OracleSQLdev
- Oracle vs PostgreSQL Develop(24) - subquery with agg functionOracleSQLdevFunction
- PostgreSQL DBA(177) - Serializability Isolation(Index vs NonIndex)SQLIndex
- Oracle vs PostgreSQL Develop(31) - Index Only ScanOracleSQLdevIndex