mysql5.7.9+支持的新參數innodb_numa_interleave

        大家都知道,在運行mysql服務的服務器上,linux系統的內存numa特性是強烈建議關閉的。因爲這種特性很容易引起內存泄漏的情況:即發現物理內存還有剩餘,但是系統已經開始使用swap內存。

        numa內存特性:比如一臺機器是有2個處理器,有4個內存塊。我們將1個處理器和兩個內存塊合起來,稱爲一個NUMA node,這樣這個機器就會有兩個NUMA node。在物理分佈上,NUMA node的處理器和內存塊的物理距離更小,因此訪問也更快。比如這臺機器會分左右兩個處理器(cpu1, cpu2),在每個處理器兩邊放兩個內存塊(memory1.1, memory1.2, memory2.1,memory2.2),這樣NUMA node1的cpu1訪問memory1.1和memory1.2就比訪問memory2.1和memory2.2更快。所以使用NUMA的模式如果能儘量保證本node內的CPU只訪問本node內的內存塊,那這樣的效率就是最高的。

        其實由於mysql數據庫服務器一般只會部署mysql一種服務在運行,而不會部署若干應用在運行。所以一般是希望mysql是獨佔整個服務器的資源(剔除留給操作系統運行的資源)。所以根據這種業務特性,mysql服務器上是不建議開啓numa內存特性。

        那如果關閉numa特性呢?

        1、BLOS層面:

        由於不同系統之間各種BLOS類型的區別,設置各有不同。這裏不再展開。

        2、操作系統層面:

        可以直接在/etc/grub.conf的kernel行最後添加numa=off。

        3、MySQL層面:

        直接修改啓動腳本:

        numactl --interleave=all mysqld --defaults-file=/etc/my.cnf &

        4、設置innodb_numa_interleave參數:

        MySQL5.7.9版本+,新增了參數innodb_numa_interleave。根據官方文檔的描述:當設置innodb_numa_interleave=1的時候,對於mysqld進程的numa內存分配策略設置爲MPOL_INTERLEAVE,而一旦Innodb buffer pool分配完畢,則策略重新設置回MPOL_DEFAULT。當然這個參數是否生效,必須建立在mysql是在支持numa特性的linux系統上編譯的基礎上。

        在MySQL5.7.17版本+, CMake編譯軟件新增了WITH_NUMA參數,可以在支持numa特性的linux系統上編譯mysql。

        注:innodb_numa_interleave目前在mysql5.7.17的二進制包是不支持的,詳細的bug信息:https://bugs.mysql.com/bug.php?id=80288 。如果需要規避這種情況,建議下載源碼包,直接在系統上進行mysql編譯。


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