— The amount, in kibibytes, of temporary storage for raw disk blocks.— The amount of physical RAM, in kibibytes, used as cache memory.— The total amount of memory, in kibibytes, used by the kernel to cache data structures for its own use.— The part of Slab that can be reclaimed, such as caches.
看了一圈回答,都沒有特別準確的。
簡要結論:
Buffer用於臨時儲存IO裝置資料,不分讀寫。在Buffer中的資料必須進行下一步處理後才能清空回收記憶體空間。例如用於讀取的Buffer,需要後續指令對讀取到buffer中的資料進行處理,在處理完成前清空記憶體會出現讀失敗;用於寫入的Buffer,則需要寫入到IO裝置,在寫入完成前清空記憶體會出現資料丟失。嚴格意義上的Buffer,在後續處理完成後則應當回收記憶體。Cache則是把暫時不用的資料儲存在記憶體中,以加快下一次對這些資料的訪問。理論上來說,Cache是隨時可以清空的,代價是下一次訪問相同資料的時候效能下降。但實際上Cache機制中往往存在某種形式的Buffer,並非所有用於Cache的記憶體都可以隨時清空回收。首先,就free命令來說,文件(man free)是這麼說的:
也就是說,free顯示的buffer就是meminfo中的buffer,cache是meminfo中的Cache和Sreclaimable兩項的和。
然後看meminfo的說明:
— The amount, in kibibytes, of temporary storage for raw disk blocks.— The amount of physical RAM, in kibibytes, used as cache memory.— The total amount of memory, in kibibytes, used by the kernel to cache data structures for its own use.— The part of Slab that can be reclaimed, such as caches.粗略翻譯一下:
Buffers:硬碟塊的臨時儲存大小,注意一點:這裡並沒有說是寫入還是讀取。Cached:作為Cache使用的記憶體大小Slab:核心本身使用的Cache大小SReclaimable:Slab中可以回收的部分但這裡並沒有解釋清楚buffer和cache的區別,英文維基的Cache條目中,單獨有一節是講述Cache和Buffer的差異,大略翻譯如下:
“緩衝區(buffer)”和“快取(cache)”的語義並不完全不同; 即便如此,快取過程和緩衝過程之間的意圖也存在根本差異。
從根本上說,快取實現了重複傳輸的資料傳輸的效能提升。雖然快取系統可以在資料項的初始(通常寫入)傳輸時實現效能提高,但是這種效能提高是由於在快取系統內的緩衝機制。
使用讀快取,必須至少從其原始位置獲取一個數據項至少一次,以便隨後讀取資料項時,透過從快取(更快)儲存器中讀取而不是從資料的原始位置來獲取更好的讀取效能。利用寫快取,藉助於資料項立即儲存在高速的快取儲存器中,可以在第一次寫入資料項時提高寫入效能,之後(或者透過其它後臺程序)延遲將資料項寫入到目標位置。與嚴格緩衝相反,快取過程必須遵循快取一致性協議(可能是分散式的),以保持快取與資料原始/目標位置之間的一致性。
另一方面,緩衝
減少了通訊流程之間資料傳輸的數量,透過更少的傳輸次數,更大的傳輸大小減少了多次小量傳輸所涉及的開銷,為通訊過程提供中介,這些過程無法在彼此之間直接轉移資料,或者確保傳輸中涉及的至少一個通訊過程所需的最小資料大小或表示。典型的快取過程中,首次讀寫的資料項會被緩衝;寫入時,通常可以提升要寫入資料的應用程式的效能。此外,快取協議中將多次單獨寫入透過延遲合併成批次寫入,將多個單獨讀取透過延遲合併成批次讀取都是另一種形式的緩衝,因為延遲和合並的原因,對於前面的單個讀寫操作的效能都可能造成負面影響(所有讀寫操作的整體效能也有被降低的可能)。實際上,快取幾乎總是涉及某種形式的緩衝,而嚴格的緩衝不涉及快取。
傳統計算機中,使用記憶體作為臨時緩衝區是因為CPU的指令不能直接對儲存在外圍裝置中的資料進行定址。因此需要使用可定址的記憶體作為中介來臨時儲存資料。另外,緩衝區可以用於資料塊的組合或者分解(根據儲存裝置的要求),或者對產生資料進行重新排序後進行傳送。此外,整個資料緩衝區通常按順序傳輸(例如傳輸到硬碟),因此快取可以提高傳輸效能,減少傳輸延遲的變化或抖動,不同於快取的目的是降低延遲。即使將緩衝的資料寫入外部裝置後再重新讀取回緩衝區,依然可以從緩衝機制中獲益。
快取也可以提高傳輸效能。部分和緩衝類似,來自將多次小量傳輸合併為一個大資料塊的傳輸。但主要的效能提升是因為可能多次從快取中讀取相同的資料,或者資料寫入後很快又被讀取回來。快取的唯一目的是減少對底層較慢儲存的訪問。快取通常是一個設計為從相鄰層的角度來看是不可見的抽象層。