Mysql

將 innodb_buffer_pool_instances 設置為大於 CPU 數量是不是很浪費?

  • March 21, 2018

innodb_buffer_pool_size在具有 12 個 CPU 核心的伺服器上將其設置為 20GB。我的完整數據庫是 11gb,但其中大部分是幾乎從未使用過的存檔表。總查詢數據約為 3 GB,經常查詢的數據約為 1.25 GB。

我應該設置什麼innodb_buffer_pool_instances

  1. innodb_buffer_pool_size/ 總查詢數據 = 6 個池實例
  2. innodb_buffer_pool_size/ 頻繁查詢的數據 = 16 個池實例

通常我會選擇選項#2,但從邏輯上講,任何時候都可以使用的緩衝池的數量似乎不超過 CPU 核心的總數。

innodb_buffer_pool_instances設置為超過 CPU 核心數是不是很浪費?

我認為您不需要為查詢數據提供太多緩衝池,因為頻繁查詢數據的大小並不能完全證明它是合理的。這當然取決於“經常”的定義。

您應該在此處引用有關 innodb 緩衝池的頁面的相應文件:

http://dev.mysql.com/doc/refman/5.5/en/innodb-multiple-buffer-pools.html

我在這里關注的數字是

經常查詢的數據約為 1.25 GB。

當試圖保持 InnoDB 緩衝區的大小正確時,我的經驗法則是將它們保持在 1GB 左右,以保持塊列表盡可能短,但防止緩衝區列表太遠,這將但是,始終取決於您的實際需求。

這符合 MySQL 的建議:

為了獲得最佳效率,請指定 innodb_buffer_pool_instances 和 innodb_buffer_pool_size 的組合,以便每個緩衝池實例至少為 1 GB。

多個緩衝池的目的是確保您的 CPU 執行緒在訪問數據時不會遇到高爭用。或者正如他們所說:

您可能會遇到多個執行緒嘗試同時訪問緩衝池的瓶頸。您可以啟用多個緩衝池以盡量減少這種爭用。

但是,此功能更適用於頻繁訪問的大量數據,而不是您系統經常使用的 1.25GB。最終,如果我處於您的位置,假設所有 CPU 僅執行 MySQL 相關任務,我認為不需要擁有比 CPU 數量更多的緩衝池。我還將研究使用的影響,innodb_old_blocks_time以防止對存檔表的偶爾查詢取代反複使用的數據塊。

我希望這會有所幫助,讓我知道一切如何。

對於 11gb 的數據大小,我會考慮使用 12gb 的池大小和 12 個 1gb 的池,除非您的伺服器是純 db,並且您只有 ram 可以扔掉

引用自:https://dba.stackexchange.com/questions/94423