配置InnoDB緩衝池(Buffer Pool)大小

1.配置InnoDB緩衝池(Buffer Pool)大小
當服務器正運行時,用戶可以離線(啓動時)或在線配置InnoDB緩衝池大小。這部分描述的行爲適用這兩種方法。
當增加或減少innodb_buffer_pool_size時,該操作按照數據塊(chunks)執行。數據塊的大小通過innodb_buffer_pool_chunk_size配置選項進行定義,該選項默認爲128M.
緩衝池大小必須總是等於innodb_buffer_pool_chunk_size* innodb_buffer_pool_instances或爲其倍數。如果將innodb_buffer_pool_size配置爲不等於innodb_buffer_pool_chunk_size *
innodb_buffer_pool_instances或不爲其倍數,則緩衝池大小自動調整爲等於innodb_buffer_pool_chunk_size * innodb_buffer_pool_instances或不小於指定緩衝池大小的該乘積的倍數。
下述實例中,innodb_buffer_pool_size設置爲8G,innodb_buffer_pool_instances設置爲16。innodb_buffer_pool_chunk_size爲默認的128M。8G是一個有效的innodb_buffer_pool_size值,
因爲8G爲innodb_buffer_pool_instances=16*innodb_buffer_pool_chunk_size=128M=2G的倍數。
shell> mysqld --innodb_buffer_pool_size=8G --innodb_buffer_pool_instances=16
mysql> SELECT @@innodb_buffer_pool_size/1024/1024/1024;
+------------------------------------------+
| @@innodb_buffer_pool_size/1024/1024/1024 |
+------------------------------------------+
| 8.000000000000 |
+------------------------------------------+
下述實例中,innodb_buffer_pool_size被設置爲9G,innodb_buffer_pool_instances設置爲16。innodb_buffer_pool_chunk_size爲默認值128M。這種場景,9G不是
innodb_buffer_pool_instances=16*innodb_buffer_pool_chunk_size=128M=2G的倍數,因此,innodb_buffer_pool_size被調整爲10G,其爲innodb_buffer_pool_chunk_size
*innodb_buffer_pool_instances=2G不小於innodb_buffer_pool_size的下一個倍數。
shell> mysqld --innodb_buffer_pool_size=9G --innodb_buffer_pool_instances=16
mysql> SELECT @@innodb_buffer_pool_size/1024/1024/1024;
+------------------------------------------+
| @@innodb_buffer_pool_size/1024/1024/1024 |
+------------------------------------------+
| 10.000000000000 |
+------------------------------------------+

2.配置InnoDB緩衝池數據塊(Buffer Pool Chunk)的大小
innodb_buffer_pool_chunk_size能按照1M(1048576字節)單位增加和減少,但該選項只能在啓動時在命令行或選項文件中進行修改。
命令行:
shell> mysqld --innodb_buffer_pool_chunk_size=134217728
配置文件:
[mysqld]
innodb_buffer_pool_chunk_size=134217728
當修改innodb_buffer_pool_chunk_size時,下列條件適用:
1)當緩衝池初始化時,如果新的innodb_buffer_pool_chunk_size*innodb_buffer_pool_instacnes大於當前的緩衝池大小,則innodb_buffer_pool_chunk_size被截斷爲innodb_buffer_pool_size/
innodb_buffer_pool_instances的值。
例如:如果緩衝池以2GB(2147483648字節)初始化,4個緩衝池實例,1GB(1073741824字節)的數據塊大小,那麼,數據塊大小將被截斷爲等於innodb_buffer_pool_size / innodb_buffer_pool_instances=500MB的值,如下所示:
shell> mysqld --innodb_buffer_pool_size=2147483648 --innodb_buffer_pool_instances=4 --innodb_buffer_pool_chunk_size=1073741824;
mysql> SELECT @@innodb_buffer_pool_size;
+---------------------------+
| @@innodb_buffer_pool_size |
+---------------------------+
| 2147483648 |
+---------------------------+
mysql> SELECT @@innodb_buffer_pool_instances;
+--------------------------------+
| @@innodb_buffer_pool_instances |
+--------------------------------+
| 4 |
+--------------------------------+
#數據塊大小啓動時被設置爲1GB(1073741824字節)但被截斷爲innodb_buffer_pool_size / innodb_buffer_pool_instances
mysql> SELECT @@innodb_buffer_pool_chunk_size;
+---------------------------------+
| @@innodb_buffer_pool_chunk_size |
+---------------------------------+
| 536870912 |
+---------------------------------+
2)緩衝池大小必須總是等於innodb_buffer_pool_chunk_size*innodb_buffer_pool_instances或爲其倍數。如果調整了innodb_buffer_pool_chunk_size,innodb_buffer_pool_size將自動調整爲不小於當前緩衝池大小的等於或數倍於innodb_buffer_pool_chunk_size * innodb_buffer_pool_instances的值。當緩衝池初始化時調整發生。下述實例將對該行爲進行說明:
# 緩衝池爲默認值128MB(134217728字節)
mysql> SELECT @@innodb_buffer_pool_size;
+---------------------------+
| @@innodb_buffer_pool_size |
+---------------------------+
| 134217728 |
+---------------------------+
# 數據塊大小也是128MB (134217728字節)
mysql> SELECT @@innodb_buffer_pool_chunk_size;
+---------------------------------+
| @@innodb_buffer_pool_chunk_size |
+---------------------------------+
| 134217728 |
+---------------------------------+
# 單個緩衝池實例
mysql> SELECT @@innodb_buffer_pool_instances;
+--------------------------------+
| @@innodb_buffer_pool_instances |
+--------------------------------+
| 1 |
+--------------------------------+
#啓動時數據塊大小減少1MB (1048576字節) 
# (134217728 - 1048576 = 133169152):
shell> mysqld --innodb_buffer_pool_chunk_size=133169152
mysql> SELECT @@innodb_buffer_pool_chunk_size;
+---------------------------------+
| @@innodb_buffer_pool_chunk_size |
+---------------------------------+
| 133169152 |
+---------------------------------+
# 緩衝池大小從134217728增加至266338304
# 緩衝池自動調整爲不小於當前緩衝池大小的等於或數倍於innodb_buffer_pool_chunk_size * innodb_buffer_pool_instances的值
mysql> SELECT @@innodb_buffer_pool_size;
+---------------------------+
| @@innodb_buffer_pool_size |
+---------------------------+
| 266338304 |
+---------------------------+
下述實例說明了多個緩衝池實例的同樣行爲:
# 緩衝池大小爲2GB(2147483648字節)
mysql> SELECT @@innodb_buffer_pool_size;
+---------------------------+
| @@innodb_buffer_pool_size |
+---------------------------+
| 2147483648 |
+---------------------------+
# 數據塊大小爲0.5 GB (536870912字節)
mysql> SELECT @@innodb_buffer_pool_chunk_size;
+---------------------------------+
| @@innodb_buffer_pool_chunk_size |
+---------------------------------+
| 536870912 |
+---------------------------------+
# 有4個緩衝池實例
mysql> SELECT @@innodb_buffer_pool_instances;
+--------------------------------+
| @@innodb_buffer_pool_instances |
+--------------------------------+
| 4 |
+--------------------------------+
# 啓動時數據塊大小被減少1MB (1048576字節)
# (536870912 - 1048576 = 535822336):
shell> mysqld --innodb_buffer_pool_chunk_size=535822336
mysql> SELECT @@innodb_buffer_pool_chunk_size;
+---------------------------------+
| @@innodb_buffer_pool_chunk_size |
+---------------------------------+
| 535822336 |
+---------------------------------+
# 緩衝池大小從2147483648增大至4286578688
# 緩衝池大小自動調整爲不小於目前2147483648字節大小等於或數倍於innodb_buffer_pool_chunk_size * innodb_buffer_pool_instances的值
mysql> SELECT @@innodb_buffer_pool_size;
+---------------------------+
| @@innodb_buffer_pool_size |
+---------------------------+
| 4286578688 |
+---------------------------+
改變innodb_buffer_pool_chunk_size時應該注意,如前述實例所示,改變該選項的值能增加緩衝池的大小。改變innodb_buffer_pool_chunk_size前,計算對innodb_buffer_pool_size的影響,以確保最終緩衝池大小可以接受。
注意:
1)爲了避免潛在的性能問題,數據塊數(innodb_buffer_pool_size/innodb_buffer_pool_chunk_size)不應該超過1000。

3.在線調整InnoDB緩衝池大小
innodb_buffer_pool_size配置選項能通過set語句進行動態設置,既允許用戶不重啓服務器的前提下調整緩衝大小。例如:
mysql> SET GLOBAL innodb_buffer_pool_size=402653184;
調整緩衝池大小前InnoDB APIs執行的活動事務和操作應該被完成。當初始化調整操作時,直到所有活動事務完成纔會開始改操作。一旦調整操作進行,需要訪問緩衝池的新事務和操作必須等到該調整操作完成。
除非減少緩衝池時緩衝池整理碎片和回收頁期間允許併發訪問緩衝池。允許併發訪問緩衝池的缺陷是頁回收期間可能導致可用頁的臨時短缺。
注意:
1)緩衝池調整操作開始後嵌套事務初始化可能會失敗。

4.監視在線緩衝調整進程
Innodb_buffer_pool_resize_status報告緩衝池調整進程。例如:
mysql> SHOW STATUS WHERE Variable_name='InnoDB_buffer_pool_resize_status';
+----------------------------------+----------------------------------+
| Variable_name | Value |
+----------------------------------+----------------------------------+
| Innodb_buffer_pool_resize_status | Resizing also other hash tables. |
+----------------------------------+----------------------------------+
緩衝池調整進程也會被記入服務器錯誤日誌。下述實例顯示增加緩衝池大小時注意(notes)被記入日誌。
[Note] InnoDB: Resizing buffer pool from 134217728 to 4294967296. (unit=134217728)
[Note] InnoDB: disabled adaptive hash index.
[Note] InnoDB: buffer pool 0 : 31 chunks (253952 blocks) was added.
[Note] InnoDB: buffer pool 0 : hash tables were resized.
[Note] InnoDB: Resized hash tables at lock_sys, adaptive hash index, dictionary.
[Note] InnoDB: completed to resize buffer pool from 134217728 to 4294967296.
[Note] InnoDB: re-enabled adaptive hash index.
下述實例顯示減少緩衝池大小時注意(notes)將被記入日誌。
[Note] InnoDB: Resizing buffer pool from 4294967296 to 134217728. (unit=134217728)
[Note] InnoDB: disabled adaptive hash index.
[Note] InnoDB: buffer pool 0 : start to withdraw the last 253952 blocks.
[Note] InnoDB: buffer pool 0 : withdrew 253952 blocks from free list. tried to relocate 0 pages.
(253952/253952)
[Note] InnoDB: buffer pool 0 : withdrawn target 253952 blocks.
[Note] InnoDB: buffer pool 0 : 31 chunks (253952 blocks) was freed.
[Note] InnoDB: buffer pool 0 : hash tables were resized.
[Note] InnoDB: Resized hash tables at lock_sys, adaptive hash index, dictionary.
[Note] InnoDB: completed to resize buffer pool from 4294967296 to 134217728.
[Note] InnoDB: re-enabled adaptive hash index.

5.在線調整緩衝池內部機制
緩衝池的調整操作被後臺線程執行。增加緩衝池大小時,調整操作:
1)增加數據塊中的頁(數據塊大小由innodb_buffer_pool_chunk_size定義)
2)暗中使(covert)哈希表(hash tables),鏈表(lists)和指針(pointers)以使用內存中的新地址
3)將新頁加到空閒鏈表上
當這些操作進行時,其他訪問緩衝池的線程被阻塞。
當減少緩衝池大小時,調整操作:
1)整合緩衝區並釋放頁
2)移去數據塊中的頁(數據塊大小由innodb_buffer_pool_chunk_size定義)
3)使哈希表(hash tbales),鏈表(lists)和指針(pointers)使用內存中的新地址
這些操作中,僅整理緩衝池和釋放頁允許其他線程併發的訪問該緩衝池。
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章