溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

MYSQL內(nèi)存機(jī)制分析和監(jiān)控

發(fā)布時(shí)間:2021-09-16 10:54:52 來源:億速云 閱讀:134 作者:chen 欄目:大數(shù)據(jù)

本篇內(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

MYSQL內(nèi)存機(jī)制分析和監(jiān)控

上面的圖大家都看見了,大致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 中的分配信息

MYSQL內(nèi)存機(jī)制分析和監(jiān)控

其實(shí)關(guān)于MYSQL的內(nèi)存管理,當(dāng)然我們也可以通過另外的方法去訪問,見下圖,當(dāng)然這應(yīng)該是最基本的應(yīng)該被掌握的。怎么查看 Do you get it ?

MYSQL內(nèi)存機(jī)制分析和監(jiān)控

“MYSQL內(nèi)存機(jī)制分析和監(jiān)控”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問一下細(xì)節(jié)

免責(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)容。

AI