linux上優(yōu)化mysql有哪些好的技巧-創(chuàng)新互聯(lián)

下文主要給大家?guī)?lái)linux上優(yōu)化mysql有哪些好的技巧,希望這些內(nèi)容能夠帶給大家實(shí)際用處,這也是我編輯linux上優(yōu)化mysql有哪些好的技巧這篇文章的主要目的。好了,廢話(huà)不多說(shuō),大家直接看下文吧。                                                   

目前創(chuàng)新互聯(lián)已為近1000家的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)頁(yè)空間、網(wǎng)站托管、服務(wù)器托管、企業(yè)網(wǎng)站設(shè)計(jì)、千陽(yáng)網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶(hù)導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶(hù)和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。

一、CPU

首先從CPU說(shuō)起。
你仔細(xì)檢查的話(huà),有些云服務(wù)器上會(huì)有的一個(gè)有趣的現(xiàn)象:你cat /proc/cpuinfo時(shí),會(huì)發(fā)現(xiàn)CPU的頻率竟然跟它標(biāo)稱(chēng)的頻率不一樣:

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

這個(gè)是Intel E5-2620的CPU,他是2.00G * 24的CPU,但是,我們發(fā)現(xiàn)第5顆CPU的頻率為1.2G。
這是什么原因列?
這些其實(shí)都源于CPU最新的技術(shù):節(jié)能模式。操作系統(tǒng)和CPU硬件配合,系統(tǒng)不繁忙的時(shí)候,為了節(jié)約電能和降低溫度,它會(huì)將CPU降頻。這對(duì)環(huán)保人士和抵制地球變暖來(lái)說(shuō)是一個(gè)福音,但是對(duì)MySQL來(lái)說(shuō),可能是一個(gè)災(zāi)難。
為了保證MySQL能夠充分利用CPU的資源,建議設(shè)置CPU為大性能模式。這個(gè)設(shè)置可以在BIOS和操作系統(tǒng)中設(shè)置,當(dāng)然,在BIOS中設(shè)置該選項(xiàng)更好,更徹底。由于各種BIOS類(lèi)型的區(qū)別,設(shè)置為CPU為大性能模式千差萬(wàn)別,我們這里就不具體展示怎么設(shè)置了。

二、內(nèi)存

然后我們看看內(nèi)存方面,我們有哪些可以?xún)?yōu)化的。

i)我們先看看numa
非一致存儲(chǔ)訪問(wèn)結(jié)構(gòu) (NUMA : Non-Uniform Memory Access) 也是最新的內(nèi)存管理技術(shù)。它和對(duì)稱(chēng)多處理器結(jié)構(gòu) (SMP : Symmetric Multi-Processor) 是對(duì)應(yīng)的。簡(jiǎn)單的隊(duì)別如下:

linux上優(yōu)化mysql有哪些好的技巧

如圖所示,詳細(xì)的NUMA信息我們這里不介紹了。但是我們可以直觀的看到:SMP訪問(wèn)內(nèi)存的都是代價(jià)都是一樣的;但是在NUMA架構(gòu)下,本地內(nèi)存的訪問(wèn)和 非本地內(nèi)存的訪問(wèn)代價(jià)是不一樣的。對(duì)應(yīng)的根據(jù)這個(gè)特性,操作系統(tǒng)上,我們可以設(shè)置進(jìn)程的內(nèi)存分配方式。目前支持的方式包括:

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

簡(jiǎn)而言之,就是說(shuō),你可以指定內(nèi)存在本地分配,在某幾個(gè)CPU節(jié)點(diǎn)分配或者輪詢(xún)分配。除非是設(shè)置為--interleave=nodes輪詢(xún)分配方式,即 內(nèi)存可以在任意NUMA節(jié)點(diǎn)上分配這種方式以外。其他的方式就算其他NUMA節(jié)點(diǎn)上還有內(nèi)存剩余,Linux也不會(huì)把剩余的內(nèi)存分配給這個(gè)進(jìn)程,而是采用 SWAP的方式來(lái)獲得內(nèi)存。有經(jīng)驗(yàn)的系統(tǒng)管理員或者DBA都知道SWAP導(dǎo)致的數(shù)據(jù)庫(kù)性能下降有多么坑爹。
所以最簡(jiǎn)單的方法,還是關(guān)閉掉這個(gè)特性。
關(guān)閉特性的方法,分別有:可以從BIOS,操作系統(tǒng),啟動(dòng)進(jìn)程時(shí)臨時(shí)關(guān)閉這個(gè)特性。
a)由于各種BIOS類(lèi)型的區(qū)別,如何關(guān)閉NUMA千差萬(wàn)別,我們這里就不具體展示怎么設(shè)置了。
b)在操作系統(tǒng)中關(guān)閉,可以直接在/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

另外可以設(shè)置 vm.zone_reclaim_mode=0盡量回收內(nèi)存。  
c)啟動(dòng)MySQL的時(shí)候,關(guān)閉NUMA特性:  
numactl --interleave=all  mysqld &

當(dāng)然,最好的方式是在BIOS中關(guān)閉。

ii)我們?cè)倏纯磛m.swappiness。

vm.swappiness是操作系統(tǒng)控制物理內(nèi)存交換出去的策略。它允許的值是一個(gè)百分比的值,最小為0,大運(yùn)行100,該值默認(rèn)為60。vm.swappiness設(shè)置為0表示盡量少swap,100表示盡量將inactive的內(nèi)存頁(yè)交換出去。
具體的說(shuō):當(dāng)內(nèi)存基本用滿(mǎn)的時(shí)候,系統(tǒng)會(huì)根據(jù)這個(gè)參數(shù)來(lái)判斷是把內(nèi)存中很少用到的inactive 內(nèi)存交換出去,還是釋放數(shù)據(jù)的cache。cache中緩存著從磁盤(pán)讀出來(lái)的數(shù)據(jù),根據(jù)程序的局部性原理,這些數(shù)據(jù)有可能在接下來(lái)又要被讀 ?。籭nactive 內(nèi)存顧名思義,就是那些被應(yīng)用程序映射著,但是“長(zhǎng)時(shí)間”不用的內(nèi)存。
我們可以利用vmstat看到inactive的內(nèi)存的數(shù)量:

#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

通過(guò)/proc/meminfo 你可以看到更詳細(xì)的信息:

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

這里我們對(duì)不活躍inactive內(nèi)存進(jìn)一步深入討論。Linux中,內(nèi)存可能處于三種狀態(tài):free,active和inactive。眾所周 知,Linux Kernel在內(nèi)部維護(hù)了很多LRU列表用來(lái)管理內(nèi)存,比如LRU_INACTIVE_ANON, LRU_ACTIVE_ANON, LRU_INACTIVE_FILE , LRU_ACTIVE_FILE, LRU_UNEVICTABLE。其中LRU_INACTIVE_ANON, LRU_ACTIVE_ANON用來(lái)管理匿名頁(yè),LRU_INACTIVE_FILE , LRU_ACTIVE_FILE用來(lái)管理page caches頁(yè)緩存。系統(tǒng)內(nèi)核會(huì)根據(jù)內(nèi)存頁(yè)的訪問(wèn)情況,不定時(shí)的將活躍active內(nèi)存被移到inactive列表中,這些inactive的內(nèi)存可以被 交換到swap中去。
一般來(lái)說(shuō),MySQL,特別是InnoDB管理內(nèi)存緩存,它占用的內(nèi)存比較多,不經(jīng)常訪問(wèn)的內(nèi)存也會(huì)不少,這些內(nèi)存如果被Linux錯(cuò)誤的交換出去了,將 浪費(fèi)很多CPU和IO資源。 InnoDB自己管理緩存,cache的文件數(shù)據(jù)來(lái)說(shuō)占用了內(nèi)存,對(duì)InnoDB幾乎沒(méi)有任何好處。
所以,我們?cè)贛ySQL的云服務(wù)器上最好設(shè)置vm.swappiness=0。

我們可以通過(guò)在sysctl.conf中添加一行:

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

并使用sysctl -p來(lái)使得該參數(shù)生效。

三、文件系統(tǒng)

最后,我們看一下文件系統(tǒng)的優(yōu)化
i)我們建議在文件系統(tǒng)的mount參數(shù)上加上noatime,nobarrier兩個(gè)選項(xiàng)。

用noatime mount的話(huà),文件系統(tǒng)在程序訪問(wèn)對(duì)應(yīng)的文件或者文件夾時(shí),不會(huì)更新對(duì)應(yīng)的access time。一般來(lái)說(shuō),Linux會(huì)給文件記錄了三個(gè)時(shí)間,change time, modify time和access time。
我們可以通過(guò)stat來(lái)查看文件的三個(gè)時(shí)間:

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指文件最后一次被讀取的時(shí)間,modify time指的是文件的文本內(nèi)容最后發(fā)生變化的時(shí)間,change time指的是文件的inode最后發(fā)生變化(比如位置、用戶(hù)屬性、組屬性等)的時(shí)間。一般來(lái)說(shuō),文件都是讀多寫(xiě)少,而且我們也很少關(guān)心某一個(gè)文件最近什 么時(shí)間被訪問(wèn)了。
所以,我們建議采用noatime選項(xiàng),這樣文件系統(tǒng)不記錄access time,避免浪費(fèi)資源。
現(xiàn)在的很多文件系統(tǒng)會(huì)在數(shù)據(jù)提交時(shí)強(qiáng)制底層設(shè)備刷新cache,避免數(shù)據(jù)丟失,稱(chēng)之為write barriers。但是,其實(shí)我們數(shù)據(jù)庫(kù)云服務(wù)器底層存儲(chǔ)設(shè)備要么采用RAID卡,RAID卡本身的電池可以掉電保護(hù);要么采用Flash卡,它也有自我保 護(hù)機(jī)制,保證數(shù)據(jù)不會(huì)丟失。所以我們可以安全的使用nobarrier掛載文件系統(tǒng)。設(shè)置方法如下:
對(duì)于ext3, ext4和 reiserfs文件系統(tǒng)可以在mount時(shí)指定barrier=0;對(duì)于xfs可以指定nobarrier選項(xiàng)。

ii)文件系統(tǒng)上還有一個(gè)提高IO的優(yōu)化*,那就是deadline。

在Flash技術(shù)之前,我們都是使用機(jī)械磁盤(pán)存儲(chǔ)數(shù)據(jù)的,機(jī)械磁盤(pán)的尋道時(shí)間是影響它速度的最重要因素,直接導(dǎo)致它的每秒可做的IO(IOPS)非常有 限,為了盡量排序和合并多個(gè)請(qǐng)求,以達(dá)到一次尋道能夠滿(mǎn)足多次IO請(qǐng)求的目的,Linux文件系統(tǒng)設(shè)計(jì)了多種IO調(diào)度策略,已適用各種場(chǎng)景和存儲(chǔ)設(shè)備。
Linux的IO調(diào)度策略包括:Deadline scheduler,Anticipatory scheduler,Completely Fair Queuing(CFQ),NOOP。每種調(diào)度策略的詳細(xì)調(diào)度方式我們這里不詳細(xì)描述,這里我們主要介紹CFQ和Deadline,CFQ是Linux內(nèi) 核2.6.18之后的默認(rèn)調(diào)度策略,它聲稱(chēng)對(duì)每一個(gè) IO 請(qǐng)求都是公平的,這種調(diào)度策略對(duì)大部分應(yīng)用都是適用的。但是如果數(shù)據(jù)庫(kù)有兩個(gè)請(qǐng)求,一個(gè)請(qǐng)求3次IO,一個(gè)請(qǐng)求10000次IO,由于絕對(duì)公平,3次IO 的這個(gè)請(qǐng)求都需要跟其他10000個(gè)IO請(qǐng)求競(jìng)爭(zhēng),可能要等待上千個(gè)IO完成才能返回,導(dǎo)致它的響應(yīng)時(shí)間非常慢。并且如果在處理的過(guò)程中,又有很多IO請(qǐng) 求陸續(xù)發(fā)送過(guò)來(lái),部分IO請(qǐng)求甚至可能一直無(wú)法得到調(diào)度被“餓死”。而deadline兼顧到一個(gè)請(qǐng)求不會(huì)在隊(duì)列中等待太久導(dǎo)致餓死,對(duì)數(shù)據(jù)庫(kù)這種應(yīng)用來(lái) 說(shuō)更加適用。
實(shí)時(shí)設(shè)置,我們可以通過(guò)

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

來(lái)將sda的調(diào)度策略設(shè)置為deadline。

我們也可以直接在/etc/grub.conf的kernel行最后添加elevator=deadline來(lái)永久生效。

總結(jié)

CPU方面
   關(guān)閉電源保護(hù)模式

內(nèi)存:
   vm.swappiness = 0
   關(guān)閉numa

文件系統(tǒng):
   用noatime,nobarrier掛載系統(tǒng)
   IO調(diào)度策略修改為deadline。

對(duì)于以上關(guān)于linux上優(yōu)化mysql有哪些好的技巧,大家是不是覺(jué)得非常有幫助。如果需要了解更多內(nèi)容,請(qǐng)繼續(xù)關(guān)注我們的行業(yè)資訊,相信你會(huì)喜歡上這些內(nèi)容的。

當(dāng)前名稱(chēng):linux上優(yōu)化mysql有哪些好的技巧-創(chuàng)新互聯(lián)
瀏覽地址:http://muchs.cn/article10/ddohdo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站收錄品牌網(wǎng)站制作、電子商務(wù)關(guān)鍵詞優(yōu)化、App設(shè)計(jì)、ChatGPT

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作