อัลกอริทึมการเปลี่ยนแคชที่มีประสิทธิภาพมากที่สุด [ปิด]


12

วิกิพีเดียแสดงรายการ 11 ขั้นตอนวิธีการเปลี่ยนแคช สมมติว่าฉันไม่รู้อะไรเกี่ยวกับแอปพลิเคชันที่ฉันจะพัฒนาฉันควรใช้อะไรเป็นอัลกอริทึมการแทนที่แคช "เริ่มต้น"

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

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


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

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

1
หากคุณ "ไม่รู้อะไรเกี่ยวกับแอปพลิเคชั่น" ก็เป็นเรื่องที่ไกลเกินกว่าจะนึกถึงอัลกอริธึมการแทนที่แคช "ที่มีประสิทธิภาพ"
Anon

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

1
@Omega Centauri คุณคิดว่า CPU แคชเท่านั้น แต่ยังมีอีกมากมาย ระบบปฏิบัติการแคชใช้ไฟล์และไดเรกทอรีฐานข้อมูลเก็บข้อมูลของพวกเขาเกือบแต่ละแอปพลิเคชันจะแคชจำนวนมาก (เช่นผลการคำนวณแล้ว)
maaartinus

คำตอบ:


15

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

ปัจจัยที่ต้องพิจารณา

  1. อ่าน / เขียนยอดคงเหลือ (เปอร์เซ็นต์ของการเข้าถึงคืออ่านและเขียน)
  2. จำนวนแคช
  3. ประเภทของสื่อที่อยู่เบื้องหลังแคช (พวกเขาเป็นไดรฟ์ SATA ช้าหรือไดรฟ์ SSD เร็ว)
  4. ฮิต vs คิดถึง (สิ่งที่เขียนใหม่หรืออ่านซ้ำบ่อยแค่ไหน)
  5. ขนาดการเข้าถึงโดยเฉลี่ย (สิ่งนี้จะเลือกขนาดหน้า)
  6. การอ่านและเขียนมีราคาแพงเพียงใด

เมื่อคุณพิจารณาปัจจัยต่าง ๆ ทั้งหมดแล้วคุณต้องค้นหาอัลกอริทึมแคชที่จัดการที่ดีที่สุด ตัวอย่างเช่นบอกว่าคุณมีแอปพลิเคชั่นที่มีการเขียนจำนวนมากเขียนใหม่บางส่วนอ่านข้อมูลที่เพิ่งเขียนและสื่อการปั่นบางประเภท ในกรณีนี้คุณต้องการอัลกอริทึมแคชแบบไฮบริด เพื่อจัดการกับข้อมูลการเขียนคุณอาจต้องการบางสิ่งเช่น Wise order of Writes (WOW) และอัลกอริทึม LRU สำหรับข้อมูลที่อ่านจากดิสก์ เหตุผลนี้คือการเข้าถึงดิสก์มีราคาแพงมากและอัลกอริทึม WOW จะทำให้มีประสิทธิภาพมากขึ้นในการเขียนข้อมูลและ LRU จะเก็บข้อมูลที่เข้าถึงบ่อยอยู่เสมอในแคช

สมมติว่าคุณมีดิสก์ SSD ซึ่งมีเวลาในการเข้าถึงที่รวดเร็วมากคุณอาจต้องเลือกตัวเลือกของคุณไปยังอัลกอริธึม LRU เนื่องจากการเข้าถึงดิสก์นั้นมีราคาไม่แพงนัก

ดังนั้นสิ่งที่ฉันต้องการจะพูดก็คือไม่มีคำตอบที่ "ดีที่สุด" คำตอบที่ดีที่สุดคือทราบปัจจัยที่มีผลกับคุณและเลือกอัลกอริทึมที่จัดการได้ดีที่สุด

วิธีค้นหาอัลกอริทึมสำหรับคุณ

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

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

เมื่อคุณระบุสิ่งที่สำคัญคุณต้องดูอัลกอริธึมการแคชชนิดต่าง ๆ ทั้งหมดเพื่อดูว่าจัดการสิ่งใดดีที่สุด


พังทลายของปัจจัยที่ดี แต่ฉันไม่แน่ใจว่าจะใช้สิ่งเหล่านี้อย่างไรเนื่องจากฉันรู้ว่าโดเมนแอปและปัจจัยต่างๆ
ashes999

@ash: มีเทคนิควิศวกรรมแบบเก่า: สร้างวิธีการวัดที่แตกต่างกันซึ่งทำงานได้ดีที่สุด
Donal Fellows

เมื่อฉันได้ยิน "แคช" ฉันคิดถึงที่เก็บข้อมูลระหว่างหน่วยความจำและ CPU ที่ลงทะเบียน ที่นี่คุณกำลังพูดถึงดิสก์แคชซึ่งเป็นเลเยอร์อยู่ระหว่างหน่วยความจำและอุปกรณ์ i / o อย่างน้อยหนึ่งรายการ
Omega Centauri

@ barrem23 หากคุณกำลังเขียนโปรแกรมแบบกระจายมี "ระยะห่างระหว่างแคชและที่เก็บข้อมูลส่วนหลังที่แคช" เพื่อพิจารณา มันไม่สำคัญเลยถ้าคุณมี SSD หรือหมุนเป็นสนิมเพราะพื้นที่เก็บข้อมูลขนาดใหญ่ที่มั่นคงและมีเสถียรภาพของคุณอยู่ห่างออกไป 15 ms คุณจะต้องมีการเดินทางไปกลับอย่างน้อย 30 ms เสมอ
Vatine

9

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

ตัวอย่างเช่นใช้เพียงสองการใช้งาน: Least ล่าสุดที่ใช้และ Least ที่ใช้บ่อย วิธีการตัดสินใจที่หนึ่งที่จะใช้ก่อนอื่น

  • LRU นั้นดีเมื่อคุณค่อนข้างแน่ใจว่าผู้ใช้มักจะเข้าถึงรายการล่าสุดและไม่กลับไปหารายการเก่า ๆ ตัวอย่าง: การใช้งานทั่วไปของไคลเอนต์อีเมล ในกรณีส่วนใหญ่ผู้ใช้สามารถเข้าถึงจดหมายล่าสุดได้ตลอดเวลา พวกเขาอ่านเลื่อนพวกเขากลับมาในไม่กี่นาทีชั่วโมงหรือวัน ฯลฯ พวกเขาสามารถค้นหาจดหมายที่พวกเขาได้รับเมื่อสองปีก่อน แต่มันเกิดขึ้นน้อยกว่าการเข้าถึงอีเมลที่พวกเขาได้รับในสองชั่วโมงที่ผ่านมา

  • ในทางกลับกัน LRU ไม่มีความหมายในบริบทที่ผู้ใช้จะเข้าถึงบางรายการบ่อยกว่ารายการอื่น ตัวอย่าง: ฉันมักจะฟังเพลงที่ฉันชอบและมันสามารถเกิดขึ้นได้กับเพลง 400 เพลงฉันจะฟังเพลงห้าเพลงต่อสัปดาห์อย่างน้อยหนึ่งครั้งในขณะที่ฉันจะฟังมากที่สุดปีละครั้ง 100 เพลงที่ฉันไม่ชอบ มาก. ในกรณีนี้ LFU เหมาะสมกว่ามาก

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


ตกลงฉันจะเลือกอัลกอริทึมได้อย่างไร ดำเนินการตามรายการของ Wikipedia และดูว่าอะไรเหมาะสมที่สุด?
ashes999

@ ashes999: แน่นอน! ก่อนอื่นคุณเรียนรู้เพิ่มเติมเกี่ยวกับข้อกำหนดของแอปพลิเคชันที่ต้องทำจากนั้นคุณจะวิเคราะห์ข้อดีข้อเสียของอัลกอริทึมแคชที่แตกต่างกันและในที่สุดคุณจะเลือกแอปที่เหมาะสมกว่า
Arseni Mourzenko

3

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


2

คุณสามารถใช้เวลามากมายในการทนทุกข์ทรมานกับอัลกอริทึม 'ดีที่สุด' หรือคุณสามารถใช้อัลกอริธึมที่เรียบง่ายและรับกับส่วนที่เหลือของระบบ เมื่อคุณมีบางสิ่งที่สามารถทดสอบได้แล้วให้กังวลเกี่ยวกับอัลกอริทึม

การเพิ่มประสิทธิภาพก่อนกำหนด ...


0

ไม่มีอัลกอริทึมแคชที่สมบูรณ์แบบ - คุณสามารถค้นหาเคสที่มีพฤติกรรมไม่ดีได้เสมอ

ดังนั้นจึงเป็นเรื่องสำคัญที่จะต้องรู้ปัญหาที่แคชไว้เพื่อกำหนดปัญหาที่จะมีผลเสียน้อยที่สุด

นอกจากนี้คุณควรพิจารณาระยะเวลาที่คุณต้องการแคชสิ่งของและระยะเวลาที่คุณสามารถแคชสิ่งต่าง ๆ ...

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