亚洲精品亚洲人成人网_免费看日韩精品_6080日韩午夜伦伦午夜伦_欧美日韩一区久久_国产精品电影一区_一道本成人在线_日产国产欧美视频一区精品_69视频在线播放_久久久久亚洲蜜桃_亚洲国产你懂的

首頁>國內 > 正文

如何避免系統(tǒng)預讀失效和緩存污染的問題?

2023-08-31 08:31:50來源:今日頭條

面試中的兩個問題:

操作系統(tǒng)在讀磁盤的時候會額外多讀一些數據到內存中,最后也沒有用到,如何改善?


(資料圖片僅供參考)

批量讀取數據的時候,可能會熱點數據擠出去,如何改善?

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

在應用程序讀取文件的數據的時候,Linux 操作系統(tǒng)是會對讀取的文件數據進行緩存的,會緩存在文件系統(tǒng)中的Page Cache(如下圖中的頁緩存)。

Page Cache 屬于內存空間里的數據,由于內存訪問比磁盤訪問快很多,在下一次訪問相同的數據就不需要通過磁盤 I/O 了,命中緩存就直接返回數據即可。

因此,Page Cache 起到了加速訪問數據的作用。

MySQL 的緩存

MySQL 的數據是存儲在磁盤里的,為了提升數據庫的讀寫性能,Innodb 存儲引擎設計了一個緩沖池(Buffer Pool),Buffer Pool 屬于內存空間里的數據。

有了緩沖池后:

當讀取數據時,如果數據存在于 Buffer Pool 中,客戶端就會直接讀取 Buffer Pool 中的數據,否則再去磁盤中讀取。當修改數據時,首先是修改 Buffer Pool 中數據所在的頁,然后將其頁設置為臟頁,最后由后臺線程將臟頁寫入到磁盤。傳統(tǒng) LRU 是如何管理內存數據的?

Linux 的 Page Cache 和 MySQL 的 Buffer Pool 的大小是有限的,并不能無限的緩存數據,對于一些頻繁訪問的數據我們希望可以一直留在內存中,而一些很少訪問的數據希望可以在某些時機可以淘汰掉,從而保證內存不會因為滿了而導致無法再緩存新的數據,同時還能保證常用數據留在內存中。

要實現這個,最容易想到的就是 LRU(Least recently used)算法。

LRU 算法一般是用「鏈表」作為數據結構來實現的,鏈表頭部的數據是最近使用的,而鏈表末尾的數據是最久沒被使用的。那么,當空間不夠了,就淘汰最久沒被使用的節(jié)點,也就是鏈表末尾的數據,從而騰出內存空間。

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

傳統(tǒng)的 LRU 算法的實現思路是這樣的:

當訪問的頁在內存里,就直接把該頁對應的 LRU 鏈表節(jié)點移動到鏈表的頭部。當訪問的頁不在內存里,除了要把該頁放入到 LRU 鏈表的頭部,還要淘汰 LRU 鏈表末尾的頁。

存在的問題:

如果一條數據僅僅是突然被訪問(有可能后續(xù)將不再訪問),在 LRU 算法下,此數據將被定義為熱數據,最晚被淘汰。但實際生產環(huán)境下,我們很多時候需要計算的是一段時間下key的訪問頻率,淘汰此時間段內的冷數據。

預讀失效,怎么辦?什么是預讀機制?

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

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

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

上圖中,應用程序利用 read 系統(tǒng)調動讀取 4KB 數據,實際上內核使用預讀機制(ReadaHead) 機制完成了 16KB 數據的讀取,也就是通過一次磁盤順序讀將多個 Page 數據裝入 Page Cache。

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

MySQL Innodb 存儲引擎的 Buffer Pool 也有類似的預讀機制,MySQL 從磁盤加載頁時,會提前把它相鄰的頁一并加載進來,目的是為了減少磁盤 IO。

預讀失效會帶來什么問題?

如果這些被提前加載進來的頁,并沒有被訪問,相當于這個預讀工作是白做了,這個就是預讀失效。

如果把「預讀頁」放到了 LRU 鏈表頭部,而當內存空間不夠的時候,還需要把末尾的頁淘汰掉。而末尾淘汰的頁,可能是熱點數據,這樣就大大降低了緩存命中率。

如何避免預讀失效造成的影響?

我們不能因為害怕預讀失效,而將預讀機制去掉,大部分情況下,空間局部性原理還是成立的。要避免預讀失效帶來影響,可以從兩個方面考慮

讓預讀頁停留在內存里的時間要盡可能的短,讓真正被訪問的頁移動到 LRU 鏈表的頭部,從而保證熱數據留在內存里的時間盡可能長。

那到底怎么才能避免呢?

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

Linux 操作系統(tǒng)實現兩個了 LRU 鏈表:活躍 LRU 鏈表(active_list)和非活躍 LRU 鏈表(inactive_list);MySQL 的 Innodb 存儲引擎是在一個 LRU 鏈表上劃分來 2 個區(qū)域:young 區(qū)域 和 old 區(qū)域。

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

接下來,具體聊聊 Linux 和 MySQL 是如何避免預讀失效帶來的影響?

Linux 是如何避免預讀失效帶來的影響?

Linux 操作系統(tǒng)實現兩個了 LRU 鏈表:活躍 LRU 鏈表(active_list)和非活躍 LRU 鏈表(inactive_list)。

active list活躍內存頁鏈表,這里存放的是最近被訪問過(活躍)的內存頁;inactive list不活躍內存頁鏈表,這里存放的是很少被訪問(非活躍)的內存頁;

有了這兩個 LRU 鏈表后,預讀頁就只需要加入到 inactive list 區(qū)域的頭部,當頁被真正訪問的時候,才將頁插入 active list 的頭部。如果預讀的頁一直沒有被訪問,就會從 inactive list 移除,這樣就不會影響 active list 中的熱點數據。

MySQL 是如何避免預讀失效帶來的影響?

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

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

young 區(qū)域與 old 區(qū)域在 LRU 鏈表中的占比關系并不是一比一的關系,而是 63:37(默認比例)的關系。劃分這兩個區(qū)域后,預讀的頁就只需要加入到 old 區(qū)域的頭部,當頁被真正訪問的時候,才將頁插入 young 區(qū)域的頭部。如果預讀的頁一直沒有被訪問,就會從 old 區(qū)域移除,這樣就不會影響 young 區(qū)域中的熱點數據。

緩存污染,怎么辦?什么是緩存污染?

雖然 Linux (實現兩個 LRU 鏈表)和 MySQL (劃分兩個區(qū)域)通過改進傳統(tǒng)的 LRU 數據結構,避免了預讀失效帶來的影響。

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

當我們在批量讀取數據的時候,由于數據被訪問了一次,這些大量數據都會被加入到「活躍 LRU 鏈表」里,然后之前緩存在活躍 LRU 鏈表(或者 young 區(qū)域)里的熱點數據全部都被淘汰了,如果這些大量的數據在很長一段時間都不會被訪問的話,那么整個活躍 LRU 鏈表(或者 young 區(qū)域)就被污染了。

緩存污染帶來的問題

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

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

前面的 LRU 算法只要數據被訪問一次,就將數據加入活躍 LRU 鏈表(或者 young 區(qū)域),這種 LRU 算法進入活躍 LRU 鏈表的門檻太低了!正式因為門檻太低,才導致在發(fā)生緩存污染的時候,很容就將原本在活躍 LRU 鏈表里的熱點數據淘汰了。

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

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

Linux 操作系統(tǒng):在內存頁被訪問第二次的時候,才將頁從 inactive list 升級到 active list 里。MySQL Innodb:在內存頁被訪問第二次的時候,并不會馬上將該頁從 old 區(qū)域升級到 young 區(qū)域,因為還要進行停留在 old 區(qū)域的時間判斷:如果第二次的訪問時間與第一次訪問的時間在 1 秒內(默認值),那么該頁就不會被從 old 區(qū)域升級到 young 區(qū)域;如果第二次的訪問時間與第一次訪問的時間超過 1 秒,那么該頁就會從 old 區(qū)域升級到 young 區(qū)域;

關鍵詞:

相關新聞

Copyright 2015-2020   三好網  版權所有 聯系郵箱:435 22 640@qq.com  備案號: 京ICP備2022022245號-21
亚洲精品亚洲人成人网_免费看日韩精品_6080日韩午夜伦伦午夜伦_欧美日韩一区久久_国产精品电影一区_一道本成人在线_日产国产欧美视频一区精品_69视频在线播放_久久久久亚洲蜜桃_亚洲国产你懂的
蜜臀精品一区二区三区在线观看| 亚洲精品日产精品乱码不卡| 9色porny自拍视频一区二区| 欧美高清视频一二三区| 亚洲免费观看高清完整版在线| 奇米777欧美一区二区| 国产精品久久夜| 蜜臂av日日欢夜夜爽一区| 在线播放一区二区三区| 亚洲综合免费观看高清完整版| 成人三级在线视频| 欧美国产成人精品| 99久久久久久| 一个色在线综合| 欧美午夜在线一二页| 欧美成人精品二区三区99精品| 亚洲国产精品久久人人爱蜜臀 | 日本亚洲视频在线| 欧美在线小视频| 亚洲国产成人91porn| 欧美久久免费观看| 人人狠狠综合久久亚洲| 久久亚洲春色中文字幕久久久| 国产美女娇喘av呻吟久久| 国产日韩亚洲欧美综合| 色综合中文综合网| 亚洲欧洲在线观看av| 欧美亚洲尤物久久| 日本免费在线视频不卡一不卡二| 日韩欧美一二三四区| 一区二区三区四区蜜桃| 7777精品伊人久久久大香线蕉经典版下载 | 国产精品初高中害羞小美女文| 91啪亚洲精品| 免费欧美在线视频| 国产精品久久久久久久久图文区| 欧美亚洲禁片免费| 成熟亚洲日本毛茸茸凸凹| 亚洲一区二区三区四区五区黄| 欧美在线看片a免费观看| 精品亚洲成a人在线观看| 亚洲三级电影全部在线观看高清| 欧美一区二区视频观看视频| 国产成人精品在线看| 午夜一区二区三区视频| 国产偷国产偷精品高清尤物 | 欧美一级视频精品观看| 色哟哟一区二区三区| 国产传媒日韩欧美成人| 蜜臀av性久久久久蜜臀av麻豆| 国产精品美女久久久久久| 日韩精品在线一区二区| 成人av资源站| 福利一区福利二区| 精品一区二区久久| 久久丁香综合五月国产三级网站| 亚洲欧美色图小说| 国产精品国产自产拍高清av| 久久综合九色综合97婷婷女人 | 国产高清在线精品| 国产真实精品久久二三区| 欧美aaa在线| 香蕉加勒比综合久久| 一区二区欧美精品| 亚洲第一综合色| 亚洲伊人色欲综合网| 亚洲制服丝袜av| 亚洲高清免费观看| 免费不卡在线视频| 国产麻豆精品theporn| 亚洲一区在线观看视频| 亚洲精品成a人| 一区二区三区在线免费观看 | 96av麻豆蜜桃一区二区| 欧美色成人综合| 911精品产国品一二三产区| 欧美午夜精品一区二区蜜桃 | 亚洲天堂a在线| 亚洲成人av一区二区| 亚洲国产aⅴ成人精品无吗| 亚洲国产裸拍裸体视频在线观看乱了| 亚洲国产成人va在线观看天堂| 性久久久久久久| 狠狠狠色丁香婷婷综合激情| 99久久综合狠狠综合久久| 欧美在线观看一区二区| 日韩美女视频一区二区在线观看| 久久一区二区三区四区| 一区二区三区精品视频在线| 另类小说欧美激情| 99re66热这里只有精品3直播| 欧美日韩国产高清一区| 欧美日韩国产一级二级| 久久综合久久综合亚洲| 亚洲一卡二卡三卡四卡五卡| 久久国产精品露脸对白| 色婷婷久久综合| 欧美视频一区在线观看| 国产日韩欧美综合一区| 午夜婷婷国产麻豆精品| 99精品黄色片免费大全| 26uuu精品一区二区在线观看| 久久精品一区二区三区不卡| 国产三级欧美三级| 午夜精品123| 色综合天天综合色综合av| 精品国产伦一区二区三区观看方式| 综合色天天鬼久久鬼色| 国产伦精一区二区三区| 4438x亚洲最大成人网| 亚洲色图制服诱惑| 国产91精品久久久久久久网曝门| 欧美日韩1区2区| 亚洲精品乱码久久久久| 成人美女视频在线看| 久久久亚洲综合| 国产精一区二区三区| 久久中文娱乐网| 国产91富婆露脸刺激对白| 国产精品国产三级国产普通话蜜臀| 国产a级毛片一区| 亚洲欧美欧美一区二区三区| 在线亚洲一区二区| 日韩高清在线不卡| 国产亚洲成aⅴ人片在线观看 | 国产精品 日产精品 欧美精品| 久久综合中文字幕| 国产成人免费av在线| 洋洋成人永久网站入口| 91精品婷婷国产综合久久性色| 精品在线一区二区三区| 中文字幕一区二区三区在线不卡| 在线免费观看日本欧美| 免费观看在线色综合| 国产精品欧美久久久久无广告 | 精品美女一区二区| 国产麻豆一精品一av一免费 | 国产91丝袜在线18| 亚洲精品成人精品456| 日韩欧美亚洲国产精品字幕久久久| 丰满白嫩尤物一区二区| 亚洲日本韩国一区| 成人av电影观看| 国产精品私房写真福利视频| 亚洲成人午夜电影| 亚洲精品一区在线观看| 成人在线一区二区三区| 亚洲国产精品天堂| 国产亚洲自拍一区| 欧美日本高清视频在线观看| 国产91富婆露脸刺激对白| 日本系列欧美系列| 亚洲精品乱码久久久久久久久| 日韩欧美国产一区二区三区| jlzzjlzz欧美大全| 国产精品18久久久久久久久| 亚洲二区在线观看| 国产精品国产三级国产普通话99 | 国产在线精品一区二区不卡了| 综合电影一区二区三区 | 欧美一区二区三区色| 一本一本久久a久久精品综合麻豆 一本一道波多野结衣一区二区 | 久久精品噜噜噜成人av农村| 中文字幕一区二区三区蜜月| 欧美一区二区三区公司| 欧美三级日韩三级| 欧美亚洲动漫精品| 色欧美乱欧美15图片| 99久久婷婷国产综合精品| 成人黄色在线视频| 91视频一区二区三区| 91麻豆精品秘密| 91官网在线免费观看| 欧美综合色免费| 在线免费观看一区| 欧美精品一级二级三级| 欧美久久久久久久久久| 日韩欧美国产1| 国产色91在线| 中文字幕中文字幕一区| 亚洲黄色免费网站| 婷婷夜色潮精品综合在线| 美腿丝袜一区二区三区| 久久精品国产99| 国产激情视频一区二区在线观看| caoporm超碰国产精品| 欧洲在线/亚洲| 欧美大片国产精品| 欧美激情中文字幕一区二区| 《视频一区视频二区| 亚洲成人综合视频| 久久不见久久见中文字幕免费| 国产福利一区二区三区| 91丨porny丨蝌蚪视频| 欧美日韩成人综合| 国产亚洲1区2区3区| 亚洲制服丝袜av| 国产成人综合视频| 欧美日韩视频不卡| 中文字幕中文字幕一区|