เป็นไปได้หรือไม่ที่จะกำหนดขีด จำกัด แบบนุ่มนวลบางอย่างเกี่ยวกับการใช้หน่วยความจำของกระบวนการ?


10

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

อย่างไรก็ตามบ่อยครั้งกว่า (ในประสบการณ์ของฉัน) การใช้หน่วยความจำไม่ได้ จำกัด โดยการโกงอาจกระบวนการรถ นั่นคือฉันไม่ได้จบลงด้วยข้อมูลที่ต้องการน้อยกว่าที่ถูกย้ายไปสับเปลี่ยน แต่ระบบปฏิบัติการถูกบังคับให้สลับโหลดข้อมูลอย่างกะทันหัน และน่าเสียดายที่ไม่เพียง แต่ทำลายกระบวนการที่กระทำผิดกฎหมายอย่างหนัก แต่สามารถนำระบบทั้งหมดมาสู่ความนิ่ง (มันไม่เลวร้ายนักในเครื่องที่ใช้ SSD แต่ OTOH ทำให้ฉันกังวลว่าการเขียนกิกะไบต์และกิกะไบต์ของข้อมูลขยะอาจเป็นไปได้ไหม ระยะยาวเป็นอันตรายต่อเซลล์แฟลช)
จนกว่าฉันจะสังเกตเห็นปัญหาและฆ่ากระบวนการด้วยตนเอง (เมื่อใช้เวลาจริงนาทีจนกระทั่งฉันได้เข้าสู่ระบบเสมือน terminal!) ครึ่งเซสชั่นการทำงานของฉันในการแลกเปลี่ยนและฉันต้องรอสักครู่จนกว่าระบบจะทำงานได้อย่างราบรื่น อีกครั้ง

มีวิธีแก้ไขปัญหา draconic หนึ่งวิธี: บังคับใช้ขีด จำกัด หน่วยความจำฮาร์ด แต่การทำทั้งระบบนี้บางครั้งจะทำให้กระบวนการที่ฉันต้องการอยู่นิ่งและถ้าฉันต้องทำเองulimitก่อนที่จะเริ่มขั้นตอนการละเมิด ... ดีฉันมักจะลืมจนกว่ามันจะสายเกินไป

วิธีแก้ปัญหาที่เป็นไปได้ที่ฉันมีความสุขมากขึ้น:

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

มีวิธีใดบ้างที่จะรับพฤติกรรมเช่นนี้หรือคล้ายกัน?


2
คุณสามารถ จำกัด จำนวน RAM ที่ใช้โดยกระบวนการหรือกลุ่มของกระบวนการโดยใช้ cgroups stackoverflow.com/questions/3043709/…
ทำเครื่องหมาย Plotnick

2
นี่คือสิ่งที่แน่นอนulimitสำหรับ
DopeGhoti

1
Ulimit -m นั้นเป็นสิ่งที่ใช้ยกเว้นว่ามันไม่ได้ทำงานบน Linux ตั้งแต่ 2.4.30 และทำงานในบางสถานการณ์ก่อนหน้านั้นเท่านั้น unix.stackexchange.com/questions/129587/…
Mark Plotnick

niceload --noswap yourprg
Ole Tange

คำตอบ:


6

niceload --noswap yourprgถูกสร้างขึ้นมาสำหรับสถานการณ์นั้น ๆ : มันดูที่กิจกรรมการแลกเปลี่ยน:

  • หากการแลกเปลี่ยน: ให้กระบวนการทำงาน
  • หากการแลกเปลี่ยนใน: ให้กระบวนการทำงาน
  • หากการสลับเข้าและออก: หยุดกระบวนการจนกว่าการสลับจะหยุดและเริ่มกระบวนการต่อเมื่อการสลับหยุดลง

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

niceload --mem 1G yourprgทำงานคล้ายกัน: หากน้อยกว่า 1GB เป็นฟรี youprg ถูกระงับ เมื่อมีมากกว่า 1GB แล้วคุณจะได้รับprprต่อฟรี


0

ใช่. มันทำได้ค่อนข้างง่ายด้วยกระสุนที่ทันสมัย

sh -c 'ulimit -S -m "$1"
       shift; exec your_command "$@"
' -- some_size args

คุณสามารถใช้-lตัวเลือกสำหรับการ จำกัด หน่วยความจำที่ล็อคไว้ กระบวนการของคุณจะถูกส่งสัญญาณหากเกินขีด จำกัด


-1

Cronjob เพื่อล้างแคช: วิธีล้างแคชหน่วยความจำใน Linux

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

เรียบง่ายและขี้เกียจ


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

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