วิธีหยุดกระบวนการ Linux สำหรับการดำเนินการในภายหลังการสลับหน่วยความจำ


19

ฉันต้องการหยุดกระบวนการที่ใช้เวลานานเพื่อที่จะไม่ใช้ทรัพยากร CPU หรือหน่วยความจำฟิสิคัลใด ๆ ด้วยความตั้งใจที่จะดำเนินกระบวนการเดิมต่อในอนาคต

ฉันรู้ว่าส่วนของ CPU นั้นสามารถใช้SIGSTOPและSIGCONT ส่งสัญญาณได้แต่เป็นไปได้หรือไม่ที่จะทำการสลับหน้า (สลับออกในกรณีของหน้าสกปรกของกระบวนการ) ทันทีหน่วยความจำ RSS ส่วนตัวของกระบวนการ (หยุด)?


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

13
ระบบปฏิบัติการจะทำสิ่งนี้โดยอัตโนมัติ ไม่มีเหตุผลจริงๆที่จะทำอะไรที่เฉพาะเจาะจง
David Schwartz

@oliver ฉันกำลังสร้างตัวจัดกำหนดการแบบกลุ่ม ( github.com/brutusin/wava ) การใช้งานปัจจุบันมีการจัดตารางเวลาที่ไม่ต้องเสียสิทธิ์ แต่ฉันต้องการย้ายไปที่การยึดเอาเสียก่อน (สามารถหยุดการทำงาน) เพื่อหลีกเลี่ยงสถานการณ์การหยุดชะงักที่สง่างามเมื่องานที่รันอยู่ทั้งหมดขึ้นอยู่กับงานที่อยู่ในคิว ฉันต้องการพฤติกรรมที่ถูกถามอย่างแน่นอนกระบวนการหยุดทำงานต่อเนื่อง (ไม่ได้สร้างสิ่งใหม่จากจุดตรวจสอบ)
idelvall

1
@DavidSchwartz ที่ยืนยันความเสี่ยง
idelvall

@idelvall จากนั้นดูเหมือนว่าคุณไม่ต้องการทำอะไรเป็นพิเศษกับความทรงจำ
David Schwartz

คำตอบ:


11

คุณอาจค้นหาเทคนิคที่เรียกว่าจุดตรวจ / เรียกคืน สิ่งนี้จะช่วยให้คุณสามารถดำเนินการตามกระบวนการและบันทึกสถานะเป็นชุดไฟล์จากนั้นเรียกคืนได้ในภายหลัง
หากต้องการใช้งานให้เริ่มโดยติดตั้งโปรแกรม criu [ git , wiki ] ( yum install criuหรือapt install criu)

หากต้องการตรวจสอบกระบวนการที่กำลังดำเนินอยู่ให้สร้างไดเรกทอรีว่างเพื่อเก็บไฟล์และซีดีไว้ในไดเรกทอรีนั้น

mkdir /var/tmp/checkpoint
cd /var/tmp/checkpoint

ตอนนี้ตรวจสอบกระบวนการทำงาน ในกรณีนี้ฉันกำลังใช้ --shell-job เนื่องจากฉันมีกระบวนการของฉันทำงานในเชลล์ที่มี tty ที่เกี่ยวข้อง

criu dump -t 404 --shell-job

404 เป็น pid ของกระบวนการที่ฉันต้องการตรวจสอบ เมื่อฉันทำสิ่งนี้ฉันเห็นกระบวนการทำงานของฉันถูกทำลายและไดเร็กทอรี / var / tmp / checkpoint ของฉันจะถูกเติมด้วยชุดของไฟล์ที่จำเป็นในการกู้คืน

ในการกู้คืนกระบวนการฉันแน่ใจว่าฉันอยู่ในไดเรกทอรีพร้อมกับไฟล์จุดตรวจสอบและทำการกู้คืน

cd /var/tmp/checkpoint
criu restore --shell-job

กระบวนการจะเลือกจุดที่ทิ้งไว้ในเทอร์มินัลที่มีการทำงานนี้ หากฉันฆ่ากระบวนการที่กำลังทำงานอยู่และทำงานcriu restore --shell-jobอีกครั้งกระบวนการจะย้อนกลับไปที่จุดตรวจสอบและเริ่มต้นอีกครั้ง

หวังว่านี่จะช่วยได้


4
สิ่งนี้ไม่ได้ทำในสิ่งที่ OP อ้างว่าพวกเขาต้องการทำ ลอง - จะไม่มีการลดหน่วยความจำที่ใช้ มันจะเปลี่ยนจากหน่วยความจำส่วนตัวของกระบวนการไปเป็นดิสก์แคช (เนื่องจากเขียนชุดไฟล์) มันทำให้ขั้นตอนการบันทึกพิเศษและขั้นตอนการกู้คืนพิเศษและใช้หน่วยความจำเดียวกัน (และดีดออก) ในแบบเดียวกัน ในความเป็นจริงมันอาจทำให้สิ่งเลวร้ายลงเมื่อหน่วยความจำบางส่วนซ้ำซ้อนเนื่องจากการสร้างทุกสิ่งใหม่เพื่อเขียนออกมา
David Schwartz

ฮ้าจุดดี @David โดยเฉพาะถ้า/tmpเป็น tmpfs (สำรองข้อมูลโดยหน่วยความจำ / พื้นที่สว็อป) หากคุณตรวจสอบไปที่ระบบไฟล์ดิสก์ที่สำรองข้อมูลตามปกติคุณสามารถใช้vmtouch -eเพื่อขับไล่เพจจาก pagecache แต่ยังคงใช้ RAM เพิ่มเติมชั่วคราว (นอกเสียจากว่าcriuจะมีตัวเลือกในการทำ direct i / o (ด้วย O_DIRECT) ... )
Peter Cordes

1
มันยากที่จะรู้ว่านี่เป็นสิ่งที่ OP ต้องการหรือไม่เพราะ OP ขอวิธีแก้ปัญหาเฉพาะแทนที่จะอธิบายว่าเขากำลังพยายามแก้ไขปัญหาอะไร นี่อาจเป็นคำตอบที่สมบูรณ์แบบหรืออาจไร้ประโยชน์กับเขาเราไม่สามารถบอกได้
David Schwartz

ฉันยังไม่ได้ดูรายละเอียด แต่ดูเหมือนว่ากระบวนการกู้คืนเป็นกระบวนการใหม่ (pId ที่แตกต่างกัน) และนี่ไม่ใช่สิ่งที่ฉันต้องการ ...
idelvall

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