人人IT網

人人IT網

當前位置: 主頁 > 操作系統 > OS >

Mysql關於OS級優化

時間:2016-11-02 03:45來源:Internet 作者:Internet 點擊:
1、硬件層相關優化1.1、CPU相關1、選擇Performance Per Watt Optimized(DAPC)模式,發揮CPU最大性能,跑DB這種通常需要高運算量的服務就不要考慮節電了2、關閉C

1、硬件層相關優化
1.1、CPU相關
1、選擇Performance Per Watt Optimized(DAPC)模式,發揮CPU最大性能,跑DB這種通常需要高運算量的服務就不要考慮節電了
2、關閉C1E和C States等選項,目的也是为了提升CPU效率;
3、Memory Frequency(內存頻率)選擇Maximum Performance(最佳性能);
4、內存設置菜單中,启用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

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

2、系統層相關優化
1、使用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

2、使用xfs文件系統,千萬別用ext3;ext4勉強可用,但業務量很大的話,則一定要用xfs;
3、文件系統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.2、其他內核参數優化
針對關鍵內核参數設定合适的值,目的是为了減少swap的傾向,並且讓內存和磁盤I/O不會出現大幅波動,導致瞬間波峰負載
1、將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


2、將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


3、將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


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



From:51CTO
頂一下
(0)
0%
踩一下
(0)
0%
------分隔線----------------------------
發表評論
請自覺遵守互聯網相關的政策法規,嚴禁發布色情、暴力、反動的言論。
評價:
表情:
驗證碼:點擊我更換圖片
欄目列表
推薦內容