คะแนนของเคอร์เนลคำนวณอย่างไร?


12

ดูใน Google และไม่พบสิ่งใดที่อธิบายถึงวิธีการproc/<pid>/oom_scoreคำนวณคะแนน เหตุใดจึงใช้คะแนนนี้แทนที่จะใช้หน่วยความจำทั้งหมดที่ใช้ไป

คำตอบ:


18

ดูบทความ 2009 Goldwyn Rodrigues สำหรับการดำเนินการในขณะนั้นบทความ Jonathan's Corbet 2010สำหรับสิ่งที่ฉันเชื่อว่าเป็นพฤติกรรมปัจจุบันและบทความ 2013ของ Jonathan Corbet สำหรับแนวคิดเกี่ยวกับการเปลี่ยนแปลงในอนาคต

จากบทความ 2010:

ในชุดแก้ไขของเดวิดความผิดพลาดเก่า ๆ () การวิเคราะห์พฤติกรรมเกือบหมดไปหมดแล้ว การคำนวณจะกลายเป็นคำถามง่าย ๆ ว่ากระบวนการใช้หน่วยความจำที่มีอยู่เปอร์เซ็นต์ใด หากระบบโดยรวมมีหน่วยความจำไม่เพียงพอ "หน่วยความจำที่มีอยู่" คือผลรวมของ RAM ทั้งหมดและพื้นที่สว็อปที่มีอยู่ในระบบ หากสถานการณ์ OOM นั้นเกิดจากการทำให้หน่วยความจำที่อนุญาตให้กับกลุ่ม cpuset / กลุ่มควบคุมหมดลงดังนั้น "หน่วยความจำที่มีอยู่" คือจำนวนเงินทั้งหมดที่จัดสรรให้กับกลุ่มควบคุมนั้น การคำนวณที่คล้ายกันจะเกิดขึ้นหากเกินขีด จำกัด ที่กำหนดโดยนโยบายหน่วยความจำ ในแต่ละกรณีการใช้หน่วยความจำของกระบวนการถือว่าเป็นผลรวมของชุดที่อยู่อาศัย (จำนวนหน้า RAM ที่ใช้) และการใช้งาน swap

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

การปรับแต่งอื่น ๆ ที่ใช้คือการเพิ่มค่าที่เก็บไว้ในตัวแปร oom_score_adj ของแต่ละกระบวนการซึ่งสามารถปรับได้ผ่าน / proc ปุ่มนี้ช่วยให้สามารถปรับความน่าดึงดูดใจของแต่ละโพรเซสต่อ OOM killer ในพื้นที่ผู้ใช้; การตั้งค่าเป็น -1000 จะเป็นการปิดการทำงานของ OOM โดยสิ้นเชิงในขณะที่การตั้งค่าเป็น +1000 จะเทียบเท่ากับการทาสีเป้าหมายขนาดใหญ่ในกระบวนการที่เกี่ยวข้อง


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