วิธีกำหนดวงเงินหน่วยความจำบนเชลล์สคริปต์


10

ฉันมีสคริปต์ PHP ที่ในขณะที่โฟลเดอร์มีไฟล์ XML จะประมวลผลลงในฐานข้อมูล

ปัจจุบันเซิร์ฟเวอร์กำลังเรียกใช้ PHP เวอร์ชัน 5.3.10 และมีรายงานข้อผิดพลาดเกี่ยวกับปัญหาหน่วยความจำที่เกิดจากZEND_MM_HEAPภายในลูป

สิ่งนี้ทำให้ PHP ไม่เพิ่มหน่วยความจำอย่างเหมาะสมจึงนำไปสู่ข้อผิดพลาดและความผิดพลาดของสคริปต์:

 zend_mm_heap is corrupted

พบวิธีแก้ไขปัญหาบางอย่างแต่ฉันไม่สามารถเข้าถึงการตั้งค่าเซิร์ฟเวอร์

เพื่อจัดการกับสิ่งนี้ฉันได้เตรียมสคริปต์ทุบตีต่อไปนี้เพื่อดูแลลูปโดยปล่อยให้สคริปต์ PHP รับผิดชอบโดยการประมวลผลไฟล์ XML เท่านั้น:

#!/bin/bash

# Check for files to process
# If files are present, call
# the PHP script

DIR="/path/to/dir/with/files"
while [ "$(ls -A $DIR)" ]; do
        php /path/to/php/script/myscript.php
done

เป้าหมายของฉันในตอนนี้คือการจัดสรรหน่วยความจำ bash นี้มี จำกัด (หน่วยความจำและหน่วยความจำเสมือน) จึงป้องกันไม่ให้ระบบหยุดทำงานหากมีสิ่งผิดปกติเกิดขึ้น

คำถามของฉันคือ:
ฉันจะ จำกัด หน่วยความจำที่สคริปต์เปลือกนี้ใช้ในจำนวนที่กำหนดได้อย่างไร


1
export USE_ZEND_ALLOC=0โปรดทราบว่าคุณสามารถใช้เปลี่ยนวิธีการจัดสรรหน่วยความจำโดยการทำงาน
Pedro Cordeiro

คำตอบ:


12

คุณสามารถ จำกัด การใช้งานหน่วยความจำด้วย Bash Script โดยทำตาม

จำกัด การใช้หน่วยความจำโดย kb (2GB ในตัวอย่างนี้):

ulimit -m 2048000

จำกัด การใช้หน่วยความจำเสมือน:

ulimit -v 2048000

ตั้งค่าขีด จำกัด หน่วยความจำเสมือนเป็นขีด จำกัด สูงสุดดังนั้นกระบวนการจะถูกฆ่าเมื่อเกินขีด จำกัด นี้:

ulimit -H -v

ฉันคิดว่านี่สามารถทำสิ่งที่คุณต้องการ


1
ขีด จำกัด นี้นับรวมสำหรับกระบวนการลูกด้วยหรือไม่ ตัวอย่างเช่นถ้าฉันวางไข่ erlang ในสคริปต์ทุบตีนี้จะมีการ จำกัด หน่วยความจำหรือไม่?
Christophe De Troyer

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