www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁(yè) > 單片機(jī) > 小林coding
[導(dǎo)讀]咋一看,以為是在問(wèn)操作系統(tǒng)的問(wèn)題,其實(shí)這兩個(gè)題目都是在問(wèn)如何改進(jìn) LRU 算法。因?yàn)閭鹘y(tǒng)的 LRU 算法存在這兩個(gè)問(wèn)題:

大家好,我是小林。

上周群里看到有位小伙伴面試時(shí),被問(wèn)到這兩個(gè)問(wèn)題:


咋一看,以為是在問(wèn)操作系統(tǒng)的問(wèn)題,其實(shí)這兩個(gè)題目都是在問(wèn)如何改進(jìn) LRU 算法。

因?yàn)閭鹘y(tǒng)的 LRU 算法存在這兩個(gè)問(wèn)題:

  • 「預(yù)讀失效」導(dǎo)致緩存命中率下降(對(duì)應(yīng)第一個(gè)問(wèn)題)
  • 「緩存污染」導(dǎo)致緩存命中率下降(對(duì)應(yīng)第二個(gè)問(wèn)題)

Redis 的緩存淘汰算法則是通過(guò)實(shí)現(xiàn) LFU 算法來(lái)避免「緩存污染」而導(dǎo)致緩存命中率下降的問(wèn)題(Redis 沒(méi)有預(yù)讀機(jī)制)。

MySQL 和 Linux 操作系統(tǒng)是通過(guò)改進(jìn) LRU 算法來(lái)避免「預(yù)讀失效和緩存污染」而導(dǎo)致緩存命中率下降的問(wèn)題。

這次,就重點(diǎn)講講 MySQL 和 Linux 操作系統(tǒng)是如何改進(jìn) LRU 算法的?

好了,開(kāi)始發(fā)車,坐穩(wěn)了!

Linux 和 MySQL 的緩存

Linux 操作系統(tǒng)的緩存

在應(yīng)用程序讀取文件的數(shù)據(jù)的時(shí)候,Linux 操作系統(tǒng)是會(huì)對(duì)讀取的文件數(shù)據(jù)進(jìn)行緩存的,會(huì)緩存在文件系統(tǒng)中的 Page Cache(如下圖中的頁(yè)緩存)。

Page Cache 屬于內(nèi)存空間里的數(shù)據(jù),由于內(nèi)存訪問(wèn)比磁盤訪問(wèn)快很多,在下一次訪問(wèn)相同的數(shù)據(jù)就不需要通過(guò)磁盤 I/O 了,命中緩存就直接返回?cái)?shù)據(jù)即可。

因此,Page Cache 起到了加速訪問(wèn)數(shù)據(jù)的作用。

MySQL 的緩存

MySQL 的數(shù)據(jù)是存儲(chǔ)在磁盤里的,為了提升數(shù)據(jù)庫(kù)的讀寫性能,Innodb 存儲(chǔ)引擎設(shè)計(jì)了一個(gè)緩沖池(Buffer Pool),Buffer Pool 屬于內(nèi)存空間里的數(shù)據(jù)。

有了緩沖池后:

  • 當(dāng)讀取數(shù)據(jù)時(shí),如果數(shù)據(jù)存在于 Buffer Pool 中,客戶端就會(huì)直接讀取 Buffer Pool 中的數(shù)據(jù),否則再去磁盤中讀取。
  • 當(dāng)修改數(shù)據(jù)時(shí),首先是修改 Buffer Pool 中數(shù)據(jù)所在的頁(yè),然后將其頁(yè)設(shè)置為臟頁(yè),最后由后臺(tái)線程將臟頁(yè)寫入到磁盤。

傳統(tǒng) LRU 是如何管理內(nèi)存數(shù)據(jù)的?

Linux 的 Page Cache 和  MySQL 的 Buffer Pool 的大小是有限的,并不能無(wú)限的緩存數(shù)據(jù),對(duì)于一些頻繁訪問(wèn)的數(shù)據(jù)我們希望可以一直留在內(nèi)存中,而一些很少訪問(wèn)的數(shù)據(jù)希望可以在某些時(shí)機(jī)可以淘汰掉,從而保證內(nèi)存不會(huì)因?yàn)闈M了而導(dǎo)致無(wú)法再緩存新的數(shù)據(jù),同時(shí)還能保證常用數(shù)據(jù)留在內(nèi)存中。

要實(shí)現(xiàn)這個(gè),最容易想到的就是 LRU(Least recently used)算法。

LRU 算法一般是用「鏈表」作為數(shù)據(jù)結(jié)構(gòu)來(lái)實(shí)現(xiàn)的,鏈表頭部的數(shù)據(jù)是最近使用的,而鏈表末尾的數(shù)據(jù)是最久沒(méi)被使用的。那么,當(dāng)空間不夠了,就淘汰最久沒(méi)被使用的節(jié)點(diǎn),也就是鏈表末尾的數(shù)據(jù),從而騰出內(nèi)存空間。

因?yàn)?Linux 的 Page Cache 和  MySQL 的 Buffer Pool 緩存的基本數(shù)據(jù)單位都是頁(yè)(Page)單位,所以后續(xù)以「頁(yè)」名稱代替「數(shù)據(jù)」。

傳統(tǒng)的 LRU 算法的實(shí)現(xiàn)思路是這樣的:

  • 當(dāng)訪問(wèn)的頁(yè)在內(nèi)存里,就直接把該頁(yè)對(duì)應(yīng)的 LRU 鏈表節(jié)點(diǎn)移動(dòng)到鏈表的頭部。
  • 當(dāng)訪問(wèn)的頁(yè)不在內(nèi)存里,除了要把該頁(yè)放入到 LRU 鏈表的頭部,還要淘汰 LRU 鏈表末尾的頁(yè)。

比如下圖,假設(shè) LRU 鏈表長(zhǎng)度為 5,LRU 鏈表從左到右有編號(hào)為 1,2,3,4,5 的頁(yè)。

如果訪問(wèn)了 3 號(hào)頁(yè),因?yàn)?3 號(hào)頁(yè)已經(jīng)在內(nèi)存了,所以把 3 號(hào)頁(yè)移動(dòng)到鏈表頭部即可,表示最近被訪問(wèn)了。

而如果接下來(lái),訪問(wèn)了 8 號(hào)頁(yè),因?yàn)?8 號(hào)頁(yè)不在內(nèi)存里,且 LRU 鏈表長(zhǎng)度為 5,所以必須要淘汰數(shù)據(jù),以騰出內(nèi)存空間來(lái)緩存 8 號(hào)頁(yè),于是就會(huì)淘汰末尾的 5 號(hào)頁(yè),然后再將 8 號(hào)頁(yè)加入到頭部。

傳統(tǒng)的 LRU 算法并沒(méi)有被 Linux 和 MySQL 使用,因?yàn)閭鹘y(tǒng)的 LRU 算法無(wú)法避免下面這兩個(gè)問(wèn)題:

  • 預(yù)讀失效導(dǎo)致緩存命中率下降;
  • 緩存污染導(dǎo)致緩存命中率下降;

預(yù)讀失效,怎么辦?

什么是預(yù)讀機(jī)制?

Linux 操作系統(tǒng)為基于 Page Cache 的讀緩存機(jī)制提供預(yù)讀機(jī)制,一個(gè)例子是:

  • 應(yīng)用程序只想讀取磁盤上文件 A 的 offset 為 0-3KB 范圍內(nèi)的數(shù)據(jù),由于磁盤的基本讀寫單位為 block(4KB),于是操作系統(tǒng)至少會(huì)讀 0-4KB 的內(nèi)容,這恰好可以在一個(gè) page 中裝下。
  • 但是操作系統(tǒng)出于空間局部性原理(靠近當(dāng)前被訪問(wèn)數(shù)據(jù)的數(shù)據(jù),在未來(lái)很大概率會(huì)被訪問(wèn)到),會(huì)選擇將磁盤塊 offset [4KB,8KB)、[8KB,12KB) 以及 [12KB,16KB) 都加載到內(nèi)存,于是額外在內(nèi)存中申請(qǐng)了 3 個(gè) page;

下圖代表了操作系統(tǒng)的預(yù)讀機(jī)制:

上圖中,應(yīng)用程序利用 read 系統(tǒng)調(diào)動(dòng)讀取 4KB 數(shù)據(jù),實(shí)際上內(nèi)核使用預(yù)讀機(jī)制(ReadaHead) 機(jī)制完成了 16KB 數(shù)據(jù)的讀取,也就是通過(guò)一次磁盤順序讀將多個(gè) Page 數(shù)據(jù)裝入 Page Cache。

這樣下次讀取 4KB 數(shù)據(jù)后面的數(shù)據(jù)的時(shí)候,就不用從磁盤讀取了,直接在 Page Cache 即可命中數(shù)據(jù)。因此,預(yù)讀機(jī)制帶來(lái)的好處就是減少了 磁盤 I/O 次數(shù),提高系統(tǒng)磁盤 I/O 吞吐量。

MySQL Innodb 存儲(chǔ)引擎的 Buffer Pool 也有類似的預(yù)讀機(jī)制,MySQL 從磁盤加載頁(yè)時(shí),會(huì)提前把它相鄰的頁(yè)一并加載進(jìn)來(lái),目的是為了減少磁盤 IO。

預(yù)讀失效會(huì)帶來(lái)什么問(wèn)題?

如果這些被提前加載進(jìn)來(lái)的頁(yè),并沒(méi)有被訪問(wèn),相當(dāng)于這個(gè)預(yù)讀工作是白做了,這個(gè)就是預(yù)讀失效。

如果使用傳統(tǒng)的 LRU 算法,就會(huì)把「預(yù)讀頁(yè)」放到 LRU 鏈表頭部,而當(dāng)內(nèi)存空間不夠的時(shí)候,還需要把末尾的頁(yè)淘汰掉。

如果這些「預(yù)讀頁(yè)」如果一直不會(huì)被訪問(wèn)到,就會(huì)出現(xiàn)一個(gè)很奇怪的問(wèn)題,不會(huì)被訪問(wèn)的預(yù)讀頁(yè)卻占用了 LRU 鏈表前排的位置,而末尾淘汰的頁(yè),可能是熱點(diǎn)數(shù)據(jù),這樣就大大降低了緩存命中率 。

如何避免預(yù)讀失效造成的影響?

我們不能因?yàn)楹ε骂A(yù)讀失效,而將預(yù)讀機(jī)制去掉,大部分情況下,空間局部性原理還是成立的。

要避免預(yù)讀失效帶來(lái)影響,最好就是讓預(yù)讀頁(yè)停留在內(nèi)存里的時(shí)間要盡可能的短,讓真正被訪問(wèn)的頁(yè)才移動(dòng)到 LRU 鏈表的頭部,從而保證真正被讀取的熱數(shù)據(jù)留在內(nèi)存里的時(shí)間盡可能長(zhǎng)

那到底怎么才能避免呢?

Linux 操作系統(tǒng)和 MySQL Innodb 通過(guò)改進(jìn)傳統(tǒng) LRU 鏈表來(lái)避免預(yù)讀失效帶來(lái)的影響,具體的改進(jìn)分別如下:

  • Linux 操作系統(tǒng)實(shí)現(xiàn)兩個(gè)了 LRU 鏈表:活躍 LRU 鏈表(active_list)和非活躍 LRU 鏈表(inactive_list);
  • MySQL 的 Innodb 存儲(chǔ)引擎是在一個(gè) LRU 鏈表上劃分來(lái) 2 個(gè)區(qū)域:young 區(qū)域 和 old 區(qū)域

這兩個(gè)改進(jìn)方式,設(shè)計(jì)思想都是類似的,都是將數(shù)據(jù)分為了冷數(shù)據(jù)和熱數(shù)據(jù),然后分別進(jìn)行 LRU 算法。不再像傳統(tǒng)的 LRU 算法那樣,所有數(shù)據(jù)都只用一個(gè) LRU 算法管理。

接下來(lái),具體聊聊 Linux 和 MySQL 是如何避免預(yù)讀失效帶來(lái)的影響?

Linux 是如何避免預(yù)讀失效帶來(lái)的影響?

Linux 操作系統(tǒng)實(shí)現(xiàn)兩個(gè)了 LRU 鏈表:活躍 LRU 鏈表(active_list)和非活躍 LRU 鏈表(inactive_list)。

  • active list 活躍內(nèi)存頁(yè)鏈表,這里存放的是最近被訪問(wèn)過(guò)(活躍)的內(nèi)存頁(yè);
  • inactive list 不活躍內(nèi)存頁(yè)鏈表,這里存放的是很少被訪問(wèn)(非活躍)的內(nèi)存頁(yè);

有了這兩個(gè) LRU 鏈表后,預(yù)讀頁(yè)就只需要加入到 inactive list 區(qū)域的頭部,當(dāng)頁(yè)被真正訪問(wèn)的時(shí)候,才將頁(yè)插入 active list 的頭部。如果預(yù)讀的頁(yè)一直沒(méi)有被訪問(wèn),就會(huì)從 inactive list 移除,這樣就不會(huì)影響 active list 中的熱點(diǎn)數(shù)據(jù)。

接下來(lái),給大家舉個(gè)例子。

假設(shè) active list 和 inactive list 的長(zhǎng)度為 5,目前內(nèi)存中已經(jīng)有如下 10 個(gè)頁(yè):

現(xiàn)在有個(gè)編號(hào)為 20 的頁(yè)被預(yù)讀了,這個(gè)頁(yè)只會(huì)被插入到 inactive list 的頭部,而 inactive list 末尾的頁(yè)(10號(hào))會(huì)被淘汰掉。

即使編號(hào)為 20 的預(yù)讀頁(yè)一直不會(huì)被訪問(wèn),它也沒(méi)有占用到  active list 的位置,而且還會(huì)比 active list 中的頁(yè)更早被淘汰出去。

如果 20 號(hào)頁(yè)被預(yù)讀后,立刻被訪問(wèn)了,那么就會(huì)將它插入到  active list 的頭部, active list 末尾的頁(yè)(5號(hào)),會(huì)被降級(jí)到 inactive list ,作為 inactive list 的頭部,這個(gè)過(guò)程并不會(huì)有數(shù)據(jù)被淘汰。

MySQL 是如何避免預(yù)讀失效帶來(lái)的影響?

MySQL 的 Innodb 存儲(chǔ)引擎是在一個(gè) LRU 鏈表上劃分來(lái) 2 個(gè)區(qū)域,young 區(qū)域 和 old 區(qū)域。

young 區(qū)域在 LRU 鏈表的前半部分,old 區(qū)域則是在后半部分,這兩個(gè)區(qū)域都有各自的頭和尾節(jié)點(diǎn),如下圖:

young 區(qū)域與 old 區(qū)域在 LRU 鏈表中的占比關(guān)系并不是一比一的關(guān)系,而是是 7 比 3 (默認(rèn)比例)的關(guān)系。

劃分這兩個(gè)區(qū)域后,預(yù)讀的頁(yè)就只需要加入到 old 區(qū)域的頭部,當(dāng)頁(yè)被真正訪問(wèn)的時(shí)候,才將頁(yè)插入 young 區(qū)域的頭部。如果預(yù)讀的頁(yè)一直沒(méi)有被訪問(wèn),就會(huì)從 old 區(qū)域移除,這樣就不會(huì)影響 young 區(qū)域中的熱點(diǎn)數(shù)據(jù)。

接下來(lái),給大家舉個(gè)例子。

假設(shè)有一個(gè)長(zhǎng)度為 10 的 LRU 鏈表,其中 young 區(qū)域占比 70 %,old 區(qū)域占比 30 %。

現(xiàn)在有個(gè)編號(hào)為 20 的頁(yè)被預(yù)讀了,這個(gè)頁(yè)只會(huì)被插入到 old 區(qū)域頭部,而 old 區(qū)域末尾的頁(yè)(10號(hào))會(huì)被淘汰掉。

如果 20 號(hào)頁(yè)一直不會(huì)被訪問(wèn),它也沒(méi)有占用到 young 區(qū)域的位置,而且還會(huì)比 young 區(qū)域的數(shù)據(jù)更早被淘汰出去。

如果 20 號(hào)頁(yè)被預(yù)讀后,立刻被訪問(wèn)了,那么就會(huì)將它插入到 young 區(qū)域的頭部,young 區(qū)域末尾的頁(yè)(7號(hào)),會(huì)被擠到 old 區(qū)域,作為 old 區(qū)域的頭部,這個(gè)過(guò)程并不會(huì)有頁(yè)被淘汰。

緩存污染,怎么辦?

什么是緩存污染?

雖然 Linux (實(shí)現(xiàn)兩個(gè) LRU 鏈表)和 MySQL (劃分兩個(gè)區(qū)域)通過(guò)改進(jìn)傳統(tǒng)的 LRU 數(shù)據(jù)結(jié)構(gòu),避免了預(yù)讀失效帶來(lái)的影響。

但是如果還是使用「只要數(shù)據(jù)被訪問(wèn)一次,就將數(shù)據(jù)加入到活躍 LRU 鏈表頭部(或者 young 區(qū)域)」這種方式的話,那么還存在緩存污染的問(wèn)題。

當(dāng)我們?cè)谂孔x取數(shù)據(jù)的時(shí)候,由于數(shù)據(jù)被訪問(wèn)了一次,這些大量數(shù)據(jù)都會(huì)被加入到「活躍 LRU 鏈表」里,然后之前緩存在活躍 LRU 鏈表(或者 young 區(qū)域)里的熱點(diǎn)數(shù)據(jù)全部都被淘汰了,如果這些大量的數(shù)據(jù)在很長(zhǎng)一段時(shí)間都不會(huì)被訪問(wèn)的話,那么整個(gè)活躍 LRU 鏈表(或者 young 區(qū)域)就被污染了。

緩存污染會(huì)帶來(lái)什么問(wèn)題?

緩存污染帶來(lái)的影響就是很致命的,等這些熱數(shù)據(jù)又被再次訪問(wèn)的時(shí)候,由于緩存未命中,就會(huì)產(chǎn)生大量的磁盤 I/O,系統(tǒng)性能就會(huì)急劇下降。

我以 MySQL 舉例子,Linux 發(fā)生緩存污染的現(xiàn)象也是類似。

當(dāng)某一個(gè) SQL 語(yǔ)句掃描了大量的數(shù)據(jù)時(shí),在 Buffer Pool 空間比較有限的情況下,可能會(huì)將 Buffer Pool 里的所有頁(yè)都替換出去,導(dǎo)致大量熱數(shù)據(jù)被淘汰了,等這些熱數(shù)據(jù)又被再次訪問(wèn)的時(shí)候,由于緩存未命中,就會(huì)產(chǎn)生大量的磁盤 I/O,MySQL 性能就會(huì)急劇下降。

注意, 緩存污染并不只是查詢語(yǔ)句查詢出了大量的數(shù)據(jù)才出現(xiàn)的問(wèn)題,即使查詢出來(lái)的結(jié)果集很小,也會(huì)造成緩存污染。

比如,在一個(gè)數(shù)據(jù)量非常大的表,執(zhí)行了這條語(yǔ)句:

select * from t_user where name like "%xiaolin%";

可能這個(gè)查詢出來(lái)的結(jié)果就幾條記錄,但是由于這條語(yǔ)句會(huì)發(fā)生索引失效,所以這個(gè)查詢過(guò)程是全表掃描的,接著會(huì)發(fā)生如下的過(guò)程:

  • 從磁盤讀到的頁(yè)加入到 LRU 鏈表的 old 區(qū)域頭部;
  • 當(dāng)從頁(yè)里讀取行記錄時(shí),也就是頁(yè)被訪問(wèn)的時(shí)候,就要將該頁(yè)放到 young 區(qū)域頭部
  • 接下來(lái)拿行記錄的 name 字段和字符串 xiaolin 進(jìn)行模糊匹配,如果符合條件,就加入到結(jié)果集里;
  • 如此往復(fù),直到掃描完表中的所有記錄。

經(jīng)過(guò)這一番折騰,由于這條 SQL 語(yǔ)句訪問(wèn)的頁(yè)非常多,每訪問(wèn)一個(gè)頁(yè),都會(huì)將其加入 young 區(qū)域頭部,那么原本 young 區(qū)域的熱點(diǎn)數(shù)據(jù)都會(huì)被替換掉,導(dǎo)致緩存命中率下降。那些在批量掃描時(shí),而被加入到 young 區(qū)域的頁(yè),如果在很長(zhǎng)一段時(shí)間都不會(huì)再被訪問(wèn)的話,那么就污染了 young 區(qū)域。

舉個(gè)例子,假設(shè)需要批量掃描:21,22,23,24,25 這五個(gè)頁(yè),這些頁(yè)都會(huì)被逐一訪問(wèn)(讀取頁(yè)里的記錄)。

在批量訪問(wèn)這些頁(yè)的時(shí)候,會(huì)被逐一插入到 young 區(qū)域頭部。

可以看到,原本在 young 區(qū)域的 6 和 7 號(hào)頁(yè)都被淘汰了,而批量掃描的頁(yè)基本占滿了 young 區(qū)域,如果這些頁(yè)在很長(zhǎng)一段時(shí)間都不會(huì)被訪問(wèn),那么就對(duì) young 區(qū)域造成了污染。

如果 6 和 7 號(hào)頁(yè)是熱點(diǎn)數(shù)據(jù),那么在被淘汰后,后續(xù)有 SQL 再次讀取  6 和 7 號(hào)頁(yè)時(shí),由于緩存未命中,就要從磁盤中讀取了,降低了 MySQL 的性能,這就是緩存污染帶來(lái)的影響。

怎么避免緩存污染造成的影響?

前面的 LRU 算法只要數(shù)據(jù)被訪問(wèn)一次,就將數(shù)據(jù)加入活躍 LRU 鏈表(或者 young 區(qū)域),這種 LRU 算法進(jìn)入活躍 LRU 鏈表的門檻太低了!正式因?yàn)殚T檻太低,才導(dǎo)致在發(fā)生緩存污染的時(shí)候,很容易就將原本在活躍 LRU 鏈表里的熱點(diǎn)數(shù)據(jù)淘汰了。

所以,只要我們提高進(jìn)入到活躍 LRU 鏈表(或者 young 區(qū)域)的門檻,就能有效地保證活躍 LRU 鏈表(或者 young 區(qū)域)里的熱點(diǎn)數(shù)據(jù)不會(huì)被輕易替換掉。

Linux 操作系統(tǒng)和 MySQL Innodb 存儲(chǔ)引擎分別是這樣提高門檻的:

  • Linux 操作系統(tǒng):在內(nèi)存頁(yè)被訪問(wèn)第二次的時(shí)候,才將頁(yè)從 inactive list 升級(jí)到 active list 里。
  • MySQL Innodb:在內(nèi)存頁(yè)被訪問(wèn)第二次的時(shí)候,并不會(huì)馬上將該頁(yè)從 old 區(qū)域升級(jí)到 young 區(qū)域,因?yàn)檫€要進(jìn)行停留在 old 區(qū)域的時(shí)間判斷
    • 如果第二次的訪問(wèn)時(shí)間與第一次訪問(wèn)的時(shí)間在 1 秒內(nèi)(默認(rèn)值),那么該頁(yè)就不會(huì)被從 old 區(qū)域升級(jí)到 young 區(qū)域;
    • 如果第二次的訪問(wèn)時(shí)間與第一次訪問(wèn)的時(shí)間超過(guò) 1 秒,那么該頁(yè)就會(huì)從 old 區(qū)域升級(jí)到 young 區(qū)域;

提高了進(jìn)入活躍 LRU 鏈表(或者 young 區(qū)域)的門檻后,就很好了避免緩存污染帶來(lái)的影響。

在批量讀取數(shù)據(jù)時(shí)候,如果這些大量數(shù)據(jù)只會(huì)被訪問(wèn)一次,那么它們就不會(huì)進(jìn)入到活躍 LRU 鏈表(或者 young 區(qū)域),也就不會(huì)把熱點(diǎn)數(shù)據(jù)淘汰,只會(huì)待在非活躍 LRU 鏈表(或者 old 區(qū)域)中,后續(xù)很快也會(huì)被淘汰。

總結(jié)

傳統(tǒng)的 LRU 算法法無(wú)法避免下面這兩個(gè)問(wèn)題:

  • 預(yù)讀失效導(dǎo)致緩存命中率下降;
  • 緩存污染導(dǎo)致緩存命中率下降;

為了避免「預(yù)讀失效」造成的影響,Linux 和 MySQL 對(duì)傳統(tǒng)的 LRU 鏈表做了改進(jìn):

  • Linux 操作系統(tǒng)實(shí)現(xiàn)兩個(gè)了 LRU 鏈表:活躍 LRU 鏈表(active list)和非活躍 LRU 鏈表(inactive list)。
  • MySQL  Innodb 存儲(chǔ)引擎是在一個(gè) LRU 鏈表上劃分來(lái) 2 個(gè)區(qū)域:young 區(qū)域 和 old 區(qū)域

但是如果還是使用「只要數(shù)據(jù)被訪問(wèn)一次,就將數(shù)據(jù)加入到活躍 LRU 鏈表頭部(或者 young 區(qū)域)」這種方式的話,那么還存在緩存污染的問(wèn)題。

為了避免「緩存污染」造成的影響,Linux 操作系統(tǒng)和 MySQL Innodb 存儲(chǔ)引擎分別提高了升級(jí)為熱點(diǎn)數(shù)據(jù)的門檻:

  • Linux 操作系統(tǒng):在內(nèi)存頁(yè)被訪問(wèn)第二次的時(shí)候,才將頁(yè)從 inactive list 升級(jí)到 active list 里。
  • MySQL Innodb:在內(nèi)存頁(yè)被訪問(wèn)第二次的時(shí)候,并不會(huì)馬上將該頁(yè)從 old 區(qū)域升級(jí)到 young 區(qū)域,因?yàn)檫€要進(jìn)行停留在 old 區(qū)域的時(shí)間判斷
    • 如果第二次的訪問(wèn)時(shí)間與第一次訪問(wèn)的時(shí)間在 1 秒內(nèi)(默認(rèn)值),那么該頁(yè)就不會(huì)被從 old 區(qū)域升級(jí)到 young 區(qū)域;
    • 如果第二次的訪問(wèn)時(shí)間與第一次訪問(wèn)的時(shí)間超過(guò) 1 秒,那么該頁(yè)就會(huì)從 old 區(qū)域升級(jí)到 young 區(qū)域;
本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

北京 2025年7月3日 /美通社/ -- 近日,北京積算科技有限公司(以下簡(jiǎn)稱"積算科技")正式推出GPU裸金屬算力服務(wù)套件,幫助客戶實(shí)現(xiàn)并行環(huán)境的分鐘級(jí)部署與出廠級(jí)性能校準(zhǔn),在GPU裸金屬算力上...

關(guān)鍵字: 金屬 GPU 性能優(yōu)化 操作系統(tǒng)

上海 2025年5月20日 /美通社/ -- 2025年5月15日至18日,全球神經(jīng)介入領(lǐng)域頂級(jí)盛會(huì)——世界神經(jīng)介入治療大會(huì)(WLNC)暨東方腦血管病大會(huì)(OCIN)于上海國(guó)際會(huì)議中心隆重舉行,吸引了來(lái)自全球神經(jīng)介入領(lǐng)...

關(guān)鍵字: 機(jī)器人 VI AN 操作系統(tǒng)

Docker 是一種基于操作系統(tǒng)層級(jí)的虛擬化技術(shù),它將軟件及其依賴項(xiàng)打包為容器,使得應(yīng)用程序可以在任何支持 Docker 的環(huán)境中運(yùn)行。

關(guān)鍵字: Docker 操作系統(tǒng)

北京2025年2月28日 /美通社/ -- 日前,《服務(wù)器操作系統(tǒng)遷移指南》(以下簡(jiǎn)稱《指南》)經(jīng)中國(guó)電子工業(yè)標(biāo)準(zhǔn)化技術(shù)協(xié)會(huì)批準(zhǔn)后正式發(fā)布,將于3月正式實(shí)施?!吨改稀酚衫顺毙畔款^,中國(guó)電子技術(shù)標(biāo)準(zhǔn)化研究院、阿里云、統(tǒng)信...

關(guān)鍵字: 操作系統(tǒng) 編寫 CPU 內(nèi)存

業(yè)界最真實(shí)、最互聯(lián)、最具未來(lái)性的操作系統(tǒng)變得更智能、更快速、更敏銳 紐約2025年1月30日 ?/PRNewswire/ -- Stagwell(納斯達(dá)克股票代碼:STGW...

關(guān)鍵字: ASSEMBLY STAGE AI 操作系統(tǒng)

在Linux操作系統(tǒng)中,文件操作是進(jìn)程與存儲(chǔ)系統(tǒng)交互的重要方式。對(duì)于同一個(gè)文件,一個(gè)進(jìn)程是否可以在其生命周期內(nèi)多次調(diào)用open函數(shù)打開(kāi)它,并進(jìn)行讀寫操作呢?答案是肯定的。本文將深入探討這一機(jī)制,并通過(guò)代碼示例展示如何在進(jìn)...

關(guān)鍵字: 文件 Linux 操作系統(tǒng)

北京2025年1月20日 /美通社/ -- 近日,微展世(北京)數(shù)字科技有限公司(簡(jiǎn)稱"微展世")在北京成功舉辦了2025產(chǎn)品發(fā)布與戰(zhàn)略簽約盛典。作為微展世的重要戰(zhàn)略合作伙伴,軟通動(dòng)力及其子公司鴻湖萬(wàn)...

關(guān)鍵字: 開(kāi)源 操作系統(tǒng) 鴻蒙 OS

北京2025年1月16日 /美通社/ -- 軟硬一體具身智能人形機(jī)器人是未來(lái)智能產(chǎn)業(yè)的重大機(jī)遇,大模型智能體應(yīng)用在千行百業(yè)深入廣泛推進(jìn),世界模型、具身智能也正加快從實(shí)驗(yàn)室走向場(chǎng)景應(yīng)用和商業(yè)落地。軟通動(dòng)力聚焦人形機(jī)器人場(chǎng)景...

關(guān)鍵字: 機(jī)器人 模型 智能計(jì)算 操作系統(tǒng)

拉斯維加斯2025年1月11日 /美通社/ -- 2025年1月8日,于拉斯維加斯舉辦的消費(fèi)電子展(CES)上,全球AI跨語(yǔ)言溝通設(shè)備領(lǐng)導(dǎo)品牌時(shí)空壺,正式發(fā)布Timekett...

關(guān)鍵字: 操作系統(tǒng) BLE OS CE

以開(kāi)源鴻蒙賦能工業(yè)創(chuàng)新升級(jí) 北京2025年1月10日 /美通社/ -- 1月7日,軟通動(dòng)力攜子公司鴻湖萬(wàn)聯(lián),與微展世(北京)數(shù)字科技有限公司(簡(jiǎn)稱"微展世")在廣州簽署戰(zhàn)略合作協(xié)議,三方將聯(lián)合開(kāi)發(fā)基...

關(guān)鍵字: 操作系統(tǒng) 開(kāi)源 數(shù)字化 OS
關(guān)閉