將 innodb_buffer_pool_instances 設置為大於 CPU 數量是不是很浪費?
我
innodb_buffer_pool_size
在具有 12 個 CPU 核心的伺服器上將其設置為 20GB。我的完整數據庫是 11gb,但其中大部分是幾乎從未使用過的存檔表。總查詢數據約為 3 GB,經常查詢的數據約為 1.25 GB。我應該設置什麼
innodb_buffer_pool_instances
?
innodb_buffer_pool_size
/ 總查詢數據 = 6 個池實例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 可以扔掉