หยุดชั่วคราว / กลับสู่กระบวนการเดียวไปยัง / จากดิสก์


22

ในบางครั้งเราอยากจะระงับกระบวนการที่ใช้หน่วยความจำมากในเซิร์ฟเวอร์ Ubuntu และ OS X ของเราเพื่อเพิ่ม RAM ชั่วคราวสำหรับงานอื่น หากเราทุกคนกังวลเกี่ยวกับการใช้งาน CPU Ctrl-Zก็จะง่าย อย่างไรก็ตามเราจำเป็นต้องสามารถเพิ่ม RAM (โดยการเขียนลงดิสก์) แล้วเริ่มกระบวนการใหม่ (disk -> RAM) หรือกล่าวอีกนัยหนึ่งว่า "hibernate" เป็นกระบวนการเดียว เบาะแสใด ๆ เกี่ยวกับวิธีการทำเช่นนี้? (โดยเฉพาะจาก CLI) ขอบคุณ


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

1
@enzotib - ฉันไม่ทราบว่าสิ่งนี้เกิดขึ้นและในทางทฤษฎีมันฟังดูดี อย่างไรก็ตามฉันเพิ่งทำแบบทดสอบคร่าวๆและในทางปฏิบัติมันใช้งานไม่ได้ มีกระบวนการใหม่เกิดขึ้นในขณะที่ 'RAM eaters' ถูกหยุดชั่วคราวนั้นช้ามากและฉันไม่พบกิจกรรมดิสก์ใด ๆ ที่คาดว่าจะเกิดขึ้นหาก RAM ถูกเปลี่ยนเป็นดิสก์
Mike Covington

1
@ frozenwithjoy ฉันสามารถยืนยันได้ว่าสิ่งนี้จะเกิดขึ้น เหตุผลเดียวที่ฉันคิดได้ว่ากระบวนการที่ถูกระงับจะไม่ถูกสลับเป็นค่อย ๆ คือถ้ามันขอหน่วยความจำที่ไม่สามารถใช้งานได้ (ค่อนข้างหายากและ (ส่วนใหญ่) สงวนไว้สำหรับรูท) หรือถ้าหน่วยความจำ .
Gilles 'หยุดชั่วร้าย'

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

คำตอบ:


8

ไม่มีสิ่งอำนวยความสะดวกทั่วไปสำหรับการจำศีลกระบวนการเดียวเพียงทั้งระบบ

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

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

perl -e '$tmp = "a" x 999999999' # allocate about 1GB

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


13

คำที่คุณต้องการคือ " แอปพลิเคชันจุดตรวจ "

เครื่องมือที่ผมรู้ว่าจะทำอย่างไรที่มี CryoPID และCryoPID2

เครื่องมือทั้งสองนี้ใช้สำหรับ Linux เท่านั้น

ฉันไม่รู้จักเครื่องมือที่คล้ายกันสำหรับ BSD หรือ OS X


2
อีกแอปที่จะใช้คือ DMTCP: dmtcp.sourceforge.net
Deer Hunter

5

ตรวจสอบให้แน่ใจว่าคุณมีพื้นที่สลับมากมาย ตรวจสอบให้แน่ใจว่าระบบของคุณถูกตั้งค่าให้ต้องการสลับเพจที่ไม่ใช้งาน ( vm.swappiness = 100 ) จากนั้นควรจะเพียงพอที่จะระงับกระบวนการ เคอร์เนลจะต้องการสลับหน้าที่ไม่ใช้งานออก


-1

ใน Mac OS X คุณอาจลองใช้purgeคำสั่ง (มาพร้อมกับ Xcode) เพื่อเพิ่ม RAM (ไม่ได้ใช้งาน) บางตัว

vm_stat
purge
vm_stat

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