MySQL 配置InnoDB的記憶體分配器

eric0435發表於2022-04-09

配置InnoDB的記憶體分配器
在開發InnoDB時,作業系統和執行時庫提供的記憶體分配器通常缺乏效能和可伸縮性。那時,還沒有針對多核cpu調優的記憶體分配器庫。因此,InnoDB在mem子系統中實現了自己的記憶體分配器。這個分配器由一個互斥鎖保護,這可能成為瓶頸。InnoDB還圍繞系統分配器(malloc和free)實現了一個包裝器介面,它同樣由一個互斥鎖保護。

今天,隨著多核系統的廣泛應用,以及作業系統的成熟,作業系統所提供的記憶體分配器已經有了顯著的改進。與過去相比,這些新的記憶體分配器效能更好,可伸縮性更強。大多數工作負載,特別是那些經常分配和釋放記憶體的工作負載(比如多表連線),比使用一個內部的、特定於innodb的記憶體分配器更好的記憶體分配器。

你可以透過在MySQL選項檔案(my.cnf或my.ini)中設定系統配置引數innodb_use_sys_malloc的值來控制InnoDB是使用自己的記憶體分配器還是作業系統的分配器。如果設定為ON或1(預設值),InnoDB使用底層系統的malloc和free函式,而不是自己管理記憶體池。該引數為非動態配置,僅在系統啟動時生效。如果需要繼續使用InnoDB記憶體分配器,請將innodb_use_sys_malloc設定為0。

當InnoDB記憶體分配器被禁用時,InnoDB會忽略引數innodb_additional_mem_pool_size的值。InnoDB記憶體分配器使用一個額外的記憶體池來滿足分配請求,而不必回到系統記憶體分配器。當InnoDB記憶體分配器被禁用時,所有這樣的分配請求都由系統記憶體分配器來完成。

在使用動態連結的類似於unixr的系統上,只需讓環境變數LD_PRELOAD或LD_LIBRARY_PATH指向實現該分配器的動態庫,就可以輕鬆地替換記憶體分配器。在其他系統上,可能需要進行一些重新連結。請參考您所選擇的記憶體分配器庫的文件。

因為當系統記憶體分配器被使用時(innodb_use_sys_malloc是ON), InnoDB不能跟蹤所有記憶體的使用情況,所以在SHOW ENGINE InnoDB STATUS命令的輸出中BUFFER POOL AND memory部分只包括Total memory allocation中的BUFFER POOL統計資訊。任何使用mem子系統或使用ut_malloc分配的記憶體都被排除在外。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26015009/viewspace-2886308/,如需轉載,請註明出處,否則將追究法律責任。

相關文章