歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> MariaDB 5.5 在 Windows 下的性能測試

MariaDB 5.5 在 Windows 下的性能測試

日期:2017/2/28 15:47:22   编辑:Linux教程

我們有很長時間沒有發布過在 Windows 下的基准測試文章了,而 Windows 下的 MariaDB 包含一些專門做的改進,這些改進很多人並不知曉,因為我們自己也很少提及。本文的目的是向你展示 MariaDB 在 Windows 下的性能表現。

進行測試的機器包含2個CPU共8核的處理器(這是我手頭上能找到最好的機器了)、10K SAS 磁盤(RAID1),使用 sysbench 0.4 測試單表共100萬行記錄。我通過網絡來運行這個壓力測試,並發的客戶端從 4 到 4096。

這裡是 OLTP-只讀 吞吐量測試結果:

說明:

  • 絕大多數的測試結果表明,MariaDB 的吞吐量比 MySQL 高出 10% 左右
  • 在 4096 並發客戶端時,MariaDB 的吞吐量是 MySQL 5.5 的 四倍多 476% (2382 vs 413 TPS).

很多人理所當然的認為吞吐量並不能代表數據庫的整體性能表現。在 OLTP 的基准測試中,響應時間同樣很重要,實際上它比吞吐量更加重要,這點我同意,因此,下面是查詢的響應時間,意味著 95% 的事務都在指定的時間內處理完畢。

OLTP 只讀響應時間

並發數 4 8 16 32 64 128 256 512 1024 2048 4096 MariaDB 4.87 6.81 8.83 12.35 22.12 43.56 90.35 180.57 619.05 1003.88 1965.77 MySQL 4.86 7.14 9.96 16.21 37.39 101.33 238.89 499.63 971.07 2241.83 25215.29

上表中顯示,MariaDB 5.5 不管是在吞吐量還是響應時間方面都是優於 MySQL 的。

但是,為什麼 MariaDB 在 Windows 下的只讀測試由於 MySQL 5.5 呢?二者基於同一個代碼,表現應該也相同啊。這個問題的答案並不是 MariaDB 做了什麼優化,也無關 XtraDB 和 InnoDB 的優劣。答案是 MariaDB threadpool. 這個線程池在 Windows 平台是默認啟用的。

可是,為什麼使用線程池就可以有如此好的性能呢?答案是 MariaDB 承擔了通過調整線程池的大小並回調到對應的 Windows 本身的線程池,這在操作系統這一級別上相當於黑盒排序,因此能獲取良好的性能。Windows 內置的線程池的核心,是自 NT 3.5 就有的技術,這是 Windows 專有的特性,運行在其上的服務器應該使用這種技術。要讓這項技術運行良好的招數是:

  • 不要讓同一時間在同一個 CPU 上運行太多的線程,這樣可減少上下文切換,這是提高吞吐量的最重要的因素
  • 在完成的 LIFO 順序中激活線程等待,熱門的線程保持熱門,可降低緩存失效
  • 順序處理 IO 完成,這是響應時間表現良好的因素
  • 最後便是降低熱鎖的爭用

由此,線程池是只讀性能表現佳的主要因素。

下一個有趣的問題是在寫操作上 MariaDB 表現是否一致。因此我們使用寫模式來運行 sysbench 工具,也就是 update_non_index (每個查詢對一個非索引的整數字段進行加值處理)。為了最大化寫的吞吐量,我們設置了參數 innodb_flush_log_at_trx_commit 值為 0,每次日志的寫入是每秒一次,而不是每次事務提交一次。

測試結果如下:

OLTP write-only (update_non_index/flush_log=0) 吞吐量:

這個結果看起來很棒,差別來源於多個因素,包括 XtraDB 的寫性能、分組提交、線程池等都對這個結果會有影響。但我想 Windows 平台下的 MariaDB 的 asynchronous IO optimization (異步 IO 優化) 是最主要的因素。

在上述測試中,所有 IO 相關的參數和 InnoDB 參數都使用的是默認值,結果看起來太好了以至於讓我們懷疑這是真的。我真的想通過調整為 innodb_io_capacity and/or innodb_write_io_threads 參數為 MySQL 帶來更加的性能,有人知道該如何調整嗎?

OLTP writeonly (update_non_index/flush_log=0) 響應時間, 95 percentile

並發數 4 8 16 32 64 128 256 512 1024 2048 MariaDB 0.33 0.63 0.75 1.06 1.94 3.85 8.25 21.38 129.79 274.40 MySQL 0.32 0.61 0.73 1.61 7.62 26.82 96.45 219.29 661.19 2723.36

下面是對數據庫的參數調整:

[mysqld]
sql-mode="NO_ENGINE_SUBSTITUTION"
back_log=500
user=root
port=3306
max_connections=4096
max_connect_errors=5000
max_prepared_stmt_count=50000
table_cache=2048
transaction_isolation=REPEATABLE-READ
loose-skip-external-locking
innodb_status_file=0
innodb_data_file_path=ibdata1:200M:autoextend
innodb_buffer_pool_size=1G
innodb_additional_mem_pool_size=20M
innodb_log_file_size=650M
innodb_log_buffer_size=100M
innodb_support_xa=0
innodb_doublewrite=0
innodb_flush_log_at_trx_commit=0
query-cache-size=0
query-cache-type=0
symbolic-links=0

skip-grant-tables

Copyright © Linux教程網 All Rights Reserved