buffer和cache怎么讓你們解釋的那么難理解?


本文轉載自:https://www.cnblogs.com/M18-BlankBox/p/5326484.html

對於一個即將踏上“系統運維”或者更加高大尚的工作“系統調優”,如果這不跟這兩哥們搞好關系了,坑的不只有內存,更坑的是你拿着調優的錢卻干着隨時被調的活。因為作為一個系統運維人員來說監控和優化IO性能這是最有可能你生存下來的技能,為啥呢?因為你不僅給老板省了錢,還提高了機器的工作效率。。雖然錢都進了老板兜里,但你漸漸地植入了他深深地腦海里,總有一天你比錢重要!好了閑話少扯,接下來說說這兩個哥們到底是什么?

  之前我自己也對到底buffer和cache是什么,有什么不同,什么時候用buffer,什么時候用cache存在疑惑,不能說不知道,只是別人問起來說起來,我知道,但是講講他們的區別,還真是說不出來。無奈查了好多資料,要么太底層要么含糊不清,學術再權威再有見地,讓讀者理解不了也白搭,這就跟一個牛逼的程序,你再怎么運行在內核空間,但如果你不提供一個用戶空間的接口,用的人不能通過一種調用接口認識你,那說明你確實牛,牛到使用的人不知道你是什么。服務的最終是面向用戶的,你天天說些機器語言,你真的快樂嗎?所以我談談我自己對buffer和cache的理解 ,希望能幫到一部分人,當然有不恰當的地方還請各位老師給予指出。你的指出就是對我最好的評價,謝謝!

  從字面上和語義來看,buffer名為緩沖,cache名為緩存。我們知道各種硬件存在制作工藝上的差別,所以當兩種硬件需要交互的時候,肯定會存在速度上的差異,而且只有交互雙方都完成才可以各自處理別的其他事務。假如現在有兩個需要交互的設備A和B,A設備用來交互的接口速率為1000M/s,B設備用來交互的接口速率為500M/s,那他們彼此訪問的時候都會出現以下兩種情況:(以A來說)

  一.A從B取一個1000M的文件結果需要2s,本來需要1s就可以完成的工作,卻還需要額外等待1s,B設備把剩余的500M找出來,這等待B取出剩下500M的空閑時間內(1s)其他的事務還干不了

  二.A給B一個1000M的文件結果也需要2s,本來需要也就1s就可以完成的工作,卻由於B,1s內只能拿500M,剩下的500M還得等下一個1sB來取,這等待下1s的時間還做不了其他事務。

  那有什么方法既可以讓A在‘取’或‘給’B的時候既能完成目標任務又不浪費那1s空閑等待時間去處理其他事務呢?我們知道產生這種結果主要是因為B跟不上A的節奏,但即使這樣A也得必須等B處理完本次事務才能干其他活(單核cpu來說),除非你有三頭六臂。那有小伙伴可能會問了,能不能在A和B之間加一層區域比如說ab,讓ab既能跟上A的頻率也會照顧B的感受,沒錯我們確實可以這樣設計來磨合接口速率上的差異,你可以這樣想象,在區域ab提供了兩個交互接口一個是a接口另一個是b接口,a接口的速率接近A,b接口的速率最少等於B,然后我們把ab的a和A相連,ab的b和B相連,ab就像一座橋把A和B鏈接起來,並告知A和B通過他都能轉發給對方,文件可以暫時存儲,最終拓撲大概如下:

                

  現在我們再來看上述兩種情況:

    對於第一種情況A要B:當A從B取一個1000M的文件,他把需求告訴了ab,接下來ab通過b和B進行文件傳送,由於B本身的速率,傳送第一次ab並沒有什么卵用,對A來說不僅浪費了時間還浪費了感情,ab這家伙很快感受到了A的不滿,所以在第二次傳送的時候,ab背着B偷偷緩存了一個一模一樣的文件,而且只要從B取東西,ab都會緩存一個拷貝下來放在自己的大本營,如果下次A或者其他C來取B的東西,ab直接就給A或C一個貨真價實的贗品,然后把它通過a接口給了A或C,由於a的速率相對接近A的接口速率,所以A覺得不錯為他省了時間,最終和ab的a成了好基友,說白了此時的ab提供的就是一種緩存能力,即cache,絕對的走私!因為C取的是A執行的結果。所以在這種工作模式下,怎么取得的東西是最新的也是我們需要考慮的,一般就是清cache。例如cpu讀取內存數據,硬盤一般都提供一個內存作為緩存來增加系統的讀取性能

    

    對於第二種情況A給B:當A發給B一個1000M的文件,因為A知道通過ab的a接口就可以轉交給B,而且通過a接口要比通過B接口傳送文件需要等待的時間更短,所以1000M通過a接口給了ab ,站在A視圖上他認為已經把1000M的文件給了B,但對於ab並不立即交給B,而是先緩存下來,除非B執行sync命令,即使B馬上要,但由於b的接口速率最少大於B接口速率,所以也不會存在漏洞時間,但最終的結果是A節約了時間就可以干其他的事務,說白了就是推卸責任,哈哈而ab此時提供的就是一種緩沖的能力,即buffer,它存在的目的適用於當速度快的往速度慢的輸出東西。例如內存的數據要寫到磁盤,cpu寄存器里的數據寫到內存。

  看了上面這個例子,那我們現在看一下在計算機領域,在處理磁盤IO讀寫的時候,cpu,memory,disk基於這種模型給出的一個實例。我們先來一幅圖:(我從別家當來的,我覺得,看N篇文檔 不如瞄此一圖)

                

page cache:文件系統層級的緩存,從磁盤里讀取的內容是存儲到這里,這樣程序讀取磁盤內容就會非常快,比如使用grep和find等命令查找內容和文件時,第一次會慢很多,再次執行就快好多倍,幾乎是瞬間。但如上所說,如果對文件的更新不關心,就沒必要清cache,否則如果要實施同步,必須要把內存空間中的cache clean下

buffer cache:磁盤等塊設備的緩沖,內存的這一部分是要寫入到磁盤里的。這種情況需要注意,位於內存buffer中的數據不是即時寫入磁盤,而是系統空閑或者buffer達到一定大小統一寫到磁盤中,所以斷電易失,為了防止數據丟失所以我們最好正常關機或者多執行幾次sync命令,讓位於buffer上的數據立刻寫到磁盤里。

  接下來說一下Linux上怎么查看buffer/cache,怎么flush...cache ?

 [root@localhost ~]# free -m

                    total   used   free  shared  buffers  cached
Mem:      727    359     367     0          36       171
-/+ buffers/cache:     152     575 
Swap:          2047     0      2047

第一部分Mem行:

total:內存總數

used:已經使用的內存數

free:空閑的內存數

shared:可用的共享內存

buffers:內存緩沖數

cached:內存緩存數

第二部分:(-/+ buffers/cache)

used:除去被用作buffers和cache內存后已用的內存

free:用作buffers和cache的內存加上Mem部分空閑的內存數

第三部分:(Swap)

用一部分磁盤當做內存用的“內存”

現在我們來做一下數據統計

total=Mem_used+Mem_free

Mem_used=Mem_buffers+Mem_cached+(-/+ buffers/cache)_used

Mem_free=(-/+ buffers/cache)_free-Mem_buffers-Mem_cached

通過以上等式,我們可以知道:

  1.buffers和cache也是RAM划分出來的一部分地址空間

  2.buffers和cache的地址空間也可作為空閑內存的組成部分,這意味着我們可以通過向內核傳參釋放一部分內存給其他進程

  3.由於buffers/cache 是一種動態的內存地址空間,所以已用空間和空余空間有絕對使用,絕對空余空間,算上buffers/cache的相對已用空間和相對空余空間四個概念。

如何釋放緩存嗎?我們知道Linux的一個重要思想是一切皆文件,比如各種輸入輸出設備:鍵盤,鼠標,網卡,顯示器,打印機,U盤,console口,在linux的國度里都可為其創建一個文件作為訪問設備的入口,而內核的各種參數也被映射成了文件,不過內核參數這種文件比較特殊,在linux上有兩個偽文件系統:/proc,/sys。

  /proc:內核狀態和統計信息的輸出接口:同時還提供一個配置接口,/proc/sys/ 一些文件可接受用戶指定一個新的value來實現對內核某功能或特性的配置:切記不能用文本編輯器去打開,我們可以通過以下三種方式可以去修改:

      1).sysctl [options] [var=[value]]

      var格式 x.x.x... 命令默認的根目錄是 /proc/sys

      sysctl -a :查看所有根目錄下的內核參數(可以送給grep來檢索需要的內核參數)

      sysctl  var: 查看指定內核參數的值(如果你很熟悉這個目錄你可以直接指所要改的內核選項)

      sysctl -w var=value:設定內核參數var等於value的值

  2).cat /proc/sys/Path/var_file

    echo "value" > /proc/sys/Path/var_file  (通過重定向)

注意!以上兩種方式的設定僅即時生效,內核重新加載就會失效,如果想讓永久生效需要修改其配置文件

  3) 配置文件:/etc/sysctl.conf,/etc/sysctl.d/*.conf (*是代表所有)這個可以vim,比如我們通過vim 打開並讓其有數據包轉發功能,我們可以修改以下這個參數
 
     # Controls IP packet forwardin
              net.ipv4.ip_forward = 1
   修改完我們可以通過sysctl -p [/etc/sysctl.conf] 讓其內核重讀配置文件使其修改的value立即生效。
 
知道了怎么修改內核參數,接下來我們清理下buffers/cache
[root@localhost ~]# echo 1 > /proc/sys/vm/drop_caches 

[root@localhost ~]# free -m
                  total   used   free   shared   buffers     cached
Mem:          727    177     549      0         0             27
-/+ buffers/cache: 150     577 
Swap:        2047    0     2047

 

我們看到命令執行后buffers為0,cached也只有27M。

總結:

    1.buffer和cache都是為了解決互訪的兩種設備存在速率差異,使磁盤的IO的讀寫性能或cpu更加高效,減少進程間通信等待的時間

    2.buffer:緩沖區-用於存儲速度不同步的設備或優先級不同的設備之間傳輸數據,通過buffer可以減少進程間通信需要等待的時間,當存儲速度快的設備與存儲速度慢的設備進行通信時,存儲快的設備先把數據緩存到buffer上,等到系統統一把buffer上的數據寫到速度慢的設備上。常見的有把內存的數據往磁盤進行寫操作,這時你可以查看一下buffers

    3.cache:緩存區-用於對讀取速度比較嚴格,卻因為設備間因為存儲設備存在速度差異,而不能立刻獲取數據,這時cache就會為了加速緩存一部分數據。常見的是CPU和內存之間的數據通信,因為CPU的速度遠遠高於主內存的速度,CPU從內存中讀取數據需等待很長的時間,而Cache保存着CPU剛用過的數據或循環使用的部分數據,這時Cache中讀取數據會更快,減少了CPU等待的時間,提高了系統的性能。

問題:

     1.buffers和cache是必須的嗎?

   2. 怎么清除buffers和cache?

   3. 當buffers值一段時間增長很快說明什么?cache一段時間增長很快說明什么?


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM