ฆ่ากระบวนการโดยอัตโนมัติหากเกิน RAM ที่กำหนด


13

ฉันทำงานกับชุดข้อมูลขนาดใหญ่ เมื่อทดสอบซอฟต์แวร์ใหม่บางครั้งสคริปต์จะแอบเข้ามาหาฉันคว้า RAM ที่มีอยู่ทั้งหมดอย่างรวดเร็วและทำให้เดสก์ท็อปของฉันใช้ไม่ได้ ฉันต้องการวิธีตั้งค่าขีด จำกัด RAM สำหรับกระบวนการเพื่อให้เกินจำนวนที่กำหนดกระบวนการนั้นจะถูกฆ่าโดยอัตโนมัติ วิธีแก้ปัญหาเฉพาะภาษาอาจใช้ไม่ได้เนื่องจากฉันใช้เครื่องมือต่าง ๆ ทุกประเภท (R, Perl, Python, Bash ฯลฯ )

ดังนั้นจะมีการตรวจสอบกระบวนการบางอย่างที่จะให้ฉันตั้งค่าจำนวน threshold ของ RAM และฆ่ากระบวนการโดยอัตโนมัติหากใช้มากขึ้นหรือไม่



@ Uri: ที่หัวข้อนั้นฉันได้เพียงบางส่วน (เฉพาะส่วน cpu ของคำถามของฉัน) - และไม่ดีที่สุด - คำตอบ เขาถามเกี่ยวกับการใช้ RAM
Chriskin

1
Uri มีความคิดที่เป็นประโยชน์ขาดในหัวข้อนั้น การโพสต์ลิงก์ไปยังลิงก์นั้นไม่มีประโยชน์อย่างยิ่ง
chrisamiller

1
Hrmm - เธรด superuser นี้ดูเหมือนจะมีคำแนะนำที่สมเหตุสมผลโดยใช้ ulimit: superuser.com/questions/66383/restrict-ram-for-user-or-process-or-process
chrisamiller

คำตอบ:


11

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

https://github.com/pshved/timeout

ฉันจะให้ช็อตนี้ก่อน แต่ให้ upvotes กับ Amey Jah เพื่อคำตอบที่ดี ฉันจะตรวจสอบว่าอันนี้ทำให้ฉันไม่ได้


5
+1 ตอบคำถามของคุณเองก็โอเค !
Tom Brossman

10

ฉันจะขอแนะนำไม่ได้ที่จะทำมัน ตามที่แนะนำโดย @chrisamiller การตั้งค่า ulimit จะ จำกัด RAM ที่ใช้ได้กับกระบวนการ

แต่ก็ยังถ้าคุณยืนยันแล้วทำตามขั้นตอนนี้

  1. บันทึกสคริปต์ต่อไปนี้เป็นkillif.sh:

    #!/bin/sh
    
    if [ $# -ne 2 ];
    then
        echo "Invalid number of arguments"
        exit 0
    fi
    
    while true;
    do
        SIZE=$(pmap $1|grep total|grep -o "[0-9]*")
        SIZE=${SIZE%%K*}
        SIZEMB=$((SIZE/1024))
        echo "Process id =$1 Size = $SIZEMB MB"
        if [ $SIZEMB -gt $2 ]; then
            printf "SIZE has exceeded.\nKilling the process......"
            kill -9 "$1"
            echo "Killed the process"
            exit 0
        else
            echo "SIZE has not yet exceeding"
        fi
    
        sleep 10
    done
  2. ตอนนี้ทำให้มันปฏิบัติการได้

    chmod +x killif.sh
    
  3. ตอนนี้เรียกใช้สคริปต์นี้ใน terminal แทนที่PROCIDด้วย id กระบวนการจริงและSIZEมีขนาดเป็น MB

    ./killif.sh PROCID SIZE
    

    ตัวอย่างเช่น:

    ./killif.sh 132451 100
    

    หากSIZEเป็น 100 กระบวนการจะถูกทำลายหากการใช้ RAM สูงกว่า 100 MB

ข้อควรระวัง:คุณรู้ว่าคุณกำลังพยายามทำอะไร กระบวนการฆ่าไม่ใช่ความคิดที่ดี หากกระบวนการนั้นมีคำสั่งปิดหรือหยุดใด ๆ ให้แก้ไขสคริปต์และแทนที่kill -9คำสั่งด้วยshutdownคำสั่งนั้น


ฉันจะพิจารณาวางนอนน้อยมีตัวอย่างเช่นการนอนหลับ 0.5 ...
Denwerko

@ George Edison คุณทำยังไง เมื่อฉันพยายามที่จะวางมันก็ทำให้ฉันจัดรูปแบบข้อความแปลก ๆ Denwerko: คุณอยากนอนที่ไหน ฉันนอนหลับไปแล้ว 10 วินาทีในขณะที่ลูป
Amey Jah

2
ขอบคุณสำหรับการแก้ปัญหาดังที่ระบุไว้ด้านล่างฉันอาจลองดู เหตุใดคำเตือนที่น่ากลัวทั้งหมดเกี่ยวกับกระบวนการฆ่า ซอฟต์แวร์การจัดการคลัสเตอร์ (LSF, PBS และอื่น ๆ ) ทำสิ่งนี้ตลอดเวลาเมื่อกระบวนการเกินจำนวนทรัพยากรที่ร้องขอโดยไม่มีผลกระทบร้ายแรง ฉันยอมรับว่านี่ไม่ใช่วิธีแก้ปัญหาที่ดีสำหรับผู้ใช้ใหม่ที่มีแนวโน้มที่จะนำไปใช้ในทางที่ผิด แต่ในสถานการณ์ที่เหมาะสมจะมีประโยชน์มาก
chrisamiller

@ chrisamiller ฉันได้เตือนผู้อ่านในอนาคตแล้ว ในกรณีของคุณคุณรู้ถึงความหมาย แต่ผู้อ่านในอนาคตของโพสต์นี้อาจไม่ได้ตระหนักถึงความหมายดังกล่าว
Amey Jah

2
คุณช่วยอธิบายได้ไหมว่าทำไมไม่ทำอย่างนั้น?
jterm

2

ลองใช้prlimitเครื่องมือจากutil-linuxแพ็คเกจ มันรันโปรแกรมด้วยข้อ จำกัด ของทรัพยากร ใช้การprlimitเรียกระบบเพื่อตั้งค่าขีด จำกัด ซึ่งบังคับใช้โดยเคอร์เนลเท่านั้น

คุณสามารถกำหนดค่าขีด จำกัด 16 ข้อ ได้แก่ :

  • จำนวนเวลา CPU สูงสุดในไม่กี่วินาที
  • จำนวนกระบวนการผู้ใช้สูงสุด
  • ขนาดชุดที่อยู่อาศัยสูงสุด ("หน่วยความจำที่ใช้")
  • ขนาดสูงสุดที่กระบวนการอาจล็อคเข้าสู่หน่วยความจำ
  • ขนาดของหน่วยความจำเสมือน
  • จำนวนไฟล์ที่เปิดสูงสุด
  • จำนวนการล็อคไฟล์สูงสุด
  • จำนวนสัญญาณสูงสุดที่รอดำเนินการ
  • ไบต์สูงสุดในคิวข้อความ POSIX

0

นี่ใหญ่เกินไปที่จะใส่ความคิดเห็น ฉันแก้ไขสคริปต์ดั้งเดิมของ Amey เพื่อรวม a pgrepดังนั้นแทนที่จะต้องป้อน id กระบวนการด้วยตนเองคุณสามารถแยกชื่อได้ ตัวอย่างเช่น./killIf.sh chrome 4000ฆ่ากระบวนการ chrome ใด ๆ ที่เกินกว่า 4GB ในการใช้หน่วยความจำ

#!/bin/sh

# $1 is process name
# $2 is memory limit in MB

if [ $# -ne 2 ];
then
    echo "Invalid number of arguments"
    exit 0
fi

while true;
do
    pgrep "$1" | while read -r procId;
    do
        SIZE=$(pmap $procId | grep total | grep -o "[0-9]*")
        SIZE=${SIZE%%K*}
        SIZEMB=$((SIZE/1024))
        echo "Process id = $procId Size = $SIZEMB MB"
        if [ $SIZEMB -gt $2 ]; then
            printf "SIZE has exceeded.\nKilling the process......"
            kill -9 "$procId"
            echo "Killed the process"
            exit 0
        else
            echo "SIZE has not yet exceeding"
        fi
    done

    sleep 1
done

ระมัดระวังในการเลือกสาย grep ที่แคบและ จำกัด หน่วยความจำให้ใหญ่พอที่จะไม่ฆ่ากระบวนการที่ไม่ได้ตั้งใจโดยไม่จำเป็น

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