亚洲 国产精品 日韩-亚洲 激情-亚洲 欧美 91-亚洲 欧美 成人日韩-青青青草视频在线观看-青青青草影院

千鋒教育-做有情懷、有良心、有品質的職業教育機構

手機站
千鋒教育

千鋒學習站 | 隨時隨地免費學

千鋒教育

掃一掃進入千鋒手機站

領取全套視頻
千鋒教育

關注千鋒學習站小程序
隨時隨地免費學習課程

當前位置:首頁  >  技術干貨  > Linux內存中的Cache真的能被回收么?

Linux內存中的Cache真的能被回收么?

來源:千鋒教育
發布人:syq
時間: 2023-01-30 18:15:00 1675073700

  在 Linux 系統中,我們經常用 free 命令來查看系統內存的使用狀態。在一個 RHEL6 的系統上,free 命令的顯示內容大概是這樣一個狀態:

1

  這里的默認顯示單位是 kb,我的服務器是 128G 內存,所以數字顯得比較大。這個命令幾乎是每一個使用過 Linux 的人必會的命令,但越是這樣的命令,似乎真正明白的人越少(我是說比例越少)。一般情況下,對此命令輸出的理解可以分這幾個層次:

  1.不了解。這樣的人的第一反應是:天啊,內存用了好多,70 個多 G,可是我幾乎沒有運行什么大程序啊?為什么會這樣?Linux 好占內存!

  2.自以為很了解。這樣的人一般自習評估過會說:嗯,根據我專業的眼光看出來,內存才用了 17G 左右,還有很多剩余內存可用。buffers/cache 占用的較多,說明系統中有進程曾經讀寫過文件,但是不要緊,這部分內存是當空閑來用的。

  3.真的很了解。這種人的反應反而讓人感覺最不懂 Linux,他們的反應是:free 顯示的是這樣,好吧我知道了。神馬?你問我這些內存夠不夠,我當然不知道啦!我特么怎么知道你程序怎么寫的?

Linux內存中的Cache

  根據目前網絡上技術文檔的內容,我相信絕大多數了解一點 Linux 的人應該處在第二種層次。大家普遍認為,buffers 和 cached 所占用的內存空間是可以在內存壓力較大的時候被釋放當做空閑空間用的。但真的是這樣么?在論證這個題目之前,我們先簡要介紹一下 buffers 和 cached 是什么意思:

  什么是 buffer/cache?

  buffer 和 cache 是兩個在計算機技術中被用濫的名詞,放在不通語境下會有不同的意義。在 Linux 的內存管理中,這里的 buffer 指 Linux 內存的:Buffer cache。這里的 cache 指 Linux 內存中的:Page cache。翻譯成中文可以叫做緩沖區緩存和頁面緩存。在歷史上,它們一個(buffer)被用來當成對 io 設備寫的緩存,而另一個(cache)被用來當作對 io 設備的讀緩存,這里的 io 設備,主要指的是塊設備文件和文件系統上的普通文件。但是現在,它們的意義已經不一樣了。

  在當前的內核中,page cache 顧名思義就是針對內存頁的緩存,說白了就是,如果有內存是以 page 進行分配管理的,都可以使用 page cache 作為其緩存來管理使用。當然,不是所有的內存都是以頁(page)進行管理的,也有很多是針對塊(block)進行管理的,這部分內存使用如果要用到 cache 功能,則都集中到 buffer cache 中來使用。(從這個角度出發,是不是 buffer cache 改名叫做 block cache 更好?)然而,也不是所有塊(block)都有固定長度,系統上塊的長度主要是根據所使用的塊設備決定的,而頁長度在 X86 上無論是 32 位還是 64 位都是 4k。

  明白了這兩套緩存系統的區別,就可以理解它們究竟都可以用來做什么了。

  什么是 page cache

  Page cache 主要用來作為文件系統上的文件數據的緩存來用,尤其是針對當進程對文件有 read/write 操作的時候。如果你仔細想想的話,作為可以映射文件到內存的系統調用:mmap 是不是很自然的也應該用到 page cache?在當前的系統實現里,page cache 也被作為其它文件類型的緩存設備來用,所以事實上 page cache 也負責了大部分的塊設備文件的緩存工作。

  什么是 buffer cache

  Buffer cache 則主要是設計用來在系統對塊設備進行讀寫的時候,對塊進行數據緩存的系統來使用。這意味著某些對塊的操作會使用 buffer cache 進行緩存,比如我們在格式化文件系統的時候。一般情況下兩個緩存系統是一起配合使用的,比如當我們對一個文件進行寫操作的時候,page cache 的內容會被改變,而 buffer cache 則可以用來將 page 標記為不同的緩沖區,并記錄是哪一個緩沖區被修改了。這樣,內核在后續執行臟數據的回寫(writeback)時,就不用將整個 page 寫回,而只需要寫回修改的部分即可。

  如何回收 cache?

  Linux 內核會在內存將要耗盡的時候,觸發內存回收的工作,以便釋放出內存給急需內存的進程使用。一般情況下,這個操作中主要的內存釋放都來自于對 buffer/cache 的釋放。尤其是被使用更多的 cache 空間。既然它主要用來做緩存,只是在內存夠用的時候加快進程對文件的讀寫速度,那么在內存壓力較大的情況下,當然有必要清空釋放 cache,作為 free 空間分給相關進程使用。所以一般情況下,我們認為 buffer/cache 空間可以被釋放,這個理解是正確的。

  但是這種清緩存的工作也并不是沒有成本。理解 cache 是干什么的就可以明白清緩存必須保證 cache 中的數據跟對應文件中的數據一致,才能對 cache 進行釋放。所以伴隨著 cache 清除的行為的,一般都是系統 IO 飆高。因為內核要對比 cache 中的數據和對應硬盤文件上的數據是否一致,如果不一致需要寫回,之后才能回收。

  在系統中除了內存將被耗盡的時候可以清緩存以外,我們還可以使用下面這個文件來人工觸發緩存清除的操作:

2

  方法是:

3

  當然,這個文件可以設置的值分別為 1、2、3。它們所表示的含義為:echo 1 > /proc/sys/vm/drop_caches: 表示清除 pagecache。

  echo 2 > /proc/sys/vm/drop_caches: 表示清除回收 slab 分配器中的對象(包括目錄項緩存和 inode 緩存)。slab 分配器是內核中管理內存的一種機制,其中很多緩存數據實現都是用的 pagecache。

  echo 3 > /proc/sys/vm/drop_caches: 表示清除 pagecache 和 slab 分配器中的緩存對象。

  cache 都能被回收么?

  我們分析了 cache 能被回收的情況,那么有沒有不能被回收的 cache 呢?當然有。我們先來看第一種情況:

  tmpfs

  大家知道 Linux 提供一種 “臨時” 文件系統叫做 tmpfs,它可以將內存的一部分空間拿來當做文件系統使用,使內存空間可以當做目錄文件來用。現在絕大多數 Linux 系統都有一個叫做 / dev/shm 的 tmpfs 目錄,就是這樣一種存在。當然,我們也可以手工創建一個自己的 tmpfs,方法如下:

4

  于是我們就創建了一個新的 tmpfs,空間是 20G,我們可以在 / tmp/tmpfs 中創建一個 20G 以內的文件。如果我們創建的文件實際占用的空間是內存的話,那么這些數據應該占用內存空間的什么部分呢?根據 pagecache 的實現功能可以理解,既然是某種文件系統,那么自然該使用 pagecache 的空間來管理。我們試試是不是這樣?

5

  我們在 tmpfs 目錄下創建了一個 13G 的文件,并通過前后 free 命令的對比發現,cached 增長了 13G,說明這個文件確實放在了內存里并且內核使用的是 cache 作為存儲。再看看我們關心的指標:-/+ buffers/cache 那一行。我們發現,在這種情況下 free 命令仍然提示我們有 110G 內存可用,但是真的有這么多么?我們可以人工觸發內存回收看看現在到底能回收多少內存:

6

  可以看到,cached 占用的空間并沒有像我們想象的那樣完全被釋放,其中 13G 的空間仍然被 / tmp/tmpfs 中的文件占用的。當然,我的系統中還有其他不可釋放的 cache 占用著其余 16G 內存空間。那么 tmpfs 占用的 cache 空間什么時候會被釋放呢?是在其文件被刪除的時候. 如果不刪除文件,無論內存耗盡到什么程度,內核都不會自動幫你把 tmpfs 中的文件刪除來釋放 cache 空間。

7

  這是我們分析的第一種 cache 不能被回收的情況。還有其他情況,比如:

  共享內存

  共享內存是系統提供給我們的一種常用的進程間通信(IPC)方式,但是這種通信方式不能在 shell 中申請和使用,所以我們需要一個簡單的測試程序,代碼如下:

  程序功能很簡單,就是申請一段不到 2G 共享內存,然后打開一個子進程對這段共享內存做一個初始化操作,父進程等子進程初始化完之后輸出一下共享內存的內容,然后退出。但是退出之前并沒有刪除這段共享內存。我們來看看這個程序執行前后的內存使用:

  結果是仍然不可回收。大家可以觀察到,這段共享內存即使沒人使用,仍然會長期存放在 cache 中,直到其被刪除。刪除方法有兩種,一種是程序中使用 shmctl() 去 IPC_RMID,另一種是使用 ipcrm 命令。我們來刪除試試:

9

  刪除共享內存后,cache 被正常釋放了。這個行為與 tmpfs 的邏輯類似。內核底層在實現共享內存(shm)、消息隊列(msg)和信號量數組(sem)這些 POSIX:XSI 的 IPC 機制的內存存儲時,使用的都是 tmpfs。這也是為什么共享內存的操作邏輯與 tmpfs 類似的原因。當然,一般情況下是 shm 占用的內存更多,所以我們在此重點強調共享內存的使用。說到共享內存,Linux 還給我們提供了另外一種共享內存的方法,就是:

  mmap

  mmap() 是一個非常重要的系統調用,這僅從 mmap 本身的功能描述上是看不出來的。從字面上看,mmap 就是將一個文件映射進進程的虛擬內存地址,之后就可以通過操作內存的方式對文件的內容進行操作。但是實際上這個調用的用途是很廣泛的。當 malloc 申請內存時,小段內存內核使用 sbrk 處理,而大段內存就會使用 mmap。當系統調用 exec 族函數執行時,因為其本質上是將一個可執行文件加載到內存執行,所以內核很自然的就可以使用 mmap 方式進行處理。我們在此僅僅考慮一種情況,就是使用 mmap 進行共享內存的申請時,會不會跟 shmget() 一樣也使用 cache?

  同樣,我們也需要一個簡單的測試程序:

10

  這次我們干脆不用什么父子進程的方式了,就一個進程,申請一段 2G 的 mmap 共享內存,然后初始化這段空間之后等待 100 秒,再解除影射所以我們需要在它 sleep 這 100 秒內檢查我們的系統內存使用,看看它用的是什么空間?當然在這之前要先創建一個 2G 的文件./mmapfile。結果如下:

11

  然后執行測試程序:

12

  我們可以看到,在程序執行期間,cached 一直為 18G,比之前漲了 2G,并且此時這段 cache 仍然無法被回收。然后我們等待 100 秒之后程序結束。

13

  程序退出之后,cached 占用的空間被釋放。這樣我們可以看到,使用 mmap 申請標志狀態為 MAP_SHARED 的內存,內核也是使用的 cache 進行存儲的。在進程對相關內存沒有釋放之前,這段 cache 也是不能被正常釋放的。實際上,mmap 的 MAP_SHARED 方式申請的內存,在內核中也是由 tmpfs 實現的。由此我們也可以推測,由于共享庫的只讀部分在內存中都是以 mmap 的 MAP_SHARED 方式進行管理,實際上它們也都是要占用 cache 且無法被釋放的。

  最后

  我們通過三個測試例子,發現 Linux 系統內存中的 cache 并不是在所有情況下都能被釋放當做空閑空間用的。并且也也明確了,即使可以釋放 cache,也并不是對系統來說沒有成本的。總結一下要點,我們應該記得這樣幾點:

  1.當 cache 作為文件緩存被釋放的時候會引發 IO 變高,這是 cache 加快文件訪問速度所要付出的成本。

  2.tmpfs 中存儲的文件會占用 cache 空間,除非文件刪除否則這個 cache 不會被自動釋放。

  3.使用 shmget 方式申請的共享內存會占用 cache 空間,除非共享內存被 ipcrm 或者使用 shmctl 去 IPC_RMID,否則相關的 cache 空間都不會被自動釋放。

  4.使用 mmap 方法申請的 MAP_SHARED 標志的內存會占用 cache 空間,除非進程將這段內存 munmap,否則相關的 cache 空間都不會被自動釋放。

  5.實際上 shmget、mmap 的共享內存,在內核層都是通過 tmpfs 實現的,tmpfs 實現的存儲用的都是 cache。

  當理解了這些的時候,希望大家對 free 命令的理解可以達到我們說的第三個層次。我們應該明白,內存的使用并不是簡單的概念,cache 也并不是真的可以當成空閑空間用的。如果我們要真正深刻理解你的系統上的內存到底使用的是否合理,是需要理解清楚很多更細節知識,并且對相關業務的實現做更細節判斷的。我們當前實驗場景是 Centos 6 的環境,不同版本的 Linux 的 free 現實的狀態可能不一樣,大家可以自己去找出不同的原因。

  當然,本文所述的也不是所有的 cache 不能被釋放的情形。那么,在你的應用場景下,還有那些 cache 不能被釋放的場景呢?

tags:
聲明:本站稿件版權均屬千鋒教育所有,未經許可不得擅自轉載。
10年以上業內強師集結,手把手帶你蛻變精英
請您保持通訊暢通,專屬學習老師24小時內將與您1V1溝通
免費領取
今日已有369人領取成功
劉同學 138****2860 剛剛成功領取
王同學 131****2015 剛剛成功領取
張同學 133****4652 剛剛成功領取
李同學 135****8607 剛剛成功領取
楊同學 132****5667 剛剛成功領取
岳同學 134****6652 剛剛成功領取
梁同學 157****2950 剛剛成功領取
劉同學 189****1015 剛剛成功領取
張同學 155****4678 剛剛成功領取
鄒同學 139****2907 剛剛成功領取
董同學 138****2867 剛剛成功領取
周同學 136****3602 剛剛成功領取
相關推薦HOT
久久精品国产精品亚洲毛片| 国产乱子伦农村XXXX| 永久看一二三四线| 内谢XXXXX8老| 久久青草免费福利资源站| 狠狠色综合TV久久久久久| 国产精品露脸视频观看| 乖别添了快放进来我想要| 成人无码午夜在线观看| 边做边爱免费视频| 啊灬啊灬啊灬快高潮了网站| www.av无码| CHINESE农村野外XXXXVIDEOS| 77777_亚洲午夜久久多人| 中文乱码在线中文字幕中文乱码 | 国产精品无码AV一区二区三区| 丰满熟妇岳AV无码区HD| 国产高清在线精品一区二区三区| 亚洲午夜国产成人AV电影| 亚洲超星团在哪个平台播| 2019理论韩国理论中文| 亚洲国产午夜精品理论片| 小怡的暴露耻辱系列小说| 无码AⅤ精品一区二区三区| 天堂АⅤ在线最新版在线| 少妇被黑人到高潮喷白浆| 深灬深灬深灬深灬一点| 天堂8А√中文在线官网| 我故意没有穿内裤坐公车让| 亚洲熟妇AV一区二区三区浪潮| 亚洲一区二区三区中文字幕在线| JAPANESE极品少妇| ンピースのエロス在线WWW| 国产乱理伦片在线观看夜| 国模GOGO无码人体啪啪| 精品国产亚洲AV麻豆映画| 久久精品中文字幕| 麻豆国产MV视频| 欧美激情国产精品视频一区| 人妻无码久久中文字幕专区| 色欲av无码一区二区人妻精油| 我的娇妻QUEEN| 正在播放老肥熟妇露脸| YSL千人千色8610| 高潮好爽视频在线观看| 国产免费福利在线视频| YY4480高清影院播放器| 国产一区二区三区水蜜桃| 出轨 无码 论坛| 丰满白嫩大屁股ASS| 久久se精品一区二区| 久久一本精品久久精品66| 蜜臀久久AV无码牛牛影视 | 极品人妻系列人妻30P| 久久久WWW免费人成精品| 日韩在线观看视频一区二区| 午夜国产精品一二三区无码小说| 亚洲精品无码成人片在线观看 | 成人A级毛片免费观看| 国产精品扒开腿做爽爽爽| 黑人巨大JEEP日本人| 人人妻人人做人人爽| 西方37大但人文艺术任汾A级| 亚洲国产成人精品青青草原| 中文精品久久久久人妻| 国产亚洲精品第一综合| 两人做人爱视频在线观看| 人人妻人人爽人人添少妇| 亚洲制服丝袜中文字幕在线| 啊灬啊灬啊灬高潮了视频| 久久久久久九九99精品| 日本一区二区三区久久久久久久久| 西方最大但人文艺术| 边吃奶边扎下面动态| 没有被爱过的女人| 色天使色偷偷色噜噜噜AV天堂| 亚洲AV实录无码成人精品电影| 中文无码AV一区二区三区| 国精产品一区二区三区有限公司| 日韩少妇人妻夜夜爽| 亚洲欧美xxxx| 成人区人妻精品一区二区不卡网站 | 波多野结衣AV无码| 男人GAY自慰吞精网站| 铜铜铜铜铜铜铜铜铜好多水| 亚洲一区二区无码成人AV| 国产手机AV片在线无码观你| 民工把我奶头掏出来了怎么办| 丝袜老师办公室里做好紧好爽 | JEALOUSVUE成熟五十| 快拨出去我是你老师啊作文| 色偷偷888欧美精品久久久| AV在线亚洲男人的天堂| 国产偷V国产偷V亚洲高清| 涩反差合集91综合一区二区清纯 | 真人无码作爱免费视频| 精品久久久无码中字| 人妻在夫面前被性爆| 50多岁岳不让我戴套| 国产乱码1卡二卡3卡四卡| 色欲av伊人久久大香线蕉影院| 白嫖B站激活码2023| 精品国产AV无码专区亚洲AV | 日韩AV无码免费播放| 亚洲熟妇另类久久久久久| 国产午夜成人无码免费| 午夜DJ在线观看免费完整版社区 | 波多野结衣中文字幕一区二区三区| 男生女生一起相差差差差| 中文乱码人妻系列一区二区| 久久亚洲精品中文字幕| 影音先锋AV天堂| 撩起老师旗袍挺进去玉足| 曰韩无码无遮挡A级毛片| 国产精品成人3p一区二区三区| 日韩人妻无码免费视频一区二区三| JAVA强行VIDEOS| 人妻少妇精品无码专区APP| 亚洲一区二区精品无码色欲Av | 国产精品成人久久电影| 脱了老师内裤猛烈进入的软件| 国产成人啪精品视频免费APP| 女人浓毛巨茎ⅩXXOOO毛绒绒| 亚洲AV无码精品色午夜蛋壳| 边摸边吃奶又黄又激烈视频| 人妻在线无码一区二区三区| 成 人色 网 站 欧美大片在线| 老湿机69福利区无码| 在办公室里揉弄小雪好爽| 国产在线精品二区| 亚洲AV无码久久寂寞少妇| 激情综合亚洲色婷婷五月APP | 乱人伦XXXX国语对白| 在线天堂免费观看.WWW| 女人大荫蒂毛茸茸视频| PETEDAVIDSON鸟多长| 日韩精品东京热无码视频 | 天天摸天天碰天天添| 国产欧美国产综合每日更新| 日韩无码2021| 国产精品99久久精品爆乳| 亚洲AV日韩AⅤ无码| 精品无码国产日韩制服丝袜| 我和公发生了性关系视频| 国产午夜无码视频在线观看| 亚洲欧洲中文日韩久久AV乱码| 国产精品无码MV在线观看| 亚洲MV砖码砖区2021在线| 国产成人无码综合亚洲日韩| 亚洲 中文字幕 日韩 无码 | 熟妇人妻av无码一区二区三区 | 高清国产AV一区二区三区| 无码中文精品专区一区二区 | 日本伊人精品一区二区三区| 国产精品久久久天天影视香蕉| 亚洲VA久久久噜噜噜熟女8| 久久久久久久性潮| 97porm国内自拍视频| 少妇被躁爽到高潮无码人狍大战| 国产一区日韩二区欧美三区| 一区二区三区国产亚洲网站| 久久精品国产亚洲AV大全| 18禁高潮出水呻吟娇喘蜜芽| 日本少妇人妻XXXXⅩ18| 国产精品亚洲精品日韩动图| 亚洲色欲啪啪久久WWW综合网| 男人边吃奶边挵进去呻吟动态图| 成人免费A级毛片无码片2022| 无人区一码二码三码四码区别在哪 | 波多野结衣AV电影在线观看| 无码人妻一区二区三区免费看| 国产超碰AV人人做人人爽| 色橹橹欧美在线观看视频高清| 国产偷国产偷亚洲高清人| 一级伦奷片高潮无码看了5| 人妻仑乱A级毛片免费看| 国产精品内射后入合集| 又大又粗又爽A级毛片免费看| 日本中文字幕一区二区高清在线 | 啊灬啊灬快灬高潮了视频| 无码熟妇人妻AV影音先锋| 老熟女露脸内射正在播放| 成人毛片100免费观看| 亚洲成A人片在线观看国产| 女人被弄到高潮的免费视频APP| 国产成人精品人人做人人爽 | 成人毛片100部免费看| 亚洲第一最快AV网站| 欧美性猛交XXX嘿人猛交| 啊!摁摁~啊!用力~快点视频| 性FREE毛茸茸VIDEOS| 免费热播女人毛片| 51精品国产人成在线观看| 天天澡天天添天天摸97影院| 久久久久人妻一区二区三区VR| 永久免费的AV在线网无码| 少妇高潮XXXⅩ白浆699| 久久中文字幕AV一区二区不卡| 国产98色在线 | 国| 中国毛茸茸性XXXX|