Mysql關於OS級優化

一、硬件層相關優化
1.一、CPU相關
一、選擇Performance Per Watt Optimized(DAPC)模式,發揮CPU最大性能,跑DB這種一般須要高運算量的服務就不要考慮節電了
二、關閉C1E和C States等選項,目的也是爲了提高CPU效率;
三、Memory Frequency(內存頻率)選擇Maximum Performance(最佳性能);
四、內存設置菜單中,啓用Node Interleaving,避免NUMA問題(採用交叉策略)

NUMA: 非一致性內存訪問架構
內存跟cpu 有一個綁定
64g內存 2*8cpu 
兩個cpu 每一個分的32g 內存
oracle 系統,若是在linux 架構上,分配的內存大於32G的問題?
uma  的內存訪問策略,默認的是local  ,也就是優先使用本地內存, 這裏就存在一個問題,
數據庫 pg oracle 是多進程的,若是分配的sga  接近或者超過32g ,新的進程在同一個物理cpu 啓動的時候,發現內存不夠了,就有可能會致使swap ,而實際上,另外一個物理cpu 的內存尚未用完,還能夠在另外一個物理cpu上綁定的內存上,繼續分配內存。 


怎麼避免呢? 單機單實例的數據庫,建議關閉numa 策略。
 numastat 
 numactl  --show 
 針對咱們的數據庫主機,咱們應該採用什麼策略呢? 

或在OS層面調整:
針對咱們上面的提出的問題,咱們建議採用 interleave  模式。  即 交叉分配,這樣基本能夠作到內存平均的分配到兩個node 裏,
每一個進程, 訪問本地與訪問異地內存的比例是1:1 。 
/usr/bin/numactl --interleave all   service mysqld start
node

1.二、磁盤I/O相關
一、使用SSD或者PCIe SSD設備,至少得到數百倍甚至萬倍的IOPS提高;
二、購置陣列卡同時配備CACHE及BBU模塊,可明顯提高IOPS(主要是指機械盤,SSD或PCIe SSD除外。同時須要按期檢查CACHE及BBU模塊的健康情況,確保意外時不至於丟失數據)
三、有陣列卡時,設置陣列寫策略爲WB(write back),甚至FORCE WB(如有雙電保護,或對數據安全性要求不是特別高的話),嚴禁使用WT策略。而且閉陣列預讀策略,基本上是雞肋,用處不大

二、系統層相關優化
一、使用deadline/noop這兩種I/O調度器,千萬別用cfq(它不適合跑DB類服務);
IO調度,默認cfq
cat /sys/block/sda/queue/scheduler
noop anticipatory deadline [cfq]
修改調度策略
echo 'deadline' > /sys/block/sda/queue/scheduler
對於SSD盤建議採用最簡單的noop


vi /etc/rc.local
echo 'deadline' > /sys/block/sda/queue/scheduler
echo '16' > /sys/block/sda/queue/read_ahead_kb
echo '512' > /sys/block/sda/queue/nr_requests


減小預讀,默認128
echo '16' > /sys/block/sda/queue/read_ahead_kb
增大隊列,默認128
echo '512' > /sys/block/sda/queue/nr_requests

二、使用xfs文件系統,千萬別用ext3;ext4勉強可用,但業務量很大的話,則必定要用xfs;
三、文件系統mount參數中增長:noatime, nodiratime, nobarrier幾個選項(nobarrier是xfs文件系統特有的
格式化時的參數:
mkfs.xfs -d agcount=256 -l size=128m,lazy-count=1,version=2 /dev/diska1
mount時的參數
defaults,noatime,nodiratime,nobarrier,discard,allocsize=256m,logbufs=8,attr2,logbsize=256k
xfs不必刻意進行優化,默認的參數就足夠了


2.二、其餘內核參數優化
針對關鍵內核參數設定合適的值,目的是爲了減小swap的傾向,而且讓內存和磁盤I/O不會出現大幅波動,致使瞬間波峯負載
一、將vm.swappiness設置爲5-10左右便可,甚至設置爲0(RHEL 7以上則慎重設置爲0,除非你容許OOM kill發生),以下降使用SWAP的機會;
cat /proc/sys/vm/swappiness
vi /etc/sysctl.conf
vm.swappiness = 0

echo '0' > /proc/sys/vm/swappiness


二、將vm.dirty_background_ratio設置爲5-10,將vm.dirty_ratio設置爲它的兩倍左右,以確保能持續將髒數據刷新到磁盤,避免瞬間I/O寫,產生嚴重等待(和MySQL中的innodb_max_dirty_pages_pct相似)
vm.dirty_background_ratio:這個參數指定了當文件系統緩存髒頁數量達到系統內存百分之多少時(如5%)就會觸發pdflush/flush/kdmflush等後臺回寫進程運行,將必定緩存的髒頁異步地刷入外存;
vm.dirty_ratio:而這個參數則指定了當文件系統緩存髒頁數量達到系統內存百分之多少時(如10%),系統不得不開始處理緩存髒頁(由於此時髒頁數量已經比較多,爲了不數據丟失須要將必定髒頁刷入外存);在此過程當中不少應用進程可能會由於系統轉而處理文件IO而阻塞。


cat /proc/sys/vm/dirty_background_ratio 
10
修改:vi /etc/rc.local
echo '20' >/proc/sys/vm/dirty_background_ratio
這個值是一個閥值,說明若是內存中的髒數據達到系統總內存的10%時,那麼pdflush進程就會啓動,將內存中的髒數據寫回硬盤.這個值可適當調高.可得到更快的寫入速度.
cat /proc/sys/vm/dirty_ratio 
20
echo '10'>/proc/sys/vm/dirty_ratio 


dirty_ratio的值是數據寫進內存的閥值,20%是指當系統內存已經緩存了40%的數據之後,就再也不往內存中緩存數據了.
修改:
vi /etc/rc.local
echo '40'>/proc/sys/vm/dirty_ratio


vi /etc/sysctl.conf
vm.dirty_ratio = 20
vm.dirty_background_ratio = 10
sysctl -p


三、將net.ipv4.tcp_tw_recycle、net.ipv4.tcp_tw_reuse都設置爲1,減小TIME_WAIT,提升TCP效率;
vi /etc/sysctl.conf
net.ipv4.tcp_tw_recycle=1 表示開啓TCP鏈接中TIME-WAIT sockets的快速回收,默認爲0,表示關閉。 
net.ipv4.tcp_tw_reuse=1 表示開啓重用。容許將TIME-WAIT sockets從新用於新的TCP鏈接,默認爲0,表示關閉;
sysctl -p


四、網傳的read_ahead_kb、nr_requests這兩個參數,我通過測試後,發現對讀寫混合爲主的OLTP環境影響並不大(應該是對讀敏感的場景更有效果).mysql

相關文章
相關標籤/搜索