mysql5.7.9+支持的新參數innodb_numa_interleave

        你們都知道,在運行mysql服務的服務器上,linux系統的內存numa特性是強烈建議關閉的。由於這種特性很容易引發內存泄漏的狀況:即發現物理內存還有剩餘,可是系統已經開始使用swap內存。php

        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內的內存塊,那這樣的效率就是最高的。node

        其實因爲mysql數據庫服務器通常只會部署mysql一種服務在運行,而不會部署若干應用在運行。因此通常是但願mysql是獨佔整個服務器的資源(剔除留給操做系統運行的資源)。因此根據這種業務特性,mysql服務器上是不建議開啓numa內存特性。mysql

        那若是關閉numa特性呢?linux

        一、BLOS層面:sql

        因爲不一樣系統之間各類BLOS類型的區別,設置各有不一樣。這裏再也不展開。數據庫

        二、操做系統層面:服務器

        能夠直接在/etc/grub.conf的kernel行最後添加numa=off。ide

        三、MySQL層面:spa

        直接修改啓動腳本:操作系統

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

        四、設置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編譯。

相關文章
相關標籤/搜索