作者:Vadim Tkachenko
翻譯:管長(zhǎng)龍
本文來(lái)源:https://www.percona.com/blog/2020/08/13/how-many-innodb_buffer_pool_instances-do-you-need-in-MySQL-8/
我曾經(jīng)在文章《MySQL 5.7 安裝后的性能調(diào)優(yōu)》(文末鏈接)和《MySQL 101:調(diào)整 MySQL 性能的參數(shù)》(文末鏈接)中談到過(guò) innodb_buffer_pool_instances 這個(gè)參數(shù) ,建議使用值為“8”,但我不能說(shuō)這個(gè)值是否足夠好。因此,讓我們看看在以下情況下,使用不同的 innodb_buffer_pool_instances 值將獲得什么結(jié)果。
我將使用 sysbench oltp_read_write 基準(zhǔn)測(cè)試顯示為帕累托圖。我將為大小為 100 GB 的數(shù)據(jù)庫(kù)設(shè)置 innodb_buffer_pool_size = 25GB,因此在 buffer_pool 空間上會(huì)有競(jìng)爭(zhēng),這將是 IO 密集型情景情況。
基準(zhǔn)測(cè)試
硬件配置列表:
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
通過(guò) SATA SSD INTEL SSDSC2KB960G8(英特爾企業(yè)級(jí) SSD D3-S4510)上的存儲(chǔ)。
簡(jiǎn)短的設(shè)置概述:
- 數(shù)據(jù)無(wú)法存儲(chǔ)到內(nèi)存中(數(shù)據(jù)大小為?100GB,服務(wù)器上的內(nèi)存為 188GB,我們使用 O_DIRECT 為 MySQL innodb_buffer_pool_size 分配了 25GB,因此即使服務(wù)器上有很多內(nèi)存,也不會(huì)超過(guò)指定的 25GB 使用)。
- 存儲(chǔ)上工作主要為讀寫(xiě)密集型(將從存儲(chǔ)中進(jìn)行讀?。?,并且在 MySQL 中進(jìn)行了完全的 ACID 兼容和數(shù)據(jù)安全設(shè)置。
- 對(duì)于 SATA SSD 存儲(chǔ),innodb_io_capacity 將設(shè)置為 2000,而 innodb_io_capacity_max 為 4000。
- 將 innodb_buffer_pool_instances 測(cè)試以下值:1、2、4、8、16、32、64。
- innodb_buffer_pool_instances = 64,也是 MySQL 允許的最大值。
測(cè)試命令:
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
基準(zhǔn)測(cè)試將運(yùn)行三個(gè)小時(shí),每 1 秒報(bào)告一次吞吐量。
SATA SSD 上的結(jié)果
讓我們看看每個(gè) innodb_buffer_pool_instances 分別有什么結(jié)果:
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
似乎顯而易見(jiàn)的是,隨著我們?cè)黾?innodb_buffer_pool_instances 的值,它對(duì)吞吐量的變化產(chǎn)生了積極的影響。我們可以將結(jié)果壓縮到一個(gè)圖表中,以便仔細(xì)查看:
如果要比較吞吐量和偏差,請(qǐng)比較最近 2500 秒的結(jié)果:
因此,實(shí)際上 innodb_buffer_pool_instances = 64 顯示出最佳的吞吐量和較小的可變性。從可變性的角度來(lái)看,建議的 innodb_buffer_pool_instances = 8 似乎比 1-4 的值更好,但不會(huì)產(chǎn)生最佳的吞吐量。
最后的想法
對(duì)于這種特殊情況,innodb_buffer_pool_instances = 64 是最佳選擇,但我仍然不建議一種可靠的方法來(lái)找到最佳值。較小的 1-4 似乎會(huì)產(chǎn)生很大的可變性甚至停滯,因此從 8 開(kāi)始是一個(gè)不錯(cuò)的選擇。