ความแตกต่างระหว่างหน่วยความจำบัฟเฟอร์และแคชใน Linux คืออะไร?


179

สำหรับผมแล้วมันยังไม่ชัดเจนสิ่งที่แตกต่างระหว่างแนวคิดหน่วยความจำลินุกซ์สอง: และbuffer cacheฉันได้อ่านบทความนี้แล้วและสำหรับฉันแล้วความแตกต่างระหว่างพวกเขาคือนโยบายการหมดอายุ:

  1. นโยบายของบัฟเฟอร์เป็นแบบเข้าก่อนออกก่อน
  2. นโยบายของแคชคือใช้น้อยที่สุด

ฉันถูกไหม?

โดยเฉพาะฉันกำลังดูทั้งสองคำสั่ง: freeและvmstat

james@utopia:~$ vmstat -S M
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
5  0      0    173     67    912    0    0    19    59   75 1087 24  4 71  1
james@utopia:~$ free -m
             total       used       free     shared    buffers     cached
Mem:          2007       1834        172          0         67        914
-/+ buffers/cache:        853       1153
Swap:         2859          0       2859

คุณควรให้บริบทเพิ่มเติมกับเราทั้งสองคำนี้ใช้กับความหมายที่ต่างกัน คุณกำลังอ้างถึงfreeเอาต์พุตคำสั่งหรือไม่?
leonbloy

3
คุณพูดถูกฉันกำลังดูสองคำสั่ง: ฟรี vmstat ดูการปรับปรุงของฉัน
James.Xu

1
คุณอาจเยี่ยมชมunix.stackexchange.com
leonbloy

คำตอบ:


69

"บัฟเฟอร์" แสดงถึงจำนวน RAM ที่ทุ่มเทให้กับแคชดิสก์บล็อก "Cached" นั้นคล้ายกับ "Buffers" แต่คราวนี้มันจะแคชหน้าจากการอ่านไฟล์

อ้างจาก:


3
ฉันทดสอบสิ่งนี้โดยใช้โปรแกรมไพ ธ อนอย่างง่ายที่เขียนบล็อกจำนวนมาก สิ่งที่เกิดขึ้นคือการcacheเติมเต็มตามที่รายงานโดยfree -w -hไม่ใช่buffersคอลัมน์ ฉันคิดว่าcacheคอลัมน์นับทั้งการเขียนดิสก์และการอ่านดิสก์และbuffersใช้เพื่อสิ่งอื่น
CMCDragonkai

@CMCDragonkai ขอบคุณสำหรับหลักฐานการทดลอง คำถามที่น่าสนใจคือคุณเขียนได้เร็วกว่าดิสก์หรือไม่ (เช่นการซิงค์จะใช้เวลานาน) ซึ่งจะบอกให้เราทราบหากมีการนับบล็อกสกปรกแตกต่างจากบล็อกที่สะอาด แน่นอนว่า Linux จะแคชทั้งสองประเภท (lru ดังที่ได้กล่าวไว้ในคำถาม) แต่สิ่งหนึ่งที่มีความสำคัญมากกว่านั้นในแง่ของแรงกดดันหน่วยความจำ
Seth Robertson

179

บัฟเฟอร์เกี่ยวข้องกับอุปกรณ์บล็อกเฉพาะและครอบคลุมการแคชของข้อมูลเมตาของระบบไฟล์รวมถึงการติดตามหน้าเว็บในเที่ยวบิน แคชมีข้อมูลไฟล์ที่พักไว้เท่านั้น นั่นคือบัฟเฟอร์จำสิ่งที่อยู่ในไดเรกทอรีสิทธิ์ของไฟล์คืออะไรและติดตามว่าหน่วยความจำใดที่ถูกเขียนหรืออ่านไปยังอุปกรณ์บล็อกใด ๆ แคชประกอบด้วยเนื้อหาของไฟล์เท่านั้น

ลิงค์อ้าง


1
สั้นและอธิบายได้ดี ขอบคุณ
curiousguy

84

อ้างคำตอบ (สำหรับการอ้างอิง):

คำตอบสั้น ๆ : แคชคือขนาดของแคชของหน้า บัฟเฟอร์คือขนาดของบัฟเฟอร์บล็อก I / O ในหน่วยความจำ เรื่องที่เก็บไว้; บัฟเฟอร์ส่วนใหญ่ไม่เกี่ยวข้อง

คำตอบที่ยาว: แคชคือขนาดของแคชเพจ Linux ลบหน่วยความจำใน swap cache ซึ่งแสดงโดย SwapCached (ดังนั้นขนาดแคชหน้าทั้งหมดคือ Cached + SwapCached) Linux ดำเนินการไฟล์ I / O ทั้งหมดผ่านหน้าแคช การเขียนมีการใช้งานเพียงทำเครื่องหมายสกปรกเท่าหน้าที่เกี่ยวข้องในแคชของหน้า; เธรด flusher จากนั้นจึงเขียนกลับไปยังดิสก์หน้าสกปรกใด ๆ การอ่านถูกนำไปใช้โดยส่งคืนข้อมูลจากหน้าแคช หากข้อมูลยังไม่ได้อยู่ในแคชข้อมูลจะถูกเติมลงไปก่อน บนระบบ Linux ที่ทันสมัย ​​Cached สามารถเป็นหลายกิกะไบต์ได้อย่างง่ายดาย มันจะหดตัวเมื่อตอบสนองต่อแรงกดหน่วยความจำเท่านั้น ระบบจะทำการล้างแคชของหน้าพร้อมกับการแลกเปลี่ยนข้อมูลไปยังดิสก์เพื่อให้มีหน่วยความจำเพิ่มขึ้นตามความจำเป็น

บัฟเฟอร์คือบัฟเฟอร์ I / O บล็อกในหน่วยความจำ พวกมันมีอายุค่อนข้างสั้น ก่อนหน้าเคอร์เนล Linux รุ่น 2.4 Linux มีหน้าที่แยกแคชและบัฟเฟอร์ ตั้งแต่ 2.4 เพจและบัฟเฟอร์แคชจะรวมเป็นหนึ่งเดียวและบัฟเฟอร์เป็นบล็อกดิสก์ดิบซึ่งไม่ได้แสดงในแคชหน้าเช่นไม่ใช่ข้อมูลไฟล์ ตัวชี้วัดบัฟเฟอร์จึงมีความสำคัญน้อยที่สุด ในระบบส่วนใหญ่บัฟเฟอร์มักจะมีขนาดเพียงสิบเมกะไบต์


7
"บัฟเฟอร์ส่วนใหญ่ไม่เกี่ยวข้อง" - ไม่มีหลายกรณีที่การแคชเนื้อหาไฟล์ไม่เกี่ยวข้อง แต่ทำให้ข้อมูลเมตาในแคชเร็วขึ้น วิดีโอสตรีมมิ่งเซิร์ฟเวอร์ NAS เป็นต้น
กุนเธอร์ Piez

ระบบใดที่ทำ I / O จำนวนมากจะใช้หน่วยความจำจำนวนมากสำหรับบัฟเฟอร์ ฉันกำลังโหลดฐานข้อมูล MySQL / InnoDB ขนาด 100GB และบัฟเฟอร์สูงกว่า 2GB ตลอดเวลา
Marcelo Pacheco

21

มันไม่ง่ายอย่างที่คิด แต่อาจช่วยให้เข้าใจได้:

บัฟเฟอร์ใช้สำหรับเก็บข้อมูลเมตาของไฟล์ (การอนุญาตตำแหน่ง ฯลฯ ) หน้าหน่วยความจำทุกหน้าจะถูกติดตามที่นี่

แคชใช้สำหรับจัดเก็บเนื้อหาไฟล์จริง


5
IOW, Buffer = ข้อมูลเมตา; แคช = ข้อมูล;
Freedom_Ben

13

อธิบายโดยRedHat :

หน้าแคช:

แคชเป็นส่วนหนึ่งของหน่วยความจำที่เก็บข้อมูลอย่างโปร่งใสเพื่อให้คำขอในอนาคตสำหรับข้อมูลนั้นสามารถให้บริการได้เร็วขึ้น หน่วยความจำนี้ใช้โดยเคอร์เนลเพื่อแคชข้อมูลดิสก์และปรับปรุงประสิทธิภาพการทำงานของ i / o

เคอร์เนล Linux ถูกสร้างขึ้นในลักษณะที่จะใช้ RAM มากเท่าที่จะสามารถแคชข้อมูลจากระบบไฟล์และดิสก์ภายในและระยะไกลของคุณ เมื่อเวลาผ่านไปในการอ่านและเขียนต่าง ๆ จะถูกดำเนินการบนระบบเคอร์เนลพยายามที่จะเก็บข้อมูลไว้ในหน่วยความจำสำหรับกระบวนการต่าง ๆ ที่กำลังทำงานอยู่บนระบบหรือข้อมูลที่กระบวนการที่เกี่ยวข้องซึ่งจะใช้ในอนาคตอันใกล้ แคชจะไม่ถูกเรียกคืนในเวลาที่กระบวนการหยุด / ออกอย่างไรก็ตามเมื่อกระบวนการอื่นต้องการหน่วยความจำเพิ่มขึ้นหน่วยความจำที่ว่างก็จะใช้เคอร์เนลจะเรียกใช้ฮิวริสติกเพื่อเรียกคืนหน่วยความจำด้วยการจัดเก็บข้อมูลแคชและจัดสรรหน่วยความจำ

เมื่อมีการร้องขอไฟล์ / ข้อมูลใด ๆ เคอร์เนลจะค้นหาสำเนาของส่วนของไฟล์ที่ผู้ใช้ดำเนินการและหากไม่มีสำเนาดังกล่าวอยู่ก็จะจัดสรรหนึ่งหน้าใหม่ของหน่วยความจำแคชและเติมด้วย เนื้อหาที่เหมาะสมอ่านจากดิสก์

ข้อมูลที่เก็บไว้ในแคชอาจเป็นค่าที่คำนวณไว้ก่อนหน้านี้หรือทำซ้ำค่าดั้งเดิมที่เก็บไว้ที่อื่นในดิสก์ เมื่อมีการร้องขอข้อมูลบางส่วนแคชจะถูกตรวจสอบก่อนเพื่อดูว่ามีข้อมูลนั้นอยู่หรือไม่ ข้อมูลสามารถดึงได้เร็วกว่าจากแคชมากกว่าจากแหล่งกำเนิด

เซ็กเมนต์หน่วยความจำที่ใช้ร่วมกันของ SysV นั้นยังถือว่าเป็นแคชแม้ว่าจะไม่ได้เป็นตัวแทนข้อมูลใด ๆ บนดิสก์ สามารถตรวจสอบขนาดของเซ็กเมนต์หน่วยความจำที่แบ่งใช้โดยใช้คำสั่ง ipcs -m และตรวจสอบคอลัมน์ไบต์

บัฟเฟอร์:

บัฟเฟอร์เป็นการนำเสนอบล็อกดิสก์ของข้อมูลที่เก็บไว้ภายใต้แคชหน้า บัฟเฟอร์ประกอบด้วยข้อมูลเมตาของไฟล์ / ข้อมูลที่อยู่ภายใต้แคชของหน้า ตัวอย่าง: เมื่อมีการร้องขอข้อมูลใด ๆ ที่มีอยู่ในแคชหน้าแรกเคอร์เนลตรวจสอบข้อมูลในบัฟเฟอร์ที่มีข้อมูลเมตาซึ่งชี้ไปที่ไฟล์ / ข้อมูลจริงที่อยู่ในแคชหน้า เมื่อทราบข้อมูลเมตาดาต้าบล็อกที่แท้จริงของไฟล์แล้วเคอร์เนลจะถูกนำไปประมวลผล


12

บัฟเฟอร์และแคช

บัฟเฟอร์เป็นสิ่งที่ยังไม่ได้ "เขียน" ลงในดิสก์

แคชคือสิ่งที่ "อ่าน" จากดิสก์และเก็บไว้เพื่อใช้ในภายหลัง


2
เคล็ดลับผู้ใช้ใหม่: ทำให้คำตอบของคุณเกี่ยวข้องกับคำถามให้ชัดเจนที่สุด ถ้าฉันเป็นคุณฉันจะเพิ่มคำตอบของคุณในหัวข้อที่เริ่มต้นด้วย "ดังนั้นด้วยตัวอย่างของคุณ ... " และอธิบายรายละเอียดเล็กน้อย
Piotr Wadas

25
ฉันไม่คิดว่าคำตอบนี้เป็นจริงในบริบทเดียวกันกับคำถาม (กล่าวคือสิ่งที่เคอร์เนล Linux หมายถึง "บัฟเฟอร์" และ "แคช"
Freedom_Ben

8

ฉันคิดว่าหน้านี้จะช่วยให้เข้าใจความแตกต่างระหว่างบัฟเฟอร์และแคชอย่างลึกซึ้ง http://www.tldp.org/LDP/sag/html/buffer-cache.html

การอ่านจากดิสก์ช้ามากเมื่อเทียบกับการเข้าถึงหน่วยความจำ (จริง) นอกจากนี้เป็นเรื่องปกติที่จะอ่านส่วนเดียวกันของดิสก์หลาย ๆ ครั้งในช่วงเวลาสั้น ๆ ตัวอย่างเช่นหนึ่งอาจอ่านข้อความอีเมลก่อนจากนั้นอ่านจดหมายลงในตัวแก้ไขเมื่อตอบกลับจากนั้นทำให้โปรแกรมจดหมายอ่านอีกครั้งเมื่อคัดลอกไปยังโฟลเดอร์ หรือพิจารณาความถี่ของคำสั่งlsอาจรันบนระบบที่มีผู้ใช้จำนวนมาก โดยการอ่านข้อมูลจากดิสก์เพียงครั้งเดียวแล้วเก็บไว้ในหน่วยความจำจนกระทั่งไม่ต้องการอีกต่อไปเราสามารถเพิ่มความเร็วได้ทั้งหมด แต่อ่านครั้งแรก สิ่งนี้เรียกว่าการบัฟเฟอร์ดิสก์และหน่วยความจำที่ใช้เพื่อวัตถุประสงค์นี้เรียกว่าบัฟเฟอร์แคช

เนื่องจากหน่วยความจำเป็นโชคไม่ดีทรัพยากร จำกัด ขาดแคลนแคชบัฟเฟอร์จึงไม่สามารถมีขนาดใหญ่พอ (มันไม่สามารถเก็บข้อมูลทั้งหมดที่ต้องการใช้) เมื่อแคชเต็มข้อมูลที่ไม่ได้ใช้งานเป็นเวลานานที่สุดจะถูกยกเลิกและหน่วยความจำที่เป็นอิสระจึงถูกใช้สำหรับข้อมูลใหม่

การบัฟเฟอร์ดิสก์ใช้สำหรับเขียนเช่นกัน ในอีกด้านหนึ่งข้อมูลที่ถูกเขียนนั้นมักจะถูกอ่านอีกครั้งในไม่ช้า (เช่นไฟล์ซอร์สโค้ดถูกบันทึกลงในไฟล์แล้วอ่านโดยคอมไพเลอร์) ดังนั้นการวางข้อมูลที่เขียนในแคชเป็นความคิดที่ดี ในทางตรงกันข้ามโดยการใส่ข้อมูลลงในแคชเท่านั้นไม่เขียนลงดิสก์ในครั้งเดียวโปรแกรมที่เขียนจะทำงานได้เร็วขึ้น การเขียนนั้นสามารถทำได้ในพื้นหลังโดยไม่ทำให้โปรแกรมอื่นช้าลง


สิ่งนี้อธิบายว่าบัฟเฟอร์แคชคืออะไร แต่ไม่ใช่ความแตกต่างระหว่างบัฟเฟอร์และแคชในเอาต์พุตของคำสั่ง vmstat และคำสั่งว่าง
Roel Schroeven

4

Seth Robertson Link 2 กล่าวว่า "เพื่อความเข้าใจอย่างละเอียดของคำเหล่านี้ให้ดูที่หนังสือเคอร์เนล Linux เช่น Linux Kernel Development โดย Robert M. Love"

ฉันพบเนื้อหาบางส่วนเกี่ยวกับ 'บัฟเฟอร์' ในหนังสือฉบับที่ 2

แม้ว่าอุปกรณ์ทางกายภาพนั้นสามารถกำหนดแอดเดรสได้ที่ระดับเซกเตอร์เคอร์เนลดำเนินการดิสก์ทั้งหมดในแง่ของบล็อก

เมื่อบล็อกถูกเก็บไว้ในหน่วยความจำ (พูดหลังจากอ่านหรือรอการเขียน) บล็อกนั้นจะถูกเก็บไว้ใน 'บัฟเฟอร์' 'บัฟเฟอร์' แต่ละอันเกี่ยวข้องกับหนึ่งบล็อกเท่านั้น 'บัฟเฟอร์' ทำหน้าที่เป็นวัตถุที่แสดงถึงบล็อกดิสก์ในหน่วยความจำ

A 'buffer' เป็นการแทนหน่วยความจำของดิสก์ฟิสิคัลบล็อกเดียว

การดำเนินการ Block I / O จัดการดิสก์บล็อกครั้งละหนึ่งรายการ การดำเนินการบล็อก I / O ทั่วไปคือการอ่านและการเขียนไอโหนด เคอร์เนลจัดเตรียมฟังก์ชัน bread () เพื่อทำการอ่านระดับต่ำของบล็อกเดียวจากดิสก์ ผ่าน 'บัฟเฟอร์' บล็อกดิสก์จะถูกแมปกับหน้าในหน่วยความจำที่เกี่ยวข้อง "


2

บัฟเฟอร์มีข้อมูลเมตาซึ่งช่วยปรับปรุงประสิทธิภาพการเขียน

แคชประกอบด้วยเนื้อหาไฟล์ (บางครั้งยังเขียนไปยังดิสก์) ซึ่งปรับปรุงประสิทธิภาพการอ่าน


1

อ้างอิงจากหนังสือ: รู้เบื้องต้นเกี่ยวกับการดึงข้อมูล

ขุมทรัพย์

เราต้องการเก็บข้อมูลให้มากที่สุดเท่าที่จะเป็นไปได้ในหน่วยความจำโดยเฉพาะข้อมูลที่เราต้องเข้าถึงบ่อยครั้ง เราเรียกเทคนิคการเก็บข้อมูลดิสก์ที่ใช้บ่อยในการแคชหน่วยความจำหลัก

กันชน

ระบบปฏิบัติการโดยทั่วไปจะอ่านและเขียนบล็อกทั้งหมด ดังนั้นการอ่านไบต์เดียวจากดิสก์อาจใช้เวลามากเท่ากับการอ่านบล็อกทั้งหมด ขนาดบล็อกทั่วไปคือ 8, 16, 32 และ 64 กิโลไบต์ (KB) เราเรียกส่วนหนึ่งของหน่วยความจำหลักที่มีการอ่านหรือเขียนบล็อกที่เก็บบัฟเฟอร์


0

บัฟเฟอร์คือขอบเขตของหน่วยความจำที่ใช้เพื่อเก็บข้อมูลชั่วคราวในขณะที่มันถูกย้ายจากที่หนึ่งไปยังอีกที่หนึ่งภายในคอมพิวเตอร์ในขณะที่แคชเป็นพื้นที่เก็บข้อมูลชั่วคราวที่สามารถเก็บข้อมูลที่เข้าถึงบ่อยเพื่อการเข้าถึงที่รวดเร็ว เมื่อข้อมูลถูกเก็บไว้ในแคชการใช้งานในอนาคตสามารถทำได้โดยการเข้าถึงสำเนาแคชแทนที่จะดึงข้อมูลต้นฉบับอีกครั้งเพื่อให้เวลาในการเข้าถึงโดยเฉลี่ยสั้นลง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.