您好,登錄后才能下訂單哦!
大家都知道,在運行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編譯。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。