การเรียกใช้คำสั่งใด ๆ จะส่งคืน“ ไม่สามารถจัดสรรหน่วยความจำได้” บน Ubuntu Server


16

ฉันใช้ Ubuntu 14.04 เมื่อเร็ว ๆ นี้เมื่อฉันเข้าสู่ระบบผ่าน SSH ด้วยผู้ใช้ของฉันด้วยสิทธิ์ sudo ทุกคำสั่งที่ฉันเรียกใช้ผลลัพธ์ในข้อผิดพลาด "ไม่สามารถจัดสรรหน่วยความจำ" นี่คือบางส่วนที่ฉันลองที่คอนโซล

myuser@mymachine:~$ whoami
-bash: fork: Cannot allocate memory
myuser@mymachine:~$ uname -a
-bash: fork: Cannot allocate memory

แม้ว่าฉันจะลองsudo reboot nowฉันพบข้อผิดพลาดด้านบน แต่ฉันก็ไม่รู้ว่าจะพยายามปลดล็อกอินสแตนซ์ของฉันได้อย่างไร โฮสต์คือ DigitalOcean หากเป็นเรื่องสำคัญ

แก้ไข:ต่อคำตอบ / ข้อเสนอแนะที่นี่คือผลลัพธ์ของ "ฟรี"

myuser@mymachine:~$ free
-bash: fork: Cannot allocate memory

คำตอบ:


12

วิธีการแก้

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

ผมขอแนะนำว่าคุณรีบูตหยดของคุณ (เพียงแค่ไปที่แผงควบคุมของลูกค้าของคุณและเลือก "Reboot") sshและจากนั้นเรียกใช้หรือtop htopคอยดูการใช้งานหน่วยความจำและดูว่ากระบวนการใดกำลังใช้หน่วยความจำทั้งหมดหมด จากตรงนั้นลอง

  1. การฆ่า / ลบโปรแกรม / กระบวนการที่ผิดพลาด

    คำเตือน : โปรดทำวิจัยของคุณหากกระบวนการเป็นกระบวนการที่สำคัญของระบบก่อน! หากกระบวนการของระบบเป็นสาเหตุของปัญหาหน่วยความจำอย่าเพิ่งฆ่าทำการค้นคว้าและหาวิธีจัดการกับมัน
  2. การเปลี่ยนการกำหนดค่าสำหรับโปรแกรม / กระบวนการนั้นเพื่อไม่ให้หน่วยความจำหมด

ข้อเสนอแนะสำหรับการป้องกันไม่ให้ปัญหาเกิดขึ้นอีกครั้ง

  • สิ่งที่ควรทำคือการเพิ่มหน่วยความจำ swapเนื่องจากมันจัดสรรหน่วยความจำมากขึ้นหากคุณใช้งานไม่ได้
  • เมื่อใดก็ตามที่คุณติดตั้งโปรแกรมตรวจสอบให้แน่ใจว่าคุณกำหนดค่าอย่างถูกต้องเพื่อไม่ให้ทำงานในลักษณะที่ไม่ได้ตั้งใจ (เช่นการกินหน่วยความจำ)
  • หลังจากแต่ละครั้งที่คุณเพิ่มแพ็กเกจหรือโดยทั่วไปมีการกำหนดค่าใหม่ให้ตรวจสอบด้วยhtopหรือtopเพื่อดูจำนวนหน่วยความจำที่คุณใช้กับโปรแกรมปัจจุบัน หากคุณสังเกตเห็นว่าคุณกำลังใช้งานเกือบทั้งหมดให้ลองและล้างบางส่วนออกด้วยการทำตามและลบโปรแกรม / กระบวนการที่ไม่จำเป็นออก
  • หากมีสิ่งใดที่เริ่มต้นโดยอัตโนมัติ (นอกเหนือจากกระบวนการของระบบแน่นอน!) ที่คุณไม่รู้จักหรือต้องการเริ่มโดยอัตโนมัติให้ลบออก! แต่ทำวิจัยของคุณเสมอเกี่ยวกับกระบวนการก่อนที่จะฆ่า / ลบมันเพราะมันอาจจำเป็นสำหรับขั้นตอนการบูทระบบหรือฟังก์ชั่นระบบ ฯลฯ

7

ในการออกจากสภาวะนี้โดยไม่ต้องรีบูตเครื่องคุณสามารถเปิดOOM killerด้วยตนเองดังนี้:

echo 1 > /proc/sys/kernel/sysrq
echo f > /proc/sysrq-trigger
echo 0 > /proc/sys/kernel/sysrq

การอ้างอิง


คุณมีเอกสารประกอบที่สนับสนุนคำสั่งเหล่านั้นหรือไม่? ทำไมไม่เพียงหรือถาวรsudo sysctl -w vm.oom_kill_allocating_task=1 /etc/sysctl.conf
Pablo Bianchi

1
ไม่ดูเหมือนว่าจะสร้างความแตกต่างระบบจะไม่เข้าสู่เงื่อนไข OOM จริงหากเกิดเหตุการณ์นี้ขึ้นเนื่องจากไม่มีกระบวนการใดที่พยายามจัดสรรหน่วยความจำและไม่สามารถเริ่มกระบวนการเพิ่มเติมได้ และกึ่งไม่เกี่ยวข้อง แต่คุณจะไม่สามารถใช้ sudo หรือ sysctl ครั้งเดียวในสถานะนี้
ลุค F

สิ่งนี้ใช้ได้สำหรับฉัน ไม่รู้วิธีไม่สนใจ ฉันไม่สามารถวิ่งได้sudo rebootก่อนใช้งานสิ่งนี้ ขอบคุณ!
boulder_ruby

0

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

# cat / proc / user_beancounters

สิ่งนี้จะให้คุณในคอลัมน์ขวาสุดของการบุกรุกครั้งแรก หากเป็นจริงให้ย้ายไปที่แพ็คเกจโฮสติ้งที่มีขนาดใหญ่กว่าหรือค้นหาผู้กระทำผิดที่น่าจะเป็นไปได้มากที่สุด: ฐานข้อมูล mysql หรือ mariadb ซึ่งอาจมีแอพ PHP ที่มีข้อบกพร่อง

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

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