LINUX上MYSQL優化三板斧

如今MySQL運行的大部分環境都是在Linux上的,如何在Linux操做系統上根據MySQL進行優化,咱們這裏給出一些通用簡單的策略。這些方法都有助於改進MySQL的性能。node

閒話少說,進入正題。mysql

1、CPU

首先從CPU提及。sql

你仔細檢查的話,有些服務器上會有的一個有趣的現象:你cat /proc/cpuinfo時,會發現CPU的頻率居然跟它標稱的頻率不同:數據庫

#cat /proc/cpuinfo processor : 5model name : Intel(R) Xeon(R) CPU E5-2620 0 @2.00GHz ...cpu MHz : 1200.000

這個是Intel E5-2620的CPU,他是2.00G * 24的CPU,可是,咱們發現第5顆CPU的頻率爲1.2G。 緩存

這是什麼緣由呢?安全

這些其實都源於CPU最新的技術:節能模式。操做系統和CPU硬件配合,系統不繁忙的時候,爲了節約電能和下降溫度,它會將CPU降頻。這對環保人士和抵制地球變暖來講是一個福音,可是對MySQL來講,多是一個災難。服務器

爲了保證MySQL可以充分利用CPU的資源,建議設置CPU爲最大性能模式。這個設置能夠在BIOS和操做系統中設置,固然,在BIOS中設置該選項更好,更完全。因爲各類BIOS類型的區別,設置爲CPU爲最大性能模式千差萬別,咱們這裏就不具體展現怎麼設置了。架構

2、內存

而後咱們看看內存方面,咱們有哪些能夠優化的。app

i) 咱們先看看numa

非一致存儲訪問結構 (NUMA : Non-Uniform Memory Access) 也是最新的內存管理技術。它和對稱多處理器結構 (SMP : Symmetric Multi-Processor) 是對應的。簡單的隊別以下:性能

如圖所示,詳細的NUMA信息咱們這裏不介紹了。可是咱們能夠直觀的看到:SMP訪問內存的都是代價都是同樣的;可是在NUMA架構下,本地內存的訪問和非 本地內存的訪問代價是不同的。對應的根據這個特性,操做系統上,咱們能夠設置進程的內存分配方式。目前支持的方式包括:

--interleave=nodes--membind=nodes--cpunodebind=nodes--physcpubind=cpus--localalloc--preferred=node

簡而言之,就是說,你能夠指定內存在本地分配,在某幾個CPU節點分配或者輪詢分配。除非 是設置爲--interleave=nodes輪詢分配方式,即內存能夠在任意NUMA節點上分配這種方式之外。其餘的方式就算其餘NUMA節點上還有內 存剩餘,Linux也不會把剩餘的內存分配給這個進程,而是採用SWAP的方式來得到內存。有經驗的系統管理員或者DBA都知道SWAP致使的數據庫性能 降低有多麼坑爹。 

因此最簡單的方法,仍是關閉掉這個特性。

關閉特性的方法,分別有:能夠從BIOS,操做系統,啓動進程時臨時關閉這個特性。

a) 因爲各類BIOS類型的區別,如何關閉NUMA千差萬別,咱們這裏就不具體展現怎麼設置了。

b) 在操做系統中關閉,能夠直接在/etc/grub.conf的kernel行最後添加numa=off,以下所示:

 
  1. kernel /vmlinuz-2.6.32-220.el6.x86_64 ro root=/dev/mapper/VolGroup-root
    rd_NO_LUKS LANG=en_US.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。cache中緩存着從磁盤讀出來的數據,根據程序的局部性原理,這些數據有可能在接下來又要被讀 取;inactive 內存顧名思義,就是那些被應用程序映射着,可是「長時間」不用的內存。

咱們能夠利用vmstat看到inactive的內存的數量:

#vmstat -an 1  procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----  r b swpd free  inact  active si so bi bo in cs us sy id wa st  1 0 0 27522384 326928 1704644 0 0 0 153 11 10 0 0 100 0 0  0 0 0 27523300 326936 1704164 0 0 0 74 784 590 0 0 100 0 0  0 0 0 27523656 326936 1704692 0 0 8 8 439 1686 0 0 100 0 0  0 0 0 27524300 326916 1703412 0 0 4 52 198 262 0 0 100 0 0

經過/proc/meminfo 你能夠看到更詳細的信息:

#cat /proc/meminfo | grep -i inact  Inactive: 326972 kB  Inactive(anon): 248 kB  Inactive(file): 326724 kB

這裏咱們對不活躍inactive內存進一步深刻討論。 Linux中,內存可能處於三種狀態:free,active和inactive。衆所周知,Linux Kernel在內部維護了不少LRU列表用來管理內存,好比LRU_INACTIVE_ANON, LRU_ACTIVE_ANON, LRU_INACTIVE_FILE , LRU_ACTIVE_FILE, LRU_UNEVICTABLE。其中LRU_INACTIVE_ANON, LRU_ACTIVE_ANON用來管理匿名頁,LRU_INACTIVE_FILE , LRU_ACTIVE_FILE用來管理page caches頁緩存。系統內核會根據內存頁的訪問狀況,不定時的將活躍active內存被移到inactive列表中,這些inactive的內存能夠被 交換到swap中去。

通常來講,MySQL,特別是InnoDB管理內存緩存,它佔用的內存比較多,不常常訪問的內存也會很多,這些內存若是被Linux錯誤的交換出去了,將 浪費不少CPU和IO資源。 InnoDB本身管理緩存,cache的文件數據來講佔用了內存,對InnoDB幾乎沒有任何好處。

因此,咱們在MySQL的服務器上最好設置vm.swappiness=0。

咱們能夠經過在sysctl.conf中添加一行:

echo "vm.swappiness = 0" >>/etc/sysctl.conf

並使用sysctl -p來使得該參數生效。

3、文件系統

最後,咱們看一下文件系統的優化

i) 咱們建議在文件系統的mount參數上加上noatime,nobarrier兩個選項。

用noatime mount的話,文件系統在程序訪問對應的文件或者文件夾時,不會更新對應的access time。通常來講,Linux會給文件記錄了三個時間,change time, modify time和access time。

咱們能夠經過stat來查看文件的三個時間:

stat libnids-1.16.tar.gz  File: `libnids-1.16.tar.gz'  Size: 72309 Blocks: 152 IO Block: 4096 regular file  Device: 302h/770d Inode: 4113144 Links: 1  Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)   Access  : 2008-05-27 15:13:03.000000000 +0800  Modify: 2004-03-10 12:25:09.000000000 +0800  Change: 2008-05-27 14:18:18.000000000 +0800

其中access time指文件最後一次被讀取的時間,modify time指的是文件的文本內容最後發生變化的時間,change time指的是文件的inode最後發生變化(好比位置、用戶屬性、組屬性等)的時間。通常來講,文件都是讀多寫少,並且咱們也不多關心某一個文件最近什 麼時間被訪問了。

因此,咱們建議採用noatime選項,這樣文件系統不記錄access time,避免浪費資源。

如今的不少文件系統會在數據提交時強制底層設備刷新cache,避免數據丟失,稱之爲write barriers。可是,其實咱們數據庫服務器底層存儲設備要麼採用RAID卡,RAID卡自己的電池能夠掉電保護;要麼採用Flash卡,它也有自我保 護機制,保證數據不會丟失。因此咱們能夠安全的使用nobarrier掛載文件系統。設置方法以下:

對於ext3, ext4和 reiserfs文件系統能夠在mount時指定barrier=0;對於xfs能夠指定nobarrier選項。 

ii) 文件系統上還有一個提升IO的優化萬能鑰匙,那就是deadline。

在 Flash技術以前,咱們都是使用機械磁盤存儲數據的,機械磁盤的尋道時間是影響它速度的最重要因素,直接致使它的每秒可作的IO(IOPS)很是有限, 爲了儘可能排序和合並多個請求,以達到一次尋道可以知足屢次IO請求的目的,Linux文件系統設計了多種IO調度策略,已適用各類場景和存儲設備。

Linux的IO調度策略包括:Deadline scheduler,Anticipatory scheduler,Completely Fair Queuing(CFQ),NOOP。每種調度策略的詳細調度方式咱們這裏不詳細描述,這裏咱們主要介紹CFQ和Deadline,CFQ是Linux內 核2.6.18以後的默認調度策略,它聲稱對每個 IO 請求都是公平的,這種調度策略對大部分應用都是適用的。可是若是數據庫有兩個請求,一個請求3次IO,一個請求10000次IO,因爲絕對公平,3次IO 的這個請求都須要跟其餘10000個IO請求競爭,可能要等待上千個IO完成才能返回,致使它的響應時間很是慢。而且若是在處理的過程當中,又有不少IO請 求陸續發送過來,部分IO請求甚至可能一直沒法獲得調度被「餓死」。而deadline兼顧到一個請求不會在隊列中等待過久致使餓死,對數據庫這種應用來 說更加適用。

實時設置,咱們能夠經過

echo deadline >/sys/block/sda/queue/scheduler

來將sda的調度策略設置爲deadline。

咱們也能夠直接在/etc/grub.conf的kernel行最後添加elevator=deadline來永久生效。 

總結

CPU方面:

關閉電源保護模式

內存: 

vm.swappiness = 0 

關閉numa

文件系統:

用noatime,nobarrier掛載系統

IO調度策略修改成deadline。

相關文章
相關標籤/搜索