ทำไมพื้นที่สว็อปของฉันถึงถูกใช้เมื่อฉันยังมี RAM ที่ไม่ได้ใช้


9

ความอยากรู้มากกว่าปัญหา และฉันยอมรับว่ามีคำถามพื้นฐานที่น่าอับอาย:

ฉันสังเกตเห็นว่าในหลาย ๆ ครั้งบนเครื่อง Linux ฉันจะมีพื้นที่สว็อปพื้นที่ใช้งาน ~ 500MB แม้ว่าฉันจะมี RAM ที่ไม่ได้ใช้ประมาณ 600MB ก็ตาม

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

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

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

ฉันควรชี้แจงว่าเซิร์ฟเวอร์ linux ของฉันมี 2GB RAM และพื้นที่สว็อป 2GB


1
ทำไม 4 โหวตปิดคำถามนี้?

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

คำตอบ:


11

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


7

การสลับสิ่งต่าง ๆ ล่วงหน้าตั้งแต่เมื่อคุณต้องการหน่วยความจำจริง ๆ คุณไม่ต้องรอจนกว่าเคอร์เนลจะเสร็จสิ้นด้วยการเข้าถึงดิสก์

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


7

2 เหตุผล:

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

1

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

อย่างไรก็ตามการใช้หน่วยความจำเกินพิกัดและเกรงกลัวฆาตกร OOM ไม่ใช่ส่วนที่จำเป็นของประสบการณ์ Linux อย่างไรก็ตาม เพียงแค่ตั้งค่าพารามิเตอร์ sysctl vm / overcommit_memory ให้เป็น 2 จะปิดการทำงานแบบ overcommit และทำให้ OOM killer ไม่ทำงานตลอดไป ระบบที่ทันสมัยส่วนใหญ่ควรมีพื้นที่ดิสก์เพียงพอที่จะให้ไฟล์ swap ที่เพียงพอสำหรับสถานการณ์ส่วนใหญ่ แทนที่จะพยายามที่จะป้องกันไม่ให้กระบวนการสัตว์เลี้ยงถูกฆ่าเมื่อหน่วยความจำ overcommitted หมดมันอาจจะง่ายขึ้นเพียงเพื่อหลีกเลี่ยงสถานการณ์โดยสิ้นเชิง [ตอบสนองจากนักฆ่า OOM ]

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

เนื่องจากกระบวนการถูกแสดงด้วยพื้นที่ที่อยู่ของตัวเองหรือ "มุมมอง" (นี่คือการทำงานของการสลับในครั้งแรก) เคอร์เนลจึงมีระยะเวลาที่มากในการจัดการมัน การใช้ตัวอย่างทางแยกจากบทความที่ลิงก์ด้านบนเนื่องจากมีแนวโน้มที่จะมีหน้าหน่วยความจำที่ใช้ร่วมกันมากกว่าที่จะจัดสรรหน่วยความจำที่ไม่ได้ใช้จำนวนมากครั้งใหม่หน่วยความจำสามารถจัดสรรการคัดลอกเมื่อเขียนเพิ่มจำนวนการใช้ swap เมื่อมันถูกเขียนถึง (ซึ่งอาจไม่เกิดขึ้น) จากนั้น "swap swap" สามารถแทนที่ด้วย RAM ที่ไม่ได้ใช้ (จากนั้นเพิ่มการใช้ RAM และลดการใช้ swap) ลองนึกภาพกระบวนการที่มีการจัดสรร 500MB ซึ่ง forks บนเครื่องที่มี RAM ทั้งหมดหรือเกือบทั้งหมดที่ใช้งานอยู่ หากมี swap อยู่ที่ 500MB (และพื้นที่ดิสก์ราคาถูกจะมีขนาดเท่าใด 1% ของไดรฟ์วัณโรคในวันนี้: P) ไม่มีการคัดลอกหน่วยความจำ (ยัง

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

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

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