作者:Vadim Tkachenko
翻譯:管長龍
本文來源:https://www.percona.com/blog/2020/08/13/how-many-innodb_buffer_pool_instances-do-you-need-in-MySQL-8/
我曾經在文章《MySQL 5.7 安裝后的性能調優》(文末鏈接)和《MySQL 101:調整 MySQL 性能的參數》(文末鏈接)中談到過 innodb_buffer_pool_instances 這個參數 ,建議使用值為“8”,但我不能說這個值是否足夠好。因此,讓我們看看在以下情況下,使用不同的 innodb_buffer_pool_instances 值將獲得什么結果。
我將使用 sysbench oltp_read_write 基準測試顯示為帕累托圖。我將為大小為 100 GB 的數據庫設置 innodb_buffer_pool_size = 25GB,因此在 buffer_pool 空間上會有競爭,這將是 IO 密集型情景情況。
基準測試
硬件配置列表:
System | Supermicro; SYS-F619P2-RTN; v0123456789 (Other)
Platform | linux
Release | Ubuntu 18.04.4 LTS (bionic)
Kernel | 5.3.0-42-generic
Architecture | CPU = 64-bit, OS = 64-bit
Threading | NPTL 2.27
SELinux | No SELinux detected
Virtualized | No virtualization detected
# Processor ##################################################
Processors | physical = 2, cores = 40, virtual = 80, hyperthreading = yes
Models | 80xIntel(R) Xeon(R) Gold 6230 CPU @ 2.10GHz
Caches | 80x28160 KB
# Memory #####################################################
Total | 187.6G
通過 SATA SSD INTEL SSDSC2KB960G8(英特爾企業級 SSD D3-S4510)上的存儲。
簡短的設置概述:
- 數據無法存儲到內存中(數據大小為?100GB,服務器上的內存為 188GB,我們使用 O_DIRECT 為 MySQL innodb_buffer_pool_size 分配了 25GB,因此即使服務器上有很多內存,也不會超過指定的 25GB 使用)。
- 存儲上工作主要為讀寫密集型(將從存儲中進行讀取),并且在 MySQL 中進行了完全的 ACID 兼容和數據安全設置。
- 對于 SATA SSD 存儲,innodb_io_capacity 將設置為 2000,而 innodb_io_capacity_max 為 4000。
- 將 innodb_buffer_pool_instances 測試以下值:1、2、4、8、16、32、64。
- innodb_buffer_pool_instances = 64,也是 MySQL 允許的最大值。
測試命令:
sysbench oltp_read_write --threads=150 --time=10000
--tables=40 --table_size=10000000 --mysql-host=127.0.0.1
--mysql-user=sbtest --mysql-password=sbtest
--max-requests=0 --report-interval=1 --mysql-db=sbtest
--mysql-ssl=off --create_table_options=DEFAULT CHARSET=utf8mb4
--report_csv=yes --rand-type=pareto run
基準測試將運行三個小時,每 1 秒報告一次吞吐量。
SATA SSD 上的結果
讓我們看看每個 innodb_buffer_pool_instances 分別有什么結果:
innodb_buffer_pool_instances=1
innodb_buffer_pool_instances=2
innodb_buffer_pool_instances=4
innodb_buffer_pool_instances=8
innodb_buffer_pool_instances=16
innodb_buffer_pool_instances=32
innodb_buffer_pool_instances=64
似乎顯而易見的是,隨著我們增加 innodb_buffer_pool_instances 的值,它對吞吐量的變化產生了積極的影響。我們可以將結果壓縮到一個圖表中,以便仔細查看:
如果要比較吞吐量和偏差,請比較最近 2500 秒的結果:
因此,實際上 innodb_buffer_pool_instances = 64 顯示出最佳的吞吐量和較小的可變性。從可變性的角度來看,建議的 innodb_buffer_pool_instances = 8 似乎比 1-4 的值更好,但不會產生最佳的吞吐量。
最后的想法
對于這種特殊情況,innodb_buffer_pool_instances = 64 是最佳選擇,但我仍然不建議一種可靠的方法來找到最佳值。較小的 1-4 似乎會產生很大的可變性甚至停滯,因此從 8 開始是一個不錯的選擇。