您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“MYSQL內(nèi)存機(jī)制分析和監(jiān)控”的有關(guān)知識,在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
1 為什么要有buffer pool 或者內(nèi)存,緩存在MYSQL 數(shù)據(jù)庫中到底是為了什么?
估計(jì)很多人很快的回答,性能。是的內(nèi)存在數(shù)據(jù)庫中其實(shí)就是為了性能,試想如果磁盤的速度和內(nèi)存一樣快,還需要內(nèi)存,buffer pool ,緩存嗎?
2 Buffer pool 緩存,內(nèi)存,到底在MYSQL 中起到了什么作用?
首先所有的數(shù)據(jù)處理和變化都是在內(nèi)存中,磁盤中的數(shù)據(jù)僅僅是為了持久化而,所以最復(fù)雜的處理關(guān)系,類似于死鎖,block ,互斥,數(shù)據(jù)字典,bulabula 等等都存在于內(nèi)存中。所以一問道死鎖,千萬別和別人說是因?yàn)榇疟P慢了之類的 ,因?yàn)樗话l(fā)生在磁盤,而是在內(nèi)存中。
3 磁盤的數(shù)據(jù)page 和 內(nèi)存的數(shù)據(jù)page 有關(guān)嗎?
是的是有關(guān)系的,磁盤的數(shù)據(jù)頁面是要映射到內(nèi)存中去的,這也就牽扯到另外一件事情,就是page頁面的大小,在PG 中磁盤的頁面大小是可以調(diào)整的,MYSQL 默認(rèn)是16KB ,ORACLE 是 8 KB, SQL SERVER 也是 8KB。換句話也就是說,有些數(shù)據(jù)庫的頁面大小是可以調(diào)整的,有些是不可以的,同時(shí)他們的磁盤的頁面會(huì)直接映射到內(nèi)存中。
4 頁面的大小對數(shù)據(jù)庫的性能有什么影響?
這個(gè)問題其實(shí)我也是一直在書籍和,google中去找尋,但一直沒有一個(gè)答案或者可以讓人信服的答案,這里就嘗試自己分析一下,以MYSQL的頁面16KB為為例,如果一次讀入的數(shù)據(jù)是8KB,那16KB只能使用其中一半,如果后期有在讀入8KB的數(shù)據(jù),可以在使用另外一半的內(nèi)存,但是如果讀入的是4KB的數(shù)據(jù),則可能會(huì)浪費(fèi) 4KB的cache,所以分配的頁面太大會(huì)有浪費(fèi)的情況,那有人說,8KB的比16KB的要小,所以浪費(fèi)的空間少,但從另一個(gè)角度來分析,如果一次我要讀入12KB的數(shù)據(jù)呢,那是不是要分成兩個(gè)page?效率上是否比一個(gè)頁面能承載的數(shù)據(jù)在處理上要麻煩,并且一個(gè)數(shù)據(jù)頁分成兩個(gè),是否還有其他需要進(jìn)行的事情,例如連接 等等?
所以一個(gè)數(shù)據(jù)頁的大小,見仁見智,不是非黑即白,需要根據(jù)具體的問題具體分析,如果你的MYSQL使用的是壓縮頁面,16KB 或更大的頁面或許會(huì)更好。所以有的時(shí)候,數(shù)據(jù)庫的頁面可以被調(diào)整,根據(jù)業(yè)務(wù)或者根據(jù)某種特性來進(jìn)行設(shè)置,會(huì)保證更好的性能,而類似 SQL SERVER ,ORACLE 這樣的數(shù)據(jù)庫是不可以調(diào)整的。
5 內(nèi)存中的數(shù)據(jù)是否有退出機(jī)制?
回答是一定的,任何數(shù)據(jù)庫的內(nèi)存的數(shù)據(jù)都有退出的機(jī)制,否則內(nèi)存難道要和數(shù)據(jù)的大小一致,在目前的硬件技術(shù)上,這是不大可能的,所以內(nèi)存必須有退出的機(jī)制。從另外一個(gè)事情上,也反應(yīng)出硬件的變化,其實(shí)對數(shù)據(jù)庫的軟件設(shè)計(jì)是有聯(lián)動(dòng)性或者部分決定性的。
6 內(nèi)存中涉及管理內(nèi)存頁的是怎么做的
MYSQL 中的內(nèi)存管理主要使用的是 LRU 算法(變種),Least Recently Used,在MYSQL 的 BUFFER POOL 中是包含 New SUBLIST 和 Old Sublist
上面的圖大家都看見了,大致LRU (進(jìn)化)的算法, 新讀入內(nèi)存的都放入到 young 區(qū)域 5/8 buffer pool ,而經(jīng)常被調(diào)用的頁面則會(huì)在一個(gè)算法后從5/8 放入到 3/8中,具體其實(shí)如果讀過 ORACLE 的內(nèi)存管理,其中有一段和MYSQL 是大致相同的,都是隊(duì)列的概念+頻繁提取的數(shù)據(jù)提前。
當(dāng)然數(shù)據(jù)頁中的數(shù)據(jù)是變化的,也就是說變化的數(shù)據(jù)頁就是臟頁,而臟頁就要刷入到磁盤中進(jìn)行合并,進(jìn)行永久化,當(dāng)然這個(gè)過程可以單獨(dú)寫一篇甚至多篇文字,這里就不展開了。
這里提出一個(gè)問題,如果數(shù)據(jù)頁變化了,我在去讀這個(gè)數(shù)據(jù)頁怎么辦?
這里大概率是你要去讀change buffer ,(insert buffer replacement),而不會(huì)等待你的臟頁刷新到磁盤,在讀到內(nèi)存,在進(jìn)行后續(xù)的工作。
那如何查詢這些內(nèi)存的信息,就對系統(tǒng)的性能變得尤為重要了
查看當(dāng)然可以被收集的內(nèi)存 ITEM 信息
SELECT * FROM performance_schema.setup_instruments
WHERE NAME LIKE '%memory/innodb%'
對某些不進(jìn)行收集的內(nèi)存信息進(jìn)行收集
update performance_schema.setup_instruments set enabled = 'yes' where name like 'memory/innodb/buf_buf_pool'
同時(shí)通過語句可以獲得,內(nèi)存在MYSQL 中的分配信息
其實(shí)關(guān)于MYSQL的內(nèi)存管理,當(dāng)然我們也可以通過另外的方法去訪問,見下圖,當(dāng)然這應(yīng)該是最基本的應(yīng)該被掌握的。怎么查看 Do you get it ?
“MYSQL內(nèi)存機(jī)制分析和監(jiān)控”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。