日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > linux >内容正文

linux

Linux的Page Cache

發(fā)布時(shí)間:2025/3/15 linux 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux的Page Cache 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1. Page Cache

何為Page Cache

為了了解Page Cache我們可以看一下Linux的文件I/O系統(tǒng)

從圖中可以看出,Page Cache是由Linux內(nèi)核進(jìn)行管理的,而且通過(guò)mmap以及bffered I/O將文件讀取到內(nèi)存空間實(shí)際上都是讀取到Page Cache上的。

如何查看系統(tǒng)的Page Cache?

通過(guò)讀取cat /proc/meminfo文件,查看系統(tǒng)實(shí)時(shí)內(nèi)存情況。

... Buffers: 117572 kB Cached: 2738632 kB SwapCached: 14560 kB Active: 1444220 kB Inactive: 5806180 kB Active(anon): 509816 kB Inactive(anon): 4946608 kB Active(file): 934404 kB Inactive(file): 859572 kB ... Shmem: 1062864 kB ... Buffers + Cached + SwapCached = Active(file) + Inactive(file) + Shmem + SwapCached

上述等式兩邊都是Page Cache

Page Cache = Buffers + Cached + SwapCached
  • Page 于Page Cache

  • Page 是內(nèi)存管理分配的基本單位,Page Cache是由多個(gè)Page所構(gòu)成的。Page在操作系統(tǒng)中通常都是為4KB大小,Page Cache的大小為4KB的整數(shù)倍。

    另外一方面,并不是所有的Page都被認(rèn)為是Page Cache

    Linux系統(tǒng)中可供訪問(wèn)的兩種內(nèi)存:

    • File-backed pages:文件備份頁(yè)也就是Page Cache中的Page,對(duì)應(yīng)于磁盤上的若干數(shù)據(jù)塊;對(duì)于這些頁(yè)最大的問(wèn)題是臟數(shù)據(jù)回盤;
    • Anonymous pages: 不對(duì)應(yīng)磁盤上的任何數(shù)據(jù)塊,也就是晉城運(yùn)行時(shí)的內(nèi)存空間(例如:方法棧、局部變量表等屬性)

    為啥不直接將Page Cache稱為block cache

  • 從磁盤中加載的數(shù)據(jù),不僅僅放在Page Cache中,還會(huì)放在Bufer cache。
  • 例如:通過(guò)Direct I/O技術(shù)的磁盤文件就可以不進(jìn)入Page Cache中。
  • 歷史設(shè)計(jì)原因,隨著linux的演進(jìn)也逐漸不同
  • 對(duì)比一下file-backed pages和Anonymous pages在swap機(jī)制下的性能

    內(nèi)存是一種珍惜資源,當(dāng)內(nèi)存不夠用的時(shí)候,內(nèi)存管理單元MMU(memory Managment Unit)需要提供調(diào)度算法回收相關(guān)的內(nèi)存空間。內(nèi)存空間揮手的方式通常就是swap機(jī)制,將內(nèi)存中的數(shù)據(jù)交換到持久化設(shè)設(shè)備上的過(guò)程。

    File-backed pages(Page Cache)的回收代價(jià)比較低,因?yàn)?#xff1a;

    • Page Cache通常對(duì)應(yīng)于一個(gè)文件上的若干順序塊,因此我們?cè)谶M(jìn)行持久化落盤可以通過(guò)順序I/O的方式進(jìn)行落盤。
    • 如果Page Cache上沒(méi)有進(jìn)行任何的寫操作(也就是沒(méi)有任何的臟頁(yè)),甚至Linux系統(tǒng)不會(huì)將Page Cache進(jìn)行回盤,想要獲取新的內(nèi)容完全可以通過(guò)再次讀取磁盤中的文件即可。

    Page Cahe主要難點(diǎn)在于臟頁(yè)回盤(后面進(jìn)行說(shuō)明)

    Anonymous pages內(nèi)存回收代價(jià)是比較高的。這時(shí)因?yàn)锳nonymous pages通常隨機(jī)地寫入持久化設(shè)備。另外一方面,無(wú)論是否有寫操作,為了確保數(shù)據(jù)不丟失,Anonymous pages在進(jìn)行swap時(shí)必須持久化到磁盤上。

    swap與缺頁(yè)中斷

    swap機(jī)制是指物理內(nèi)存不夠用的時(shí)候,內(nèi)存管理單元MMU(memory Managment Unit)需要提供調(diào)度算法來(lái)回收相關(guān)的內(nèi)存空間,然后將清理出來(lái)的內(nèi)存空間給當(dāng)前的內(nèi)存申請(qǐng)方。

    swap機(jī)制存在的原因是Linux系統(tǒng)提供了虛擬內(nèi)存管理機(jī)制,每個(gè)一個(gè)進(jìn)程都認(rèn)為其獨(dú)占內(nèi)存空間,因此所有的進(jìn)程的內(nèi)存空間之和遠(yuǎn)遠(yuǎn)大于物理內(nèi)存,所有進(jìn)程的內(nèi)存空間之和超過(guò)物理內(nèi)存的分部分需要交換到磁盤上。

    操作系統(tǒng)以page為單位管理內(nèi)存,當(dāng)進(jìn)程發(fā)現(xiàn)需要訪問(wèn)的數(shù)據(jù)不再內(nèi)存時(shí),操作系統(tǒng)可能會(huì)將數(shù)據(jù)以頁(yè)的方式加載到內(nèi)存中。上述的整個(gè)過(guò)程被稱之為缺頁(yè)中斷,當(dāng)操作系統(tǒng)發(fā)生缺頁(yè)中斷時(shí),就會(huì)通過(guò)系統(tǒng)調(diào)用將page再次讀取到內(nèi)存中。

    但主內(nèi)存的空間是有限的,當(dāng)主內(nèi)存中不包含可以使用的空間時(shí),操作系統(tǒng)會(huì)從內(nèi)存中選擇合適的內(nèi)存頁(yè)驅(qū)逐回磁盤,為新的內(nèi)存頁(yè)讓出位置,選擇待驅(qū)逐頁(yè)的過(guò)程在操作系統(tǒng)中叫做頁(yè)面替換(page replacement),替換操作又會(huì)觸發(fā)swap機(jī)制。

    如果物理內(nèi)存足夠大,那么可能不需要 Swap 機(jī)制,但是 Swap 在這種情況下還是有一定優(yōu)勢(shì):對(duì)于有發(fā)生內(nèi)存泄漏幾率的應(yīng)用程序(進(jìn)程),Swap 交換分區(qū)更是重要,這可以確保內(nèi)存泄露不至于導(dǎo)致物理內(nèi)存不夠用,最終導(dǎo)致系統(tǒng)崩潰。但內(nèi)存泄露會(huì)引起頻繁的 swap,此時(shí)非常影響操作系統(tǒng)的性能。

    Linux可以通過(guò)swappiness參數(shù)控制swap機(jī)制,范圍[0-100],實(shí)現(xiàn)控制swap的優(yōu)先級(jí):

    • 高數(shù)值:較高頻率的swap,在進(jìn)程不活躍時(shí)主動(dòng)將其轉(zhuǎn)換出物理內(nèi)存
    • 低數(shù)值:較低頻率的swap,這可以確保交互式不因?yàn)閮?nèi)存空間頻繁的=地交換到磁盤而提高響應(yīng)延遲。

    為什么buffers也是Page Cache的一部分

    這是因?yàn)楫?dāng)匿名頁(yè)(Inactive(anon) 以及 Active(anon))先被交換(swap out)到磁盤上后,然后再加載回(swap in)內(nèi)存中,由于讀入到內(nèi)存后原來(lái)的 Swap File 還在,所以 SwapCached 也可以認(rèn)為是 File-backed page,即屬于 Page Cache。這個(gè)過(guò)程如 Figure 2 所示。

    老一點(diǎn)的系統(tǒng)

    ~ free -mtotal used free shared buffers cached Mem: 128956 96440 32515 0 5368 39900 -/+ buffers/cache: 51172 77784 Swap: 16002 0 16001

    Cached 表示當(dāng)前的頁(yè)緩存(Page Cache)占用量,buffers表示的是當(dāng)前塊緩存(buffer Cache)占用量。

    Page Cache : 用于緩存文件的頁(yè)數(shù)據(jù)

    buffer Cache: 用于緩存塊設(shè)備如磁盤的塊數(shù)據(jù)

    新系統(tǒng)

    andrew@andrew-G3-3590:~$ free -m總計(jì) 已用 空閑 共享 緩沖/緩存 可用 內(nèi)存: 7789 3190 627 1111 3970 3212 交換: 2047 1 2046

    通過(guò)上述描述,我們可以 知道Page Cache與文件系統(tǒng)同級(jí)別的,buffer Cache是塊物理上的概念,因此buffer Cache是與塊設(shè)備驅(qū)動(dòng)程序是同級(jí)別的。

    Page Cache與buffer Cache共同的目的就是為了加速數(shù)據(jù)I/O: 寫數(shù)據(jù)時(shí)首先要寫到緩存,將寫入的數(shù)據(jù)標(biāo)記為dirty,想外部存儲(chǔ)flash(簡(jiǎn)稱回盤)。如果讀取數(shù)據(jù)我們會(huì)先去緩存中讀取,如果在緩存中未命中,我們?cè)偃ネ獠看鎯?chǔ)中去讀取,并將讀取出來(lái)的數(shù)據(jù)加入到緩存中,并且操作系統(tǒng)總是積極的將所有的空閑內(nèi)存都用作Page Cache和buffer Cache,當(dāng)內(nèi)存不夠用時(shí)也會(huì)使用LRU等算法淘汰緩存。

    Linux2.4之前,Page Cache與buffer Cache是完全分離的,但是塊設(shè)備通常是磁盤,磁盤上的數(shù)據(jù)又大多通過(guò)文件系統(tǒng)來(lái)組織,這種設(shè)計(jì)方式會(huì)導(dǎo)致很多數(shù)據(jù)被緩存了兩次。在LInux系統(tǒng)2.5版本之后,系統(tǒng)將兩個(gè)快近似的融合在了一起,如果一個(gè)文件的頁(yè)加載到了Page Cache,那么同時(shí)Buffer Cache只需要維護(hù)塊指向頁(yè)的指針就可以了。只有那些沒(méi)有文件表示的塊,或者繞過(guò)文件系統(tǒng)直接操作(dd命令)的塊,才會(huì)真正的放到Buffer Cache里。后文所說(shuō)的Page Cache基本上是Page Cache與buffer Cache的統(tǒng)稱。

    Page Cache的預(yù)讀

    操作系統(tǒng)會(huì)為基于Page Cache的讀緩存機(jī)制提供預(yù)讀機(jī)制(PAGE_READAHEAD)

    舉個(gè)例子:用戶想通過(guò)系統(tǒng)調(diào)用獲取磁盤上文件的一段數(shù)據(jù)

    • 用戶線程僅僅想讀取磁盤上對(duì)應(yīng)文件的0-3KB范圍內(nèi)的數(shù)據(jù),由于磁盤的基本讀寫單位是block(4KB),于是操作系統(tǒng)會(huì)至少讀取4KB的內(nèi)容,這4KB剛好能夠在一個(gè)Page中裝下。
    • 由于操作系統(tǒng)出于局部最優(yōu)原理,會(huì)將磁盤塊offset[4,8],[9,12]以及[1316]都加載到內(nèi)存

    經(jīng)過(guò)上述操作,我們只是想通過(guò)read讀取4KB的內(nèi)容,但是系統(tǒng)預(yù)讀取了16KB的內(nèi)容。

    2. Page Cache與文件持久化的一致性&可靠性

    現(xiàn)在LInux的Page Cache正如其名,是對(duì)磁盤上Page的內(nèi)存緩存,同時(shí)可以用于讀寫操作。任何系統(tǒng)引入緩存,就會(huì)引發(fā)一致性問(wèn)題:內(nèi)存中的數(shù)據(jù)與磁盤中的數(shù)據(jù)不一致,例如后端常見(jiàn)的Redis緩存和MySQL數(shù)據(jù)庫(kù)的一致性問(wèn)題

    吞吐量與數(shù)據(jù)一致性是一對(duì)不可調(diào)和的矛盾(硬件一致的情況下)

    什么是文件

    文件其實(shí)是數(shù)據(jù)和元數(shù)據(jù)的組合,文件=數(shù)據(jù)+元數(shù)據(jù)。

    元數(shù)據(jù):用來(lái)描述文件的各種屬性,元數(shù)據(jù)也必須存儲(chǔ)在磁盤上

    因此,我們?cè)诒WC數(shù)據(jù)一致性的時(shí)候其實(shí)包含了兩個(gè)方面:數(shù)據(jù)一致+元數(shù)據(jù)一致

    # drwxr-xr-x 5 andrew andrew 4096 4月 24 16:43 snap # 元數(shù)據(jù)包含的內(nèi)容 # 1. 文件的大小 # 2. 創(chuàng)建時(shí)間 # 3. 訪問(wèn)的時(shí)間 # 4. 屬主和屬組等信息 # 5. 屬主權(quán)限信息

    文件一致性

    發(fā)生寫操作的時(shí)候,我們會(huì)把對(duì)應(yīng)的數(shù)據(jù)寫到Page Cache中,如果此時(shí)數(shù)據(jù)還沒(méi)有刷新到磁盤中,那么內(nèi)存中的數(shù)據(jù)就領(lǐng)先于磁盤,此時(shí)Page就被稱為Dirty page。

    當(dāng)前的lInux有兩種方式實(shí)現(xiàn)文件一致性:

  • 寫穿(write through): 內(nèi)核向用戶提供一種接口,通過(guò)該接口操作文件可以保證文件一致性
  • 寫回(write back): 系統(tǒng)提供定時(shí)任務(wù),該任務(wù)周期性同步文件系統(tǒng)臟數(shù)據(jù),這時(shí)Linux的默認(rèn)同步方案。
  • 方法含義
    fsync(int fd)將fd代表的文件的臟數(shù)據(jù)和臟元數(shù)據(jù)刷新到磁盤中
    fdatasync(int fd)將fd代表的文件的臟數(shù)據(jù)刷新到磁盤,同時(shí)對(duì)必要的元數(shù)據(jù)刷新到磁盤,必要信息是指對(duì)文件有關(guān)鍵作用的信息。文件大小、文件修改時(shí)間就不屬于必要信息了。
    sync()對(duì)系統(tǒng)中的所有臟數(shù)據(jù)和臟元數(shù)據(jù)刷新到磁盤中

    3. Page Cache的優(yōu)勢(shì)與劣勢(shì)

    優(yōu)勢(shì)

  • 加快對(duì)數(shù)據(jù)的訪問(wèn)
  • 減少磁盤I/O的訪問(wèn)次數(shù),提高系統(tǒng)磁盤壽命
  • 減少對(duì)磁盤I/O的訪問(wèn),提高系統(tǒng)磁盤I/O吞吐量(Page Cache的預(yù)讀機(jī)制)
  • 劣勢(shì)

  • 使用額外的物理內(nèi)存空間,當(dāng)物理內(nèi)存比較緊俏的時(shí)候,可能會(huì)導(dǎo)致頻繁的swap操作,最終會(huì)導(dǎo)致系統(tǒng)的磁盤I/O負(fù)載上升。
  • Page Cache沒(méi)有給應(yīng)用層提供一個(gè)很好的API。導(dǎo)致應(yīng)用層想要優(yōu)化Page Cache的使用策略很難。因此一些應(yīng)用實(shí)現(xiàn)了自己的Page管理,比如MySQL的InnoDB存儲(chǔ)引擎以16KB的頁(yè)進(jìn)行管理。
  • 在某些應(yīng)用場(chǎng)景下,比如我們每次打開(kāi)文件只需要讀取或者寫入幾個(gè)字節(jié)的情況,會(huì)比Direct I/O多一些磁盤的讀取于寫入。
  • 參考:

    《Linux內(nèi)核詳解》

    視頻教程

    Linux I/O - Page Cache詳解(一)

    Linux I/O - Page Cache詳解(二)

    Linux I/O - Page Cache詳解(三)

    Linux I/O - Page Cache詳解(四)

    飛書(shū)加入團(tuán)隊(duì)一起創(chuàng)作:
    Linux的Page Cache
    https://ny5odfilnr.feishu.cn/docs/doccn0dfIAin7tGfryiXo6wFTmg

    關(guān)注公眾號(hào),一起探討學(xué)習(xí):

    總結(jié)

    以上是生活随笔為你收集整理的Linux的Page Cache的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。