MySQL優化--OS和硬件

背景:
MySQL優化是永恒的主題,?DBA的存在意義有很大一部分原因是因為要優化MySQL。我們應該從各個層面去優化數據庫。本節從操作系統和硬件的角度去做出優化。
?硬件層相關優化:
一 . CPU相關:
在服務器的BIOS設置中,可調整下面的幾個配置,目的是發揮CPU最大性能,或者避免經典的NUMA問題:
1、選擇Performance Per Watt Optimized(DAPC)模式,發揮CPU最大性能,跑DB這種通常需要高運算量的服務就不要考慮節電了; 那么什么是DAPC模式呢?還有哪些模式呢?
—— linux 會通過BIOS對硬件配置許多選項供用戶選擇,比如一些選項參數具有節能作用。但在降低能耗的同時也意味著性能的下降。所以根據需求選擇合適的對BIOS的調改可以提高服務器的性能。在CPU方面典型的有HT(超線程)技術,以及Turbo boost(根據系統負載智能調控CPU主頻)。其實對于跑MySQL的機器來說不介意開啟。
下面給出dell的白皮書一個關于BIOS選項參數設置的pdf下載鏈接供查閱,你想要的全都有:`
?http://www.google.com.hk/url?url=http://en.community.dell.com/cfs-file/__key/telligent-evolution-components-attachments/13-4491-00-00-20-24-87-40/12g_5F00_bios_5F00_tuning_5F00_for_5F00_performance_5F00_power.pdf&rct=j&frm=1&q=&esrc=s&sa=U&ved=0ahUKEwizlfTBy6HLAhXHVZQKHbywBR4QFggeMAI&usg=AFQjCNFjgO7HsuMmOBahht-4g3wI6vZyYw
?里面涉及到不少 BIOS 層面的東西。主要分為 "System Profile Setting" 以及 "Memory setting" 和 "Processor Setting" 這三大塊。 對于 DELL 的 BIOS 來說,一共有 5 類不同的 profile setting。默認是 "performance per watt Optimized(dapc)",這種profile相比其他來說比較耗能,但是對于性能多少可能有一丟丟的益處。

?
?2、關閉C1E和C States等選項,目的也是為了提升CPU效率;
?這兩個參數是節能選項,開啟以后會對某些profile的能耗具有明顯的節約例如performance,總之用來環保還是不錯的,用來跑數據庫的話建議關掉。
3、Memory Frequency(內存頻率)選擇Maximum Performance(最佳性能);
這個選項控制BIOS內存頻率。管理的最大內存頻率的變量包括最大額定頻率的內存,每通道的內存數量,處理器的選擇等。在需要額外的功率節省的情況下,可以通過此參數節省內存頻率以節省電力。
4、內存設置菜單中,啟用Node Interleaving,避免NUMA問題;?
?那么首先要明白什么是NUMA,請參考下面這篇文章: http://cenalulu.github.io/linux/numa/ , 這個參數是專門為了控制NUMA而設置的,具體可以參考上面的pdf,具體我也不是很懂。

二 . 磁盤I/O相關
?1、使用SSD或者PCIe SSD設備,至少獲得數百倍甚至萬倍的IOPS提升
?這個說法耳朵都快聽出繭了,具體的過程和結果網上有很多,其實這個只有自己實際經歷過了才明白SSD的好處。
?2、購置陣列卡同時配備CACHE及BBU模塊,可明顯提升IOPS(主要是指機械盤,SSD或PCIe SSD除外。同時需要定期檢查CACHE及BBU模塊的健康狀況,確保意外時不至于丟失數據);
?無 論DELL/HP/IBM等服務器廠商,都會OEM一些Raid控制器在實現Raid功能,而為了保障和提升讀寫性能,Raid控制卡里都會內置 128MB 至 1GB不等的Cache Memory,而我們對磁盤的讀和寫操作都會通過事先在Cache Memory中Hit或緩存,這樣一來就可以大大提高了實際IO性能. 而BBU就是Raid卡中的一個電池備用模塊,因為之前我們說到在Raid的環境下很多情況下數據都是通過Cache Memory和磁盤交換的,而Memory本身并無法保障數據持久性,萬一電源中斷,而數據沒來得及flush到物理磁盤上,就會造成數據丟失的悲劇。為 此硬件廠商提供了BBU和TBBU,其中包含了一塊鋰電池來保障萬一電源中斷的情況下,Cache Memory中的數據不至于丟失,直至電源恢復。
3、有陣列卡時,設置陣列寫策略為WB,甚至FORCE WB(若有雙電保護,或對數據安全性要求不是特別高的話),嚴禁使用WT策略。并且閉陣列預讀策略,基本上是雞肋,用處不大;
?WT 即 Write Through和 WB 即 Write Back 。
Write Through和Write Back是陣列卡Cache的兩種使用方式,也稱為透寫和回寫。當選用write through方式時,系統的寫磁盤操作并不利用陣列卡的Cache,而是直接與磁盤進行數據的交互。而write Back方式則利用陣列Cache作為系統與磁盤間的二傳手,系統先將數據交給Cache,然后再由Cache將數據傳給磁盤。?
?4、盡可能選用RAID-10,而非RAID-5;
在其他配置相同的情況下,?RAID10比RAID5的innodb的性能稍微高那么一丟丟。那么問題來了,RAID5和RAID10的區別是什么呢?自己看去,哪那么多問題!
http://arstechnica.com/features/2000/05/raid
?5、使用機械盤的話,盡可能選擇高轉速的,例如選用15KRPM,而不是7.2KRPM的盤,不差幾個錢的
?
?系統層相關優化:
一. 文件系統相關
1、在使用SSD的前提下,使用deadline/noop這兩種I/O調度器,千萬別用cfq(它不適合跑DB類服務);
Linux內核2.6開始引入了全新的IO調度子系統。Linux內核提供了CFQ(默認), deadline和noop三種IO調度器。
CFQ實現了一種QoS的IO調度算法。該算法為每一個進程分配一個時間窗口,在該時間窗口內,允許進程發出IO請求。通過時間窗口在不同進程間的移動,保證了對于所有進程而言都有公平的發出IO請求的機會。同時CFQ也實現了進程的優先級控制,可保證高優先級進程可以獲得更長的時間窗口。CFQ適用于系統中存在多任務I/O請求的情況,通過在多進程中輪換,保證了系統I/O請求整體的低延遲。但是,對于只有少數進程存在大量密集的I/O請求的情況,會出現明顯的I/O性能下降。
NOOP調度器十分簡單,其只擁有一個等待隊列,每當來一個新的請求,僅僅是按先來先處理的思路將請求插入到等待隊列的尾部。其應用環境主要有以下兩種:一是物理設備中包含了自己的I/O調度程序,比如SCSI的TCQ;二是尋道時間可以忽略不計的設備,比如SSD等。
? DEADLINE調度算法主要針對I/O請求的延時而設計,每個I/O請求都被附加一個最后執行期限。該算法維護兩類隊列,一是按照扇區排序的讀寫請求隊列;二是按照過期時間排序的讀寫請求隊列。如果當前沒有I/O請求過期,則會按照扇區順序執行I/O請求;如果發現過期的I/O請求,則會處理按照過期時間排序的隊列,直到所有過期請求都被發射為止。在處理請求時,該算法會優先考慮讀請求。當系統中存在的I/O請求進程數量比較少時,與CFQ算法相比,DEADLINE算法可以提供較高的I/O吞吐率。

2、使用xfs文件系統,千萬別用ext3;ext4勉強可用,但業務量很大的話,則一定要用xfs
在其他配置相同的情況下,XFS具有明顯優勢,具體測試結果可參照,其實很多時候只有自己真正用了才能體會到區別:http://imysql.cn/2015/07/14/xfs-vs-ext4-fileio-and-tpmc-under-pciessd.shtml
3、文件系統mount參數中增加:noatime, nodiratime, nobarrier幾個選項(nobarrier是xfs文件系統特有的)
Linux 下面掛載文件系統的時候設置 noatime 可以顯著提高文件系統的性能。默認情況下,Linux ext2/ext3 文件系統在文件被訪問、創建、修改等的時候記錄下了文件的一些時間戳,比如:文件創建時間、最近一次修改時間和最近一次訪問時間。因為系統運行的時候要訪 問大量文件,如果能減少一些動作(比如減少時間戳的記錄次數等)將會顯著提高磁盤 IO 的效率、提升文件系統的性能。Linux 提供了 noatime 這個參數來禁止記錄最近一次訪問時間戳。
??二、 內核參數相關:
?1. 將vm.swappiness設置為5-10左右即可,甚至設置為0(RHEL 7以上則慎重設置為0,除非你允許OOM kill發生),以降低使用SWAP的機會
?swappiness的值的大小對如何使用swap分區是有著很大的聯系的。swappiness=0的時候表示最大限度使用物理內存,然后才是 swap空間,swappiness=100的時候表示積極的使用swap分區,并且把內存上的數據及時的搬運到swap空間里面。linux的基本默認 設置為60。也就是說,你的內存在使用到100-60=40%的時候,就開始出現有交換分區的使用。大家知道,內存的速度會比磁盤快很多,這樣子會加大系統io,同時造的成大量頁的換進換出,嚴重影響系統的性能,所以我們在操作系統層面,要盡可能使用內存,對該參數進行調整。
使用cat /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而阻塞。

之前一直 錯誤的以為dirty_ratio的觸發條件不可能達到,因為每次肯定會先達到vm.dirty_background_ratio的條件,后來才知道自 己理解錯了。確實是先達到vm.dirty_background_ratio的條件然后觸發flush進程進行異步的回寫操作,但是這一過程中應用進程 仍然可以進行寫操作,如果多個應用進程寫入的量大于flush進程刷出的量那自然會達到vm.dirty_ratio這個參數所設定的坎,此時操作系統會 轉入同步地處理臟頁的過程,阻塞應用進程。

也就是說,
dirty_ratio是屬于強制性的回寫,也就是說當一個內存區的臟頁達到這個比例時就會觸發內核內存管理把臟頁強制回寫的流程,但dirty_background_ratio是屬于軟性的行為,因為這是透過pdflush內核線程進行的流程,可以在后臺執行對這些臟頁面回寫,并不會因此影響到當下正在執行中的過程。 所以看Linux內核中預設的比例是臟頁達到5%的比例時就會先透過pdflush內核線程進行回寫,當臟頁達到10%比例時,就等于是一個很嚴重的狀況,此時就會在平衡臟頁面流程中觸發強制的回寫,讓系統可以回復到原本預設合理的狀態。?

可以使用
cat /proc/sys/vm/dirty_ratio 的方式來查看此值
具體其他的vm參數可以參考此文:http://www.cnblogs.com/yuzhaoxin/p/4083612.html
3. 將net.ipv4.tcp_tw_recycle、net.ipv4.tcp_tw_reuse都設置為1,減少TIME_WAIT,提高TCP效率

?
net.ipv4.tcp_tw_recycle = 1
表示開啟TCP連接中TIME-WAIT sockets的快速回收,默認為0,表示關閉。否則的話linux對處于TIME-WAIT狀態的socket連接會保持一段時間。這樣的話,當有DDOS等攻擊時,發送大量偽造的TCP連接請求,常用假冒的IP或IP號段發來海量的請求連接的第一個握手包(SYN包),被攻擊服務器回應第二個握手包(SYN+ACK 包),因為對方是假冒IP,對方永遠收不到包且不會回應第三個握手包。導致被攻擊服務器保持大量SYN_RECV狀態的“半連接”,并且會重試默認5次回 應第二個握手包,塞滿TCP等待連接隊列,資源耗盡(CPU滿負荷或內存不足),讓正常的業務請求連接不進來。?
?net.ipv4.tcp_tw_reuse = 1
表示開啟重用。允許將TIME-WAIT sockets重新用于新的TCP連接,默認為0,表示關閉;

?注釋:
http://lib.csdn.net/article/mysql/5064
博文架構參考自: http://imysql.cn/2015/05/24/mysql-optimization-reference-1.shtml?
http://blog.sina.com.cn/s/blog_c2839d2a0102wma2.html

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容