1. 程式人生 > >timescaledb和PG寫入效能測試

timescaledb和PG寫入效能測試

目錄

 

結論摘要

測試環境

資料構造

CASE 1 單TIME索引

單行寫入

WAL檔案增加

BATCH寫入

資源佔用

CASE 2 增加一個索引

單行寫入

BATCH寫入

資源佔用

CASE 3 大量資料


結論摘要

小資料量(執行緒10萬行),無論單多執行緒,有無batch,PG和TSDB效能相仿,PG略強。

增加一條索引,兩者插入效能都有所下降

WAL增長約為插入資料的2倍,但是WAL有上限。

大資料量(2000萬、1億行),BATCHSIZE=1000,PG插入效能依舊強於TSDB。

CPU佔用,TSDB佔用略高,以8執行緒batch1000為例(TSDB:80%, PG: %60)

總體上單獨PG 效能和資源消耗都優於TSDB。

下一步需要找到在何種場景下TSDB插入效能會優於PG。

測試環境

Intel(R) Core(TM) i7-4790 CPU @ 3.60GHz

32G memory

SSD harddisk.

postgresql.conf


max_connections = 256
 
shared_buffers = 3GB                    # min 128kB
 
work_mem = 16MB                         # min 64kB
maintenance_work_mem = 256MB            # min 1MB
 
wal_buffers = 4MB 
checkpoint_timeout = 10min              # range 30s-1d
max_wal_size = 2GB
 
checkpoint_completion_target = 0.9  
--------------------- 
作者:Kun_Tsai 
來源:CSDN 
原文:https://blog.csdn.net/jacicson1987/article/details/82988556?utm_source=copy 
版權宣告:本文為博主原創文章,轉載請附上博文連結!

資料構造

timestamp 每行遞增1s

id  每行遞增1

10個 integer 隨機數 + 9個隨機長度字串

 

CASE 1 單TIME索引

timescaledb 不設定索引(預設time索引)

PG 設定time索引

ts1=# \d+ ckts1
                                            Table "public.ckts1"
 Column |           Type           | Collation | Nullable | Default | Storage  | Stats target | Description 
--------+--------------------------+-----------+----------+---------+----------+--------------+-------------
 time   | timestamp with time zone |           | not null |         | plain    |              | 
 id     | integer                  |           |          |         | plain    |              | 
 col2   | integer                  |           |          |         | plain    |              | 
 col3   | integer                  |           |          |         | plain    |              | 
 col4   | integer                  |           |          |         | plain    |              | 
 col5   | integer                  |           |          |         | plain    |              | 
 col6   | integer                  |           |          |         | plain    |              | 
 col7   | integer                  |           |          |         | plain    |              | 
 col8   | integer                  |           |          |         | plain    |              | 
 col9   | integer                  |           |          |         | plain    |              | 
 col10  | integer                  |           |          |         | plain    |              | 
 col11  | integer                  |           |          |         | plain    |              | 
 col12  | character varying(30)    |           |          |         | extended |              | 
 col13  | character varying(30)    |           |          |         | extended |              | 
 col14  | character varying(30)    |           |          |         | extended |              | 
 col15  | character varying(30)    |           |          |         | extended |              | 
 col16  | character varying(30)    |           |          |         | extended |              | 
 col17  | character varying(30)    |           |          |         | extended |              | 
 col18  | character varying(30)    |           |          |         | extended |              | 
 col19  | character varying(30)    |           |          |         | extended |              | 
 col20  | character varying(30)    |           |          |         | extended |              | 
Indexes:
    "ckts1_time_idx" btree ("time" DESC)
Triggers:
    ts_insert_blocker BEFORE INSERT ON ckts1 FOR EACH ROW EXECUTE PROCEDURE _timescaledb_internal.insert_blocker()

postgres=# \d+ cts1
                                            Table "public.cts1"
 Column |           Type           | Collation | Nullable | Default | Storage  | Stats target | Description 
--------+--------------------------+-----------+----------+---------+----------+--------------+-------------
 time   | timestamp with time zone |           | not null |         | plain    |              | 
 id     | integer                  |           |          |         | plain    |              | 
 col2   | integer                  |           |          |         | plain    |              | 
 col3   | integer                  |           |          |         | plain    |              | 
 col4   | integer                  |           |          |         | plain    |              | 
 col5   | integer                  |           |          |         | plain    |              | 
 col6   | integer                  |           |          |         | plain    |              | 
 col7   | integer                  |           |          |         | plain    |              | 
 col8   | integer                  |           |          |         | plain    |              | 
 col9   | integer                  |           |          |         | plain    |              | 
 col10  | integer                  |           |          |         | plain    |              | 
 col11  | integer                  |           |          |         | plain    |              | 
 col12  | character varying(30)    |           |          |         | extended |              | 
 col13  | character varying(30)    |           |          |         | extended |              | 
 col14  | character varying(30)    |           |          |         | extended |              | 
 col15  | character varying(30)    |           |          |         | extended |              | 
 col16  | character varying(30)    |           |          |         | extended |              | 
 col17  | character varying(30)    |           |          |         | extended |              | 
 col18  | character varying(30)    |           |          |         | extended |              | 
 col19  | character varying(30)    |           |          |         | extended |              | 
 col20  | character varying(30)    |           |          |         | extended |              | 
Indexes:
    "cts1_time_index" btree ("time")

 

單行寫入

每執行緒10W行資料。每行約180bytes. 一個執行緒寫入約18MB。

看起來兩者效能相差不大,PG稍強5%~10%, 之前此場景下influxdb的測試資料也放在一起做個對比

執行緒平均速率(行/s) 單執行緒 2執行緒 4執行緒 8執行緒 16執行緒 32執行緒
timescaledb 1075 1008 1026 1045 923 654
PG 1092 1020 1070 1120 982 737
infuxdb 422 378 398 370 341 305
             
總速率(行/s) 單執行緒 2執行緒 4執行緒 8執行緒 16執行緒 32執行緒
timescaledb 1075 2011 4000 8166 14358 20337
PG 1092 2037 4037 8734 15087 22445
infuxdb 422 752 1588 2947 5444 9732


WAL檔案大小兩者基本一致,都是大約資料量的 2倍。WAL檔案增加

執行緒數 位元組數 PG_WAL_SIZE TS_WAL_SIZE
1 18697562 37428272 37464824
2 37379223 74547144 75026672
4 74785548 149803536 149525488
8 149548561 298455240 298400040
16 299134911 596227840 596302792
32 598385115 1191610952 1194038480

BATCH寫入

單執行緒行數設為1000萬, BATCHSIZE 設為1000

PG優於TIMESCALEDB。

每執行緒1000W行資料 batchsize=1000
執行緒平均速率(行/s) 單執行緒 8執行緒
timescaledb 26732 11916
PG 39113 14972
     
     
總速率(行/s) 單執行緒 8執行緒
timescaledb 26732 95140
PG 39113 119528

資源佔用

TDSB 32執行緒, CPU平均佔用 57%。 比PG高10%。

PG 32執行緒, CPU平均佔用 46%.

CASE 2 增加一個索引

 增加id為索引

ts1=# \d+ ckts1
                                            Table "public.ckts1"
 Column |           Type           | Collation | Nullable | Default | Storage  | Stats target | Description 
--------+--------------------------+-----------+----------+---------+----------+--------------+-------------
 time   | timestamp with time zone |           | not null |         | plain    |              | 
 id     | integer                  |           |          |         | plain    |              | 
 col2   | integer                  |           |          |         | plain    |              | 
 col3   | integer                  |           |          |         | plain    |              | 
 col4   | integer                  |           |          |         | plain    |              | 
 col5   | integer                  |           |          |         | plain    |              | 
 col6   | integer                  |           |          |         | plain    |              | 
 col7   | integer                  |           |          |         | plain    |              | 
 col8   | integer                  |           |          |         | plain    |              | 
 col9   | integer                  |           |          |         | plain    |              | 
 col10  | integer                  |           |          |         | plain    |              | 
 col11  | integer                  |           |          |         | plain    |              | 
 col12  | character varying(30)    |           |          |         | extended |              | 
 col13  | character varying(30)    |           |          |         | extended |              | 
 col14  | character varying(30)    |           |          |         | extended |              | 
 col15  | character varying(30)    |           |          |         | extended |              | 
 col16  | character varying(30)    |           |          |         | extended |              | 
 col17  | character varying(30)    |           |          |         | extended |              | 
 col18  | character varying(30)    |           |          |         | extended |              | 
 col19  | character varying(30)    |           |          |         | extended |              | 
 col20  | character varying(30)    |           |          |         | extended |              | 
Indexes:
    "ckts1_id_idx" btree (id)
    "ckts1_time_idx" btree ("time" DESC)
Triggers:
    ts_insert_blocker BEFORE INSERT ON ckts1 FOR EACH ROW EXECUTE PROCEDURE _timescaledb_internal.insert_blocker()

ts1=# 

postgres=# \d+ cts1
                                            Table "public.cts1"
 Column |           Type           | Collation | Nullable | Default | Storage  | Stats target | Description 
--------+--------------------------+-----------+----------+---------+----------+--------------+-------------
 time   | timestamp with time zone |           | not null |         | plain    |              | 
 id     | integer                  |           |          |         | plain    |              | 
 col2   | integer                  |           |          |         | plain    |              | 
 col3   | integer                  |           |          |         | plain    |              | 
 col4   | integer                  |           |          |         | plain    |              | 
 col5   | integer                  |           |          |         | plain    |              | 
 col6   | integer                  |           |          |         | plain    |              | 
 col7   | integer                  |           |          |         | plain    |              | 
 col8   | integer                  |           |          |         | plain    |              | 
 col9   | integer                  |           |          |         | plain    |              | 
 col10  | integer                  |           |          |         | plain    |              | 
 col11  | integer                  |           |          |         | plain    |              | 
 col12  | character varying(30)    |           |          |         | extended |              | 
 col13  | character varying(30)    |           |          |         | extended |              | 
 col14  | character varying(30)    |           |          |         | extended |              | 
 col15  | character varying(30)    |           |          |         | extended |              | 
 col16  | character varying(30)    |           |          |         | extended |              | 
 col17  | character varying(30)    |           |          |         | extended |              | 
 col18  | character varying(30)    |           |          |         | extended |              | 
 col19  | character varying(30)    |           |          |         | extended |              | 
 col20  | character varying(30)    |           |          |         | extended |              | 
Indexes:
    "cst1_id_index" btree (id)
    "cts1_time_index" btree ("time")

單行寫入

10萬行資料,單條寫入

和沒有新增索引時效能差不多,PG看起來效能下降更多一點。

總速率(行/s) 單執行緒
timescaledb 1051
PG 1019

 

BATCH寫入

每執行緒1000萬行資料,batchsize設為1000, 8執行緒處理,13.9G資料

增加一個索引以後,PG和TSDB比之前效能都有所降低,PG寫入仍舊比TSDB快。

每執行緒1000W行資料 batchsize=1000
執行緒平均速率(行/s) 單執行緒 8執行緒
timescaledb 26142 10591
PG 36861 13037
     
     
總速率(行/s) 單執行緒 8執行緒
timescaledb 26142 84588
PG 36861 103806

資源佔用

8執行緒,batchsize=1000, TSDB CPU佔用80%左右

8執行緒,batchsize=1000, PG CPU佔用60%左右

 

CASE 3 大量資料

設定PG的表cts1索引time為DESC(倒序),測試結果與上面並無不同

postgres=# \d+ cts1
                                            Table "public.cts1"
 Column |           Type           | Collation | Nullable | Default | Storage  | Stats target | Description 
--------+--------------------------+-----------+----------+---------+----------+--------------+-------------
 time   | timestamp with time zone |           | not null |         | plain    |              | 
 id     | integer                  |           |          |         | plain    |              | 
 col2   | integer                  |           |          |         | plain    |              | 
 col3   | integer                  |           |          |         | plain    |              | 
 col4   | integer                  |           |          |         | plain    |              | 
 col5   | integer                  |           |          |         | plain    |              | 
 col6   | integer                  |           |          |         | plain    |              | 
 col7   | integer                  |           |          |         | plain    |              | 
 col8   | integer                  |           |          |         | plain    |              | 
 col9   | integer                  |           |          |         | plain    |              | 
 col10  | integer                  |           |          |         | plain    |              | 
 col11  | integer                  |           |          |         | plain    |              | 
 col12  | character varying(30)    |           |          |         | extended |              | 
 col13  | character varying(30)    |           |          |         | extended |              | 
 col14  | character varying(30)    |           |          |         | extended |              | 
 col15  | character varying(30)    |           |          |         | extended |              | 
 col16  | character varying(30)    |           |          |         | extended |              | 
 col17  | character varying(30)    |           |          |         | extended |              | 
 col18  | character varying(30)    |           |          |         | extended |              | 
 col19  | character varying(30)    |           |          |         | extended |              | 
 col20  | character varying(30)    |           |          |         | extended |              | 
Indexes:
    "cts1_id_idx" btree (id)
    "cts1_time_idx" btree ("time" DESC)

ts1=# \d+ ckts1
                                            Table "public.ckts1"
 Column |           Type           | Collation | Nullable | Default | Storage  | Stats target | Description 
--------+--------------------------+-----------+----------+---------+----------+--------------+-------------
 time   | timestamp with time zone |           | not null |         | plain    |              | 
 id     | integer                  |           |          |         | plain    |              | 
 col2   | integer                  |           |          |         | plain    |              | 
 col3   | integer                  |           |          |         | plain    |              | 
 col4   | integer                  |           |          |         | plain    |              | 
 col5   | integer                  |           |          |         | plain    |              | 
 col6   | integer                  |           |          |         | plain    |              | 
 col7   | integer                  |           |          |         | plain    |              | 
 col8   | integer                  |           |          |         | plain    |              | 
 col9   | integer                  |           |          |         | plain    |              | 
 col10  | integer                  |           |          |         | plain    |              | 
 col11  | integer                  |           |          |         | plain    |              | 
 col12  | character varying(30)    |           |          |         | extended |              | 
 col13  | character varying(30)    |           |          |         | extended |              | 
 col14  | character varying(30)    |           |          |         | extended |              | 
 col15  | character varying(30)    |           |          |         | extended |              | 
 col16  | character varying(30)    |           |          |         | extended |              | 
 col17  | character varying(30)    |           |          |         | extended |              | 
 col18  | character varying(30)    |           |          |         | extended |              | 
 col19  | character varying(30)    |           |          |         | extended |              | 
 col20  | character varying(30)    |           |          |         | extended |              | 
Indexes:
    "ckts1_id_idx" btree (id)
    "ckts1_time_idx" btree ("time" DESC)
Triggers:
    ts_insert_blocker BEFORE INSERT ON ckts1 FOR EACH ROW EXECUTE PROCEDURE _timescaledb_internal.insert_blocker()

懷疑因為資料量不夠大,導致TSDB寫入效能優勢沒能體現

增大資料量到1億行

batchsize = 1000,單執行緒寫入

行數 位元組數 PG執行時間 TSDB執行時間 PG行速率 TSDB行速率(行/s) TSDB TRUNK數量
2000萬 3.45GB 565 s 817 s 35398 (行/s) 24480 (行/s) 30
1億 17.4GB 2782 s 3992 s 35945 (行/s) 25050 (行/s) 166

結果仍然是PG寫入速度更快。

To be continued...