Linux上MySQL最佳化提升效能,可以最佳化關閉NUMA特性如下:
這些其實都源於CPU最新的技術:節能模式。作業系統和CPU硬體配合,系統不繁忙的時候,為了節約電能和降低溫度,它會將CPU降頻。
為了保證MySQL能夠充分利用CPU的資源,建議設定CPU為最大效能模式。這個設定可以在BIOS和作業系統中設定,當然,在BIOS中設定該選項更好,更徹底。
然後我們看看記憶體方面,我們有哪些可以最佳化的。
i) 我們先看看numa
非一致儲存訪問結構 (NUMA : Non-Uniform Memory Access) 也是最新的記憶體管理技術。它和對稱多處理器結構 (SMP : Symmetric Multi-Processor) 是對應的。
我們可以直觀的看到:SMP訪問記憶體的都是代價都是一樣的;但是在NUMA架構下,本地記憶體的訪問和非 本地記憶體的訪問代價是不一樣的。對應的根據這個特性,作業系統上,我們可以設定程序的記憶體分配方式。目前支援的方式包括:
--interleave=nodes
--membind=nodes
--cpunodebind=nodes
--physcpubind=cpus
--localalloc
--preferred=node
簡而言之,就是說,你可以指定記憶體在本地分配,在某幾個CPU節點分配或者輪詢分配。除非 是設定為--interleave=nodes輪詢分配方式,即記憶體可以在任意NUMA節點上分配這種方式以外。其他的方式就算其他NUMA節點上還有內 存剩餘,Linux也不會把剩餘的記憶體分配給這個程序,而是採用SWAP的方式來獲得記憶體。
所以最簡單的方法,還是關閉掉這個特性。
關閉特性的方法,分別有:可以從BIOS,作業系統,啟動程序時臨時關閉這個特性。
a) 由於各種BIOS型別的區別,如何關閉NUMA千差萬別,我們這裡就不具體展示怎麼設定了。
b) 在作業系統中關閉,可以直接在/etc/grub.conf的kernel行最後新增numa=off,如下所示:
kernel /vmlinuz-2.6.32-220.el6.x86_64 ro root=/dev/mapper/VolGroup-root rd_NO_LUKS.UTF-8 rd_LVM_LV=VolGroup/root rd_NO_MD quiet SYSFONT=latarcyrheb-sun16 rhgb crashkernel=auto rd_LVM_LV=VolGroup/swap rhgb crashkernel=auto quiet KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM numa=off
另外可以設定 vm.zone_reclaim_mode=0儘量回收記憶體。
c) 啟動MySQL的時候,關閉NUMA特性:
numactl --interleave=all mysqld
當然,最好的方式是在BIOS中關閉。
ii) 我們再看看vm.swappiness。
vm.swappiness是作業系統控制物理記憶體交換出去的策略。它允許的值是一個百分比的值,最小為0,最大執行100,該值預設為60。vm.swappiness設定為0表示儘量少swap,100表示儘量將inactive的記憶體頁交換出去。
具體的說:當記憶體基本用滿的時候,系統會根據這個引數來判斷是把記憶體中很少用到的inactive 記憶體交換出去,還是釋放資料的cache。
Linux上MySQL最佳化提升效能,可以最佳化關閉NUMA特性如下:
這些其實都源於CPU最新的技術:節能模式。作業系統和CPU硬體配合,系統不繁忙的時候,為了節約電能和降低溫度,它會將CPU降頻。
為了保證MySQL能夠充分利用CPU的資源,建議設定CPU為最大效能模式。這個設定可以在BIOS和作業系統中設定,當然,在BIOS中設定該選項更好,更徹底。
然後我們看看記憶體方面,我們有哪些可以最佳化的。
i) 我們先看看numa
非一致儲存訪問結構 (NUMA : Non-Uniform Memory Access) 也是最新的記憶體管理技術。它和對稱多處理器結構 (SMP : Symmetric Multi-Processor) 是對應的。
我們可以直觀的看到:SMP訪問記憶體的都是代價都是一樣的;但是在NUMA架構下,本地記憶體的訪問和非 本地記憶體的訪問代價是不一樣的。對應的根據這個特性,作業系統上,我們可以設定程序的記憶體分配方式。目前支援的方式包括:
--interleave=nodes
--membind=nodes
--cpunodebind=nodes
--physcpubind=cpus
--localalloc
--preferred=node
簡而言之,就是說,你可以指定記憶體在本地分配,在某幾個CPU節點分配或者輪詢分配。除非 是設定為--interleave=nodes輪詢分配方式,即記憶體可以在任意NUMA節點上分配這種方式以外。其他的方式就算其他NUMA節點上還有內 存剩餘,Linux也不會把剩餘的記憶體分配給這個程序,而是採用SWAP的方式來獲得記憶體。
所以最簡單的方法,還是關閉掉這個特性。
關閉特性的方法,分別有:可以從BIOS,作業系統,啟動程序時臨時關閉這個特性。
a) 由於各種BIOS型別的區別,如何關閉NUMA千差萬別,我們這裡就不具體展示怎麼設定了。
b) 在作業系統中關閉,可以直接在/etc/grub.conf的kernel行最後新增numa=off,如下所示:
kernel /vmlinuz-2.6.32-220.el6.x86_64 ro root=/dev/mapper/VolGroup-root rd_NO_LUKS.UTF-8 rd_LVM_LV=VolGroup/root rd_NO_MD quiet SYSFONT=latarcyrheb-sun16 rhgb crashkernel=auto rd_LVM_LV=VolGroup/swap rhgb crashkernel=auto quiet KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM numa=off
另外可以設定 vm.zone_reclaim_mode=0儘量回收記憶體。
c) 啟動MySQL的時候,關閉NUMA特性:
numactl --interleave=all mysqld
當然,最好的方式是在BIOS中關閉。
ii) 我們再看看vm.swappiness。
vm.swappiness是作業系統控制物理記憶體交換出去的策略。它允許的值是一個百分比的值,最小為0,最大執行100,該值預設為60。vm.swappiness設定為0表示儘量少swap,100表示儘量將inactive的記憶體頁交換出去。
具體的說:當記憶體基本用滿的時候,系統會根據這個引數來判斷是把記憶體中很少用到的inactive 記憶體交換出去,還是釋放資料的cache。