內(nèi)存還是硬盤(pán)? 數(shù)據(jù)庫(kù)IO瓶頸時(shí)的抉擇
很多DBA在進(jìn)行數(shù)據(jù)庫(kù)管理時(shí)通常都會(huì)遇到數(shù)據(jù)庫(kù)IO瓶頸,在硬件成本預(yù)算有限的情況下,解決這一瓶頸有兩個(gè)方法:一是增加內(nèi)存;二是增加磁盤(pán)(假設(shè)不增加機(jī)器的情況下)。到底是加內(nèi)存合算,還是加磁盤(pán)實(shí)惠呢,這是個(gè)頭疼的問(wèn)題。
已經(jīng)神秘消失的數(shù)據(jù)庫(kù)大師Jim Gray早在20年前就為我們考慮過(guò)這個(gè)問(wèn)題了,并且得出一個(gè)結(jié)論叫“五分鐘規(guī)則”(Five Minutes Rule),就是說(shuō)如果一個(gè)頁(yè)面每五分鐘就會(huì)被訪問(wèn)一次的話,就應(yīng)該把它放到內(nèi)存中去,否則就應(yīng)該把它存儲(chǔ)在磁盤(pán)上。這樣,數(shù)據(jù)庫(kù)只要統(tǒng)計(jì)一下有多少頁(yè)面的訪問(wèn)頻率超過(guò)五分鐘一次,就知道需要多少內(nèi)存了。
當(dāng)然五分鐘是個(gè)典型值,或者表示一個(gè)數(shù)量級(jí),具體的值要看硬件條件。Jim Gray給出的公式是:
RI = 每M數(shù)據(jù)頁(yè)數(shù) * 一塊磁盤(pán)的價(jià)格 / 磁盤(pán)每秒能進(jìn)行的隨機(jī)IO次數(shù) / 每M內(nèi)存的價(jià)格
其中RI即為要放到內(nèi)存的頁(yè)面訪問(wèn)時(shí)間周期閾值。
這個(gè)一公式可以這么理解。假設(shè)你拿到一個(gè)頁(yè)面,它的訪問(wèn)周期是I。你要決定是買內(nèi)存來(lái)存儲(chǔ)這個(gè)頁(yè)面還是買磁盤(pán)來(lái)存儲(chǔ)它。假設(shè)買內(nèi)存來(lái)存儲(chǔ),開(kāi)銷很容易算出來(lái)是"每M內(nèi)存價(jià)格/每M數(shù)據(jù)頁(yè)數(shù)"。如果買磁盤(pán)來(lái)存,則開(kāi)銷是"一塊磁盤(pán)的價(jià)格 / 磁盤(pán)每秒能進(jìn)行的隨機(jī)IO次數(shù) / I",意思是說(shuō),我買個(gè)磁盤(pán)花的錢是“一塊磁盤(pán)的價(jià)格”這么多,再我這個(gè)頁(yè)一秒只會(huì)訪問(wèn)"1/I"次,因此我只占用了磁盤(pán)帶寬的"1/I/磁盤(pán)每秒能進(jìn)行的隨機(jī)IO次數(shù)",因此為這個(gè)頁(yè)花的開(kāi)銷就是“一塊磁盤(pán)的價(jià)格 / 磁盤(pán)每秒能進(jìn)行的隨機(jī)IO次數(shù) / I"。
這樣,導(dǎo)致內(nèi)存開(kāi)銷"每M內(nèi)存價(jià)格/每M數(shù)據(jù)頁(yè)數(shù)"與磁盤(pán)開(kāi)銷"一塊磁盤(pán)的價(jià)格 / 磁盤(pán)每秒能進(jìn)行的隨機(jī)IO次數(shù) / I"相等的I值即為訪問(wèn)時(shí)間周期閾值,計(jì)算出來(lái)就是公式中的RI。
在數(shù)據(jù)庫(kù)IO瓶頸時(shí),針對(duì)當(dāng)前常用硬件來(lái)計(jì)算一下。設(shè)頁(yè)面大小為16K(InnoDB默認(rèn)頁(yè)面大?。簿褪敲縈數(shù)據(jù)頁(yè)數(shù)64,一塊SAS盤(pán)算3000塊,每秒能進(jìn)行200次隨機(jī)IO,4G的內(nèi)存算3000塊一條,也就是每M內(nèi)存0.75元。這樣算出來(lái)RI是1280秒,也就是20分鐘左右。
可惜的是MySQL并不提供頁(yè)面的訪問(wèn)頻率統(tǒng)計(jì)功能。可以用一個(gè)方法來(lái)代替,就是把數(shù)據(jù)庫(kù)關(guān)掉,起來(lái)后看20分鐘內(nèi)數(shù)據(jù)庫(kù)的緩存有沒(méi)有滿,若沒(méi)有滿,表示內(nèi)存太大,否則表示內(nèi)存太小。只是在熱門(mén)時(shí)間段肯定是不會(huì)去做這個(gè)實(shí)驗(yàn)的,非熱門(mén)時(shí)間段倒是可以把數(shù)據(jù)庫(kù)重起下,但這時(shí)負(fù)載輕又不準(zhǔn)了。即使是哪天MySQL crash了,在熱門(mén)時(shí)間段crash后要做很多redo,又不準(zhǔn)了。
實(shí)際上這一功能是可以實(shí)現(xiàn)的,統(tǒng)計(jì)有多少個(gè)20分鐘訪問(wèn)一次的頁(yè)面可以近似的轉(zhuǎn)化為統(tǒng)計(jì)20分鐘內(nèi)有多少個(gè)不同的頁(yè)面被訪問(wèn)。假設(shè)系統(tǒng)中內(nèi)存大小與理想值相差不太大,則只需要多用不到1/1000的內(nèi)存就可以統(tǒng)計(jì)出來(lái),當(dāng)然每次頁(yè)面訪問(wèn)時(shí)要多搜索一個(gè)哈希表。嗯,在NTSE里準(zhǔn)備實(shí)現(xiàn)吧,哈哈。
當(dāng)然這一計(jì)算已經(jīng)忽略了很多實(shí)際因素,比如如果你機(jī)器上的RAID卡已經(jīng)滿了不能加硬盤(pán),那就只好加內(nèi)存了,如果內(nèi)存槽插滿了,那就只好加硬盤(pán)了。如果硬盤(pán)和內(nèi)存都加不了,那就加機(jī)器吧。另外上述計(jì)算假設(shè)頁(yè)面訪問(wèn)是完全隨機(jī)的,如果是順序訪問(wèn),那就大不相同了,這時(shí)的RI會(huì)小很多,因?yàn)檫@時(shí)磁盤(pán)每秒能讀入的頁(yè)面數(shù)增加了。
【編輯推薦】