<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Linux 內(nèi)存中的緩沖區(qū)(Buffer)與緩存(Cache)

          共 2568字,需瀏覽 6分鐘

           ·

          2022-05-14 19:59

          BufferCache 的定義:

          • Buffer:是原始磁盤塊的臨時存儲,即將緩存數(shù)據(jù)寫入磁盤。它通常不會很大(大約 ?20MB)。這樣,內(nèi)核就可以將分散的寫入集中起來,從而對磁盤寫入進行統(tǒng)一優(yōu)化。例如,多個小的寫入可以合并為一個大的寫入等。

          • Cache:是用于從磁盤讀取文件的頁面緩存,用于緩存從文件中讀取的數(shù)據(jù)。這樣,下次訪問這些文件數(shù)據(jù)時,可以直接從內(nèi)存中快速取回,而無需再次訪問緩慢的磁盤。

          但是讓我問你,由于 Buffer 只是將寫入磁盤的數(shù)據(jù)的緩存。反過來,它還會緩存從磁盤讀取的數(shù)據(jù)嗎?或者 Cache 是從文件中讀取數(shù)據(jù)的緩存,那么它是否也為寫入文件緩存數(shù)據(jù)呢?

          如果你能回答以上兩個問題,你可以跳過這篇文章,我想你已經(jīng)對 BufferCache 有了很好的理解。但如果你不能,請留下來看看我的進一步解釋。

          free 命令

          要檢查系統(tǒng)內(nèi)存使用情況,您想到的第一個命令可能是 free ,例如:

          $?free?-h
          ??????????????total????????used????????free??????shared??buff/cache???available
          Mem:???????????1.9G????????1.0G????????394M????????2.6M????????491M????????728M
          Swap:????????????0B??????????0B??????????0B

          很明顯,該輸出包括了物理內(nèi)存 MemSwap 的具體使用情況(如總內(nèi)存、已用內(nèi)存、緩存、可用內(nèi)存等)。緩存是 BufferCache 兩部分的總和。

          讓我們看一下 free 的手冊頁中的 ?BufferCache 定義:

          buffers
          ??????????????Memory?used?by?kernel?buffers?(Buffers?in?/proc/meminfo)
          cache?????????Memory?used?by?the?page?cache?and?slabs?(Cached?and?SReclaimable?in?/proc/meminfo)
          buff/cache
          ??????????????Sum?of?buffers?and?cache

          我們可以看到 free 命令的源數(shù)據(jù)實際上存儲在 proc/meminfo 文件中。正如我前面提到的,/proc 是 Linux 內(nèi)核提供的一個特殊的文件系統(tǒng),它就像一個用戶與內(nèi)核交互的接口。

          /proc 文件系統(tǒng)也是許多性能工具的最終數(shù)據(jù)源。在 man proc 中,BuffersCached 的定義如下:

          Buffers?%lu
          ????Relatively?temporary?storage?for?raw?disk?blocks?that?shouldn't?get?tremendously?large?(20MB?or?so).
          Cached?%lu
          ???In-memory?cache?for?files?read?from?the?disk?(the?page?cache).??Doesn'
          t?include?SwapCached.
          ...
          SReclaimable?%lu?(since?Linux?2.6.19)
          ????Part?of?Slab,?that?might?be?reclaimed,?such?as?caches.
          ????
          SUnreclaim?%lu?(since?Linux?2.6.19)
          ????Part?of?Slab,?that?cannot?be?reclaimed?on?memory?pressure.

          至此,您可能認為您已經(jīng)找到了我的問題的答案,“Buffer”只是用于將數(shù)據(jù)寫入磁盤的緩存,“Cache”只是用于從文件中讀取數(shù)據(jù)的緩存。但事實上,“Buffer”也可以用于讀取,“Cache”也可以用于寫入。

          實驗

          我們將在這里做兩個實驗,寫緩存和讀緩存。

          寫入 Cache

          讓我們登錄到我們的 Linux 主機并準備好兩個終端。在終端 1,讓我們先清理緩存

          這里 /proc/sys/vm/drop_caches 是一個通過 proc 文件系統(tǒng)修改內(nèi)核行為的例子。寫入 3 意味著清理各種緩存,例如文件頁、目錄條目和 Inode。

          仍然在終端 1,讓我們開啟 vmstat 2 命令:

          • buffcache 就是我們前面看到的 BufferCache,單位是 KB。
          • bibo 分別表示塊設(shè)備讀取和寫入的大小,以塊/s 為單位。由于 Linux 中的塊大小為 1KB,因此這個單位相當于 KB/s。

          接下來,轉(zhuǎn)移到終端 2 并運行以下命令:

          現(xiàn)在切換回終端 1,并觀察 buffcache 的變化:

          通過觀察 vmstat 的輸出,我們發(fā)現(xiàn)運行 dd 命令時,Cache 一直在增長,而 Buffer 基本沒有變化。

          讀取 Buffer

          現(xiàn)在,讓我們做第二個實驗。再次清除終端 1中的緩存

          同樣在終端 1 中,再次啟動 vmstat 2 命令:

          您可以看到此時 buff0?,F(xiàn)在在終端 2 中,運行以下命令:

          然后,回到終端 1 觀察:

          觀察 vmstat 的輸出,你會發(fā)現(xiàn)在讀盤的時候(也就是 bi > 0 的時候),BufferCache 都在增長,但是顯然 Buffer 的增長要快很多。這意味著當從磁盤讀取時,數(shù)據(jù)被緩存在 Buffer 中。

          現(xiàn)在我們幾乎可以得出結(jié)論:

          讀取文件時數(shù)據(jù)會緩存在 Cache 中,讀取磁盤時數(shù)據(jù)會緩存在 Buffer 中。

          結(jié)論

          在這里您應(yīng)該會發(fā)現(xiàn),雖然本文對 BufferCache 進行了描述,但仍然無法涵蓋所有細節(jié)。我們?nèi)缃駥W到了以下兩點:

          • Buffer:既可以用作“要寫入磁盤的數(shù)據(jù)緩存”,也可以用作“讀取磁盤讀的數(shù)據(jù)緩存”。
          • Cache:既可以用作“從讀取文件的頁面緩存”,也可以用作“寫入文件的頁面緩存”。

          鏈接:https://medium.com/geekculture/linux-memory-buffer-vs-cache-44d8a187f310

          (版權(quán)歸原作者所有,侵刪)


          瀏覽 38
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  久久婷婷六月综合综 | 欧美日韩一区二区三区电影 | 18禁网站在线 | 躁逼网站 | 国产在视频线精品视频www666 |