天天看點

MySQL · 參數故事 · innodb_additional_mem_pool_size

innodb_additional_mem_pool_size 是 innodb 用來儲存資料字典資訊和其他内部資料結構的記憶體池的大小,機關是 byte,參數預設值為8m。資料庫中的表數量越多,參數值應該越大,如果 innodb 用完了記憶體池中的記憶體,就會從作業系統中配置設定記憶體,同時在 error log 中打入報警資訊。

innodb_use_sys_malloc 配置為 on 時,innodb_additional_mem_pool_size 失效(直接從作業系統配置設定記憶體)。

innodb_additional_mem_pool_size 和 innodb_use_sys_malloc 在 mysql 5.7.4 中移除。

從源碼中可以看出,innodb_additional_mem_pool_size 的參數值用于指定記憶體池 mem_comm_pool 的大小;

函數 <code>mem_area_alloc</code> 從 mem_comm_pool 記憶體池中配置設定記憶體;

如果 innodb_use_sys_malloc (上述代碼中的srv_use_sys_malloc) 設定為 on,或者記憶體池中沒有足夠的記憶體可供配置設定,則直接從作業系統中配置設定記憶體。

<code>mem_area_alloc</code> 調用棧如下(use database 觸發斷點)

函數 <code>dict_load_table</code> 中會為每張表配置設定32k的空間 ( <code>mem_heap_create(32000)</code> 實際配置設定32744位元組空間 ),資料字典中每張表所占空間的上限是32k,具體占用空間根據列數和索引數量配置設定,配置設定完成後回收32k中未使用的空間

show engine innodb status buffer pool and memory dictionary cache

實際使用的資料字典緩存,不會超過每張表32k,實測過程中,每張表不包括索引占4k,每個索引占2k,列數對空間占用影響不大。

測試用表如下,未建索引時,1000張表占用空間4m,增加列占用空間增長不明顯,每增加一個索引,占用空間增加2m,可以估測每張表占用空間4k(不含索引),每個索引占用空間2k。

早期作業系統的記憶體配置設定器性能和可伸縮性較差,并且當時沒有适合多核心cpu的記憶體配置設定器。是以,innodb 實作了一套自己的記憶體配置設定系統,做為記憶體系統的參數之一,引入了<code>innodb_additional_mem_pool_size</code>。

随着多核心cpu的廣泛應用和作業系統的成熟,作業系統能夠提供性能更高、可伸縮性更好的記憶體配置設定器,包括 hoard、libumem、mtmalloc、ptmalloc、tbbmalloc 和 tcmalloc 等。innodb 實作的記憶體配置設定器相比作業系統的記憶體配置設定器并沒有明顯優勢,是以在之後的版本,會移除 innodb_additional_mem_pool_size 和 innodb_use_sys_malloc 兩個參數,統一使用作業系統的記憶體配置設定器。

繼續閱讀