Percona Server MySQL 5.7新引擎MyRocks性能基準測試

本文中,我們將通過基準測試來給大家展示MyRocks引擎的性能。

Percona Server MySQL 5.7新引入的一個數據庫引擎。關於他性能可能還是還待探索,所以今天我們就一起來看看它在相對高端的服務器和SSD存儲下的性能表現。

我們想要檢查它對於給定的數據庫不同大小的可用內存情況表現。它與之前Percona官方發佈的InnoDB基準測試相同的條件下,我們使用sysbench-tpcc基準測試,用InnoDB作為基準,然後用其對MyRocks和InnoDB兩種引擎進行對比測試。

作為基準測試,我將使用100個TPC-C倉庫,以及一組10個表格(從行遞增調整瓶頸)。這應該提供大約90GB的數據大小(加載到InnoDB時),大致相當於1000個數據倉庫的數據量。

為了改變內存大小,我們將InnoDB的innodb_buffer_pool_size從5GB更改為100GB,MyRocks的 rocksdb_block_cache_size也做同樣修改。

對於MyRocks,我們將使用LZ4作為存盤的默認壓縮。 MyRocks存儲引擎中的數據大小為21GB。需要注意的是是,在MyRocks中未壓縮的數據存儲上限70GB。

這兩種引擎,均未使用FOREIGN KEYS,因為MyRocks目前還不支持。

MyRocks不支持Percona Server中實現的REPEATABLE-READ模式中的"SELECT .. FOR UPDATE"語句。但是,在此基準測試中使用了"SELECT .. FOR UPDATE"。必須使用READ-COMMITTED模式。

還要提及的最重要的設置是啟用二進制日誌,原因如下:

1、任何重要的生產系統都都會啟用二進制日誌

2、如果禁用的二進制日誌,MyRocks會受到的非最優事務協調器的影響

我們對二進制日誌使用了以下設置:

binlog_format ='ROW'

binlog_row_image = minimal

sync_binlog = 10000(我沒有使用0,因為這會在二進制日誌轉存到硬盤時候時候導致嚴重的卡頓)

雖然我並不是MyRocks調優的完整專家,但我使用了此頁面的調優建議:github上 /facebook/mysql-5.6/wiki/my.cnf-tuning。同時Facebook-MyRocks工程團隊還為我們提供了關於MyRocks最佳設置配置。

結果展示

內存性能

讓我們回顧一下不同內存大小的結果。

這第一張圖顯示吞吐量抖動。這有助於瞭解吞吐量結果的分佈情況。吞吐量每1秒測量一次,圖表上顯示運行2000秒後的所有測量結果(每次運行的總長度為3600秒)。所以我們展示了每次運行的最後1600秒(去除準備熱身階段):

Percona Server MySQL 5.7新引擎MyRocks性能基準測試

為了更好地量化結果,讓我們對比看boxplot圖。理解箱型圖的最快方法是看中間線。它代表測量的中位數。

Percona Server MySQL 5.7新引擎MyRocks性能基準測試

內存吞吐變化

在我們給出結果總結之前,讓我們來看看InnoDB和MyRocks的吞吐量變化。我們100GB內存分配的結果將放大到的1秒分辨率圖表:

Percona Server MySQL 5.7新引擎MyRocks性能基準測試

我們可以看到,MyRocks在定期1秒性能下降中變化很大。目前,我們還不知道導致吞吐量變化的原因。

因此,讓我們來看看不同內存設置下每個引擎的平均吞吐量(結果以tps為單位,而且越多越好):

Memory, GB

InnoDB

MyRocks

5

849.0664

4205.714

10

1321.9

4298.217

20

1808.236

4333.424

30

2275.403

4394.413

40

2968.101

4459.578

50

3867.625

4503.215

60

4756.551

4571.163

70

5527.853

4576.867

80

5984.642

4616.538

90

5949.249

4620.87

100

5961.2

4599.143

這是MyRocks與InnoDB行為不同的地方。 InnoDB從額外的內存中受益良多,直到增加到工作數據集的大小。之後,內存增加被限制。

於此對比,有趣的是MyRocks並沒有從額外的內存中獲益。

基本上,MyRocks按預期執行寫優化引擎。有關更多詳細信息,請參閱我的文章"三種基本數據結構如何影響存儲和檢索"。

總之,當工作數據集適合(或幾乎適合)可用內存時,InnoDB的性能會更好(與其本身相比),而MyRocks可以在小內存上運行(並且勝過InnoDB)。

IO和CPU使用率

值得關注的是每個引擎的資源利用率。我們對每次運行都進行了vmstat測量,以便分析IO和CPU使用情況。

寫性能

首先,讓我們回顧一下每秒寫入的數量(以KB/秒為單位)。注意,這些寫操作也包括二進制日誌寫入,而不僅僅是存儲引擎寫入。

Memory, GB

InnoDB

MyRocks

5

244754.4

87401.54

10

290602.5

89874.55

20

311726

93387.05

30

313851.7

93429.92

40

316890.6

94044.94

50

318404.5

96602.42

60

276341.5

94898.08

70

217726.9

97015.82

80

184805.3

96231.51

90

187185.1

96193.6

100

184867.5

97998.26

我們還計算了各存儲引擎每次執行的寫入次數:

Percona Server MySQL 5.7新引擎MyRocks性能基準測試

上面的圖顯示了InnoDB和MyRocks之間的本質區別。 MyRocks是一個寫優化的引擎,每個事務使用的寫入量不變。

相比較InnoDB,寫入的數量很大程度上取決於內存大小。我們擁有的內存越少,它需要執行的寫入就越多。

讀性能

下表顯示了以每秒KB為單位的讀取。

Memory, GB

InnoDB

MyRocks

5

218343.1

171957.77

10

171634.7

146229.82

20

148395.3

125007.81

30

146829.1

110106.87

40

144707

97887.6

50

132858.1

87035.38

60

98371.2

77562.45

70

42532.15

71830.09

80

3479.852

66702.02

90

3811.371

64240.41

100

1998.137

62894.54

我們可以將其轉換為每個事務的讀取次數:

Percona Server MySQL 5.7新引擎MyRocks性能基準測試

這張圖顯示了MyRocks的讀取放大。分配更多內存有助於減少IO讀取,但不如InnoDB那麼明顯。

CPU使用率

讓我們在看看兩個存儲引擎的CPU使用情況。先是InnoDB:

Percona Server MySQL 5.7新引擎MyRocks性能基準測試

該圖表顯示,對於5GB內存大小,InnoDB大部分時間用於IO等待(綠色區域),並且CPU使用率(藍色區域)隨著更多內存的增加而增加。

做為對比MyRocks的情況:

Percona Server MySQL 5.7新引擎MyRocks性能基準測試

其詳細表格數據如下:

Memory, GB

engine

us

sys

wa

id

5

InnoDB

8

2

57

33

5

MyRocks

56

11

18

15

10

InnoDB

12

3

57

28

10

MyRocks

57

11

18

13

20

InnoDB

16

4

55

25

20

MyRocks

58

11

19

11

30

InnoDB

20

5

50

25

30

MyRocks

59

11

19

10

40

InnoDB

26

7

44

24

40

MyRocks

60

11

20

9

50

InnoDB

35

8

38

19

50

MyRocks

60

11

21

7

60

InnoDB

43

10

36

10

60

MyRocks

61

11

22

6

70

InnoDB

51

12

34

4

70

MyRocks

61

11

23

5

80

InnoDB

55

12

31

1

80

MyRocks

61

11

23

5

90

InnoDB

55

12

32

1

90

MyRocks

61

11

23

4

100

InnoDB

55

12

32

1

100

MyRocks

61

11

24

4

我們可以看到無論分配了多少內存,MyRocks都使用了很多CPU(用戶+系統態)。這導致MyRocks性能受限於CPU性能而非可用內存的限制。

MyRocks目錄大小

隨著MyRocks寫入所有更改並壓縮成SST文件,可以看到基準測試期間數據目錄大小如何變化,以便我們估算存儲需求。下面是數據目錄大小的圖表:

Percona Server MySQL 5.7新引擎MyRocks性能基準測試

我們可以看到,數據目錄從開始時的20GB變為基準期間的31GB。觀察數據增長直到壓縮,然後縮小呈現週期性的規律變化。

結論

總之,我可以說MyRocks性能隨著數據集大小與內存的比例增加而增加,在5GB內存分配的情況下,性能比InnoDB高出近5倍。吞吐量變化是值得關注的問題,但我們希望這一點在未來得到改善。

MyRocks不需要大量內存,並且在使用大部分CPU資源時顯示穩定地寫入IO。

我們認為這特性可能會使MyRocks成為雲數據庫實例的絕佳選擇,而內存和IO都消費都會比較合算。 MyRocks部署可以讓雲部署更便宜。

我們將跟進更多基於雲計算的基準測試。

附件

原始結果,腳本和測試配置

我的目標是提供完全可重複的基準測試。為此,我們在GitHub分享相關信息包括我們使用的所有腳本和設置:

Github鏈接:Percona-Lab-results/201803-sysbench-tpcc-myrocks

MyRocks設置

rocksdb_max_open_files=-1

rocksdb_max_background_jobs=8

rocksdb_max_total_wal_size=4G

rocksdb_block_size=16384

rocksdb_table_cache_numshardbits=6

# rate limiter

rocksdb_bytes_per_sync=16777216

rocksdb_wal_bytes_per_sync=4194304

rocksdb_compaction_sequential_deletes_count_sd=1

rocksdb_compaction_sequential_deletes=199999

rocksdb_compaction_sequential_deletes_window=200000

rocksdb_default_cf_options="write_buffer_size=256m;target_file_size_base=32m;max_bytes_for_level_base=512m;max_write_buffer_number=4;level0_file_num_compaction_trigger=4;level0_slowdown_writes_trigger=20;level0_stop_writes_trigger=30;max_write_buffer_number=4;block_based_table_factory={cache_index_and_filter_blocks=1;filter_policy=bloomfilter:10:false;whole_key_filtering=0};level_compaction_dynamic_level_bytes=true;optimize_filters_for_hits=true;memtable_prefix_bloom_size_ratio=0.05;prefix_extractor=capped:12;compaction_pri=kMinOverlappingRatio;compression=kLZ4Compression;bottommost_compression=kLZ4Compression;compression_opts=-14:4:0"

rocksdb_max_subcompactions=4

rocksdb_compaction_readahead_size=16m

rocksdb_use_direct_reads=ON

rocksdb_use_direct_io_for_flush_and_compaction=ON

InnoDB設置

# files

innodb_file_per_table

innodb_log_file_size=15G

innodb_log_files_in_group=2

innodb_open_files=4000

# buffers

innodb_buffer_pool_size= 200G

innodb_buffer_pool_instances=8

innodb_log_buffer_size=64M

# tune

innodb_doublewrite= 1

innodb_support_xa=0

innodb_thread_concurrency=0

innodb_flush_log_at_trx_commit= 1

innodb_flush_method=O_DIRECT_NO_FSYNC

innodb_max_dirty_pages_pct=90

innodb_max_dirty_pages_pct_lwm=10

innodb_lru_scan_depth=1024

innodb_page_cleaners=4

join_buffer_size=256K

sort_buffer_size=256K

innodb_use_native_aio=1

innodb_stats_persistent = 1

#innodb_spin_wait_delay=96

# perf special

innodb_adaptive_flushing = 1

innodb_flush_neighbors = 0

innodb_read_io_threads = 4

innodb_write_io_threads = 2

innodb_io_capacity=2000

innodb_io_capacity_max=4000

innodb_purge_threads=4

硬件和系統配置列表

超微服務器:

CPU:

Intel(R) Xeon(R) CPU E5-2683 v3 @ 2.00GHz

2 sockets / 28 cores / 56 threads

內存: 256GB of RAM

硬盤: 三星 SM863 1.9TB Enterprise SSD

文件系統: ext4

數據庫:Percona-Server-5.7.21-20

操作系統: Ubuntu 16.04.4, linux內核 4.13.0-36-generic

本文蟲蟲譯自percona官方博客,作者是percona聯合創始人Vadim Tkachenko和CTO。(原文鏈接見percona最新blog,此處略)。


分享到:


相關文章: