หน่วยความจำบอลลูนในระบบปฏิบัติการ


13

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

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

คำตอบ:


14

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

บอลลูนหน่วยความจำ

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

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

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

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

การผสานหน้าเดียวกัน

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

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

ในระดับ OS เสมือนจริงใช้หลักการเดียวกันนี้ในระบบย่อยของผู้เยี่ยมชมแต่ละระบบ อย่างไรก็ตามเคอร์เนลโฮสต์ไม่มีความคิดว่าแขกสองคนส่วนใหญ่ใช้รหัสเดียวกันและกำลังแชร์หน่วยความจำเดียวกัน - แขกไม่ได้สื่อสารเพื่อประสานงานนั้น

นี่คือเหตุผลที่บางครั้งมันสามารถสแกนทั้งระบบเพื่อหาหน้าหน่วยความจำที่เหมือนกันซึ่งส่วนใหญ่แล้วพวกมันจะเหมือนกันในระบบปฏิบัติการของแขกไม่ได้อยู่ในแต่ละระบบ - เคอร์เนลของแขกทำให้งานที่ดี ดังนั้นในสภาพแวดล้อมแบบ VM ทั่วไปที่โฮสต์เคอร์เนลหนึ่งตัวจัดการแขกมากกว่า 50 คนการประหยัดหน่วยความจำนั้นค่อนข้างมาก

ทั้งสองในครั้งเดียว

Ballooning และ Same-Page-Merging สามารถอยู่ร่วมกันได้เป็นอย่างดีเพื่อให้ได้หน่วยความจำมากเกินพอสำหรับระบบที่เหมือนกัน


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

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

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

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

ไม่ว่าในกรณีใดคุณสามารถเปิดใช้งานด้วยตนเองบน Linux (Kernel SamePage Merging) คนขับส่งออกสถิติต่าง ๆ ที่หลังจากอ่านคำตอบนี้คุณควรจะสามารถตีความและตัดสินใจด้วยตัวเองว่ามันเหมาะสมกับวัตถุประสงค์ของคุณหรือไม่

https://www.kernel.org/doc/Documentation/vm/ksm.txt


3
การรวมเพจแบบเดียวกันนั้นเรียกว่า 'หน่วยความจำดีเยี่ยม' ขึ้นอยู่กับไฮเปอร์ไวเซอร์ (และอายุของมัน)
Tim Post

ขอขอบคุณฉันเห็นว่า KSM ต้องการให้แอปพลิเคชันทราบและจากการค้นหา (ด่วน) Chromium ไม่สนับสนุนในตอนนี้ ผมทราบว่าไบนารีจะซ้ำ แต่ฉันส่วนใหญ่หมายถึงการส่งออก JIT และสคริปต์ดิบที่ทำให้เครียดหนักใน RAM ของฉัน ...

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

สคริปต์ดิบจะถูกแมป แต่แม้กระทั่งสคริปต์ทั่วไป (เช่น jQuery และ Angular.js) จะถูกจำลองแบบในแคชและพวกเขาจะไม่จับคู่กันเนื่องจากมีการใช้งาน CDN และสำเนาไฟล์สคริปต์ที่แน่นอนในเซิร์ฟเวอร์ไซต์ต่างๆ

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