ใน Linux อะไรคือความแตกต่างระหว่าง "บัฟเฟอร์" และ "แคช" ที่รายงานโดยคำสั่งฟรี


73

นี่เป็นคำถามเก่าที่ฉันเห็นเป็นครั้งคราว ความเข้าใจของฉันเกี่ยวกับมันค่อนข้าง จำกัด (เมื่ออ่านเกี่ยวกับความแตกต่างเมื่อนานมาแล้ว แต่ข้อเท็จจริงที่เกี่ยวข้องไม่เคยติดอยู่)

ตามที่ฉันเข้าใจ

  • บัฟเฟอร์

    ถูกใช้โดยโปรแกรมที่มีการดำเนินการ I / O ที่ใช้งานอยู่เช่นข้อมูลที่รอการเขียนลงดิสก์

  • ขุมทรัพย์

    เป็นผลลัพธ์ของการดำเนินการ I / O ที่เสร็จสมบูรณ์เช่นบัฟเฟอร์ที่ถูกลบทิ้งหรืออ่านข้อมูลจากดิสก์เพื่อตอบสนองคำขอ

ฉันขอคำอธิบายที่ชัดเจนสำหรับคนรุ่นหลังได้ไหม



มันเหมือนกับข้อมูลเมตาที่คุณพบในบัฟเฟอร์มันไม่เกี่ยวข้องกับบัฟเฟอร์ io บัฟเฟอร์ของเคอร์เนลบางตัวจะถูกนำมาใช้ใน slab allocator แต่ไม่นับรวมเป็นบัฟเฟอร์หรือหน่วยความจำแคชเลย
eckes

คำตอบ:


42

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

mkdir t
mount -t tmpfs none t
dd if=/dev/zero of=t/zero.file bs=10240 count=10240
sync; echo 3 > /proc/sys/vm/drop_caches; free -m
umount t
sync; echo 3 > /proc/sys/vm/drop_caches; free -m

และคุณจะเห็นค่า "แคช" ลดลงโดย 100Mb ที่คุณคัดลอกไปยังระบบไฟล์ที่ใช้ ram (สมมติว่ามี RAM ว่างเพียงพอคุณอาจพบว่าบางส่วนของมันจบลงด้วยการสลับหากเครื่องมีภาระผูกพันมากเกินไปแล้วในแง่ ของการใช้หน่วยความจำ) "sync; echo 3> / proc / sys / vm / drop_caches" ก่อนการโทรเพื่อโทรฟรีแต่ละครั้งควรเขียนสิ่งใดที่ค้างอยู่ในบัฟเฟอร์การเขียนทั้งหมด (การซิงค์) และล้างบล็อกดิสก์แคช / บัฟเฟอร์ทั้งหมดจากหน่วยความจำดังนั้นอิสระจะอ่านเท่านั้น การจัดสรรในค่า "แคช"

แรมที่ใช้โดยเครื่องเสมือน (เช่นที่ทำงานภายใต้ VMWare) อาจนับรวมในค่า "แคช" ของฟรีเช่นเดียวกับ RAM ที่ใช้โดยไฟล์ที่เปิดหน่วยความจำที่เปิดอยู่ในปัจจุบัน (ซึ่งจะแตกต่างกันไปตาม hypervisor / รุ่นที่คุณใช้ อาจระหว่างรุ่นเคอร์เนลด้วย)

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


1
+1 สำหรับความแตกต่างที่น่าสนใจ นี่คือข้อมูลที่ฉันกำลังมองหา ในความเป็นจริงฉันสงสัยว่าตัวเลขมีความซับซ้อนดังนั้นจึงมีส่วนร่วมในกิจกรรมที่แตกต่างกันมากมายว่าเป็นตัวชี้วัดทั่วไปที่ดีที่สุด
Avery Payne

ฉันไม่คิดว่า RAM ที่ใช้โดยเครื่องเสมือนจะนับเป็น "แคช" อย่างน้อยสำหรับ qemu-kvm ฉันสังเกตเห็นว่าในโฮสต์ KVM ของฉันค่าแคชไม่เพียงเล็กเกินไปที่จะถูกต้อง (ที่ 1.9 Gigg) แต่มันจะไม่เปลี่ยนแปลงหากฉันทำลาย / เริ่มต้น VMs ของฉัน มันจะไม่เปลี่ยนแปลงหากฉันทำการ tmpfs mount trick บน VMs อันใดอันหนึ่ง ฉันสร้างพาร์ติชัน tmpfs 800Meg ที่นั่นและ "แคช" แสดงค่าที่เหมาะสมบน VM แต่ไม่ได้เปลี่ยนบนโฮสต์ VM แต่ค่า "ใช้แล้ว" จะหด / ขยายเมื่อฉันทำลาย / สตาร์ท VM ของฉัน
Mike S

... ฉันรันการทดสอบบน Centos 7.2.1511 VM โฮสต์ที่ใช้เคอร์เนล 3.10.0-327
Mike S

@ ไมค์: โซลูชันเวอร์ช่วลไลเซชั่นที่แตกต่างกันนั้นมีความแตกต่างกันอย่างไรในความจริงแล้วเคอร์เนลวัดการใช้หน่วยความจำที่หลากหลายที่อาจเปลี่ยนแปลงระหว่างเวอร์ชันหลัก ๆ ได้อย่างไร
David Spillett

@MikeS: เกี่ยวกับ "ทำ tmpfs mount trick บนหนึ่งใน VMs" - I ที่จะไม่ส่งผลกระทบต่อการอ่านโฮสต์หากพวกเขาไม่แสดง mem อื่น ๆ ที่ใช้โดย VM ฉันเห็นผลใน KVM VM เอง: ก่อน dd free = 2020 หลังจาก dd free = 1899 หลังจาก drop fs free = 2001 (ความแตกต่าง 19Mb จะเกิดจากกระบวนการอื่น ๆ บน VM มันไม่ได้ใช้งานเมื่อฉันวิ่ง การทดสอบ) โฮสต์อาจไม่เห็นการเปลี่ยนแปลง: หน่วยความจำอาจยังคงจัดสรรให้กับ VM แม้ว่าจะฟรีสำหรับการใช้งานโดยกระบวนการใน VM
David Spillett

8

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

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

http://visualbasic.ittoolbox.com/documents/difference-between-buffer-and-cache-12135


5

ฉันกำลังมองหาคำอธิบายที่ชัดเจนยิ่งขึ้นเกี่ยวกับบัฟเฟอร์และฉันพบ "Professional Linux® Kernel Architecture 2008"

บทที่ 16: หน้าและแคชบัฟเฟอร์

ปฏิสัมพันธ์

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


3

อธิบายโดยRedHat :

หน้าแคช:

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

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

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

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

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

บัฟเฟอร์:

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


2

การเพิ่มบัฟเฟอร์ / แคช

คำเตือนนี่อธิบายถึงวิธีการที่แข็งแกร่งที่ไม่แนะนำในเซิร์ฟเวอร์การผลิต ดังนั้นคุณถูกเตือนอย่าโทษฉันถ้ามีอะไรผิดพลาด

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

คำนำ

ก่อนที่จะทำการทดสอบคุณสามารถเปิดหน้าต่างอีกหน้าต่างหนึ่งได้:

$ vmstat -n 1
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 0  1  39132  59740  39892 1038820    0    0     1     0    3    3  5 13 81  1
 1  0  39132  59140  40076 1038812    0    0   184     0 10566 2157 27 15 48 11
...

สำหรับวิวัฒนาการของการแลกเปลี่ยนในเวลาจริง

หมายเหตุ:คุณต้องกำจัดดิสก์ให้มากที่สุดในไดเรกทอรีปัจจุบันคุณมี mem + swap

ตัวอย่าง
$ free
         total       used       free     shared    buffers     cached
Mem:       2064396    2004320      60076          0      90740     945964
-/+ buffers/cache:     967616    1096780
Swap:      3145720      38812    3106908

$ tot=0
$ while read -a line;do
      [[ "${line%:}" =~ ^(Swap|Mem)Total$ ]] && ((tot+=2*${line[1]}))
    done </proc/meminfo
$ echo $tot
10420232

$ dd if=/dev/zero of=veryBigFile count=$tot
10420232+0 records in
10420232+0 records out
5335158784 bytes (5.3 GB) copied, 109.526 s, 48.7 MB/s

$ cat >/dev/null veryBigFile

$ free
             total       used       free     shared    buffers     cached
Mem:       2064396    2010160      54236          0      41568    1039636
-/+ buffers/cache:     928956    1135440
Swap:      3145720      39132    3106588

$ rm veryBigFile 

$ free
         total       used       free     shared    buffers     cached
Mem:       2064396    1005104    1059292          0      41840      48124
-/+ buffers/cache:     915140    1149256
Swap:      3145720      39132    3106588

Nota โฮสต์บนที่ฉันเคยทำสิ่งนี้ถูกใช้อย่างมาก สิ่งนี้จะมีความสำคัญมากกว่าบนเครื่องที่เงียบจริงๆ


1
-1 ถ้าฉันทำได้ นี่เป็นทั้ง (A) ที่ไม่เกี่ยวข้องกับคำถามที่ถามและ (B) วิธีการทื่อแรงอย่างทู่ของการเรียกใช้การล้างแคช มีวิธีโดยตรงที่จะทำสิ่งหลังดังนั้นจึงไม่ควรที่จะหลอกลวงระบบให้ปฏิบัติตามโดยการสแปมด้วยข้อมูลจนกว่าจะส่งผลเป็นผลข้างเคียง
underscore_d

โอวพระเจ้า! โปรดอย่าทำเช่นนั้นกับเซิร์ฟเวอร์จริง!
tamerlaha

@Tamerlaha ฉัน aggree แต่โปรดอ่านย่อหน้าที่ 1 อีกครั้ง: คุณได้รับคำเตือนอย่าโทษฉัน ! เป้าหมายของสิ่งนี้คือการแสดงความหมายของบัฟเฟอร์ / แคช
F. Hauri
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.