Menjalankan perintah apa pun mengembalikan "Tidak dapat mengalokasikan memori" di Server Ubuntu

16

Saya menggunakan Ubuntu 14.04. Baru-baru ini, ketika saya masuk melalui SSH dengan pengguna saya dengan hak sudo, setiap perintah yang saya jalankan menghasilkan kesalahan "Tidak dapat mengalokasikan memori". Berikut adalah beberapa yang saya coba di konsol saya

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

Bahkan jika saya mencoba, sudo reboot nowsaya mendapatkan kesalahan di atas, jadi saya tidak tahu apa lagi yang bisa saya coba untuk membuka contoh saya. Tuan rumah adalah DigitalOcean jika itu penting.

Sunting: Per jawaban / saran yang diberikan di sini adalah output dari "gratis"

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

Jawaban:

12

Larutan

Seperti yang tertulis di pesan kesalahan, mesin Anda kehabisan memori. Ini bisa karena beberapa alasan, tetapi pada dasarnya, ada sesuatu yang menghabiskan semua ingatan Anda dan tidak meninggalkan yang tersisa untuk penggunaan perintah dasar sekalipun.

Saya menyarankan agar Anda me-reboot tetesan Anda (buka saja panel kontrol klien Anda dan pilih "Reboot"), sshkemudian jalankan topatau htop. Mengawasi penggunaan memori dan melihat proses apa yang menggunakan semua memori. Dari sana, cobalah

  1. Membunuh / Menghapus program / proses yang salah

    PERINGATAN : Tolong lakukan riset tentang apakah proses tersebut merupakan proses sistem yang penting, pertama! Jika suatu proses sistem menyebabkan masalah memori, jangan hanya membunuhnya, lakukan penelitian dan cara-cara spesifik untuk menghadapinya.
  2. Mengubah konfigurasi untuk program / proses itu sehingga tidak memakan semua memori Anda.

Saran untuk mencegah masalah tidak terjadi lagi

  • Sesuatu yang baik untuk dilakukan adalah menambahkan memori swap , karena ia mengalokasikan lebih banyak memori jika Anda kehabisan.
  • Setiap kali Anda menginstal program, pastikan Anda mengkonfigurasinya dengan benar sehingga mereka tidak melakukan dengan cara yang tidak diinginkan (seperti menghabiskan memori)
  • Setelah setiap kali Anda menambahkan paket atau pada dasarnya apa pun yang baru dikonfigurasi, periksa dengan htopatau topuntuk melihat berapa banyak memori yang Anda gunakan dengan program saat ini. Jika Anda memperhatikan bahwa Anda menggunakan hampir semuanya, coba dan hapus beberapa dengan melalui dan menghapus program / proses yang tidak perlu.
  • Jika ada sesuatu yang dimulai secara otomatis (selain proses sistem, tentu saja!) Yang tidak Anda kenali atau ingin dimulai secara otomatis, hapus! Tetapi selalu lakukan riset Anda tentang apa prosesnya sebelum mematikan / menghapusnya, karena itu bisa sangat penting untuk prosedur bootup atau fungsi sistem, dll.
TheOdd
sumber
7

Untuk keluar dari kondisi ini tanpa me-reboot, Anda dapat memicu pembunuh OOM secara manual sebagai berikut:

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

Referensi

Luke F
sumber
Apakah Anda memiliki dokumentasi yang mendukung perintah itu? Mengapa tidak adil sudo sysctl -w vm.oom_kill_allocating_task=1atau tidak aktif/etc/sysctl.conf .
Pablo Bianchi
1
Tidak terdengar seperti itu akan membuat perbedaan, sistem tidak mengenai kondisi OOM yang sebenarnya jika ini terjadi saat istirahat karena tidak ada proses yang mencoba mengalokasikan memori dan tidak ada proses tambahan yang dapat dimulai. Dan semi-tidak terkait tetapi Anda tidak akan dapat menggunakan sudo atau sysctl sekali dalam kondisi ini.
Luke F
Ini berhasil untuk saya. Tidak tahu bagaimana, tidak peduli. Aku bahkan tidak bisa berlari sudo rebootsebelum menjalankan ini. Terima kasih!
boulder_ruby
0

Dalam menyelesaikan jawaban yang diterima ada satu hal tambahan yang perlu dipertimbangkan: Sistem Anda mungkin kehabisan file menangani atau bahkan buffer socket dan masih memiliki banyak memori sementara memberikan kesalahan yang sama. Ini terutama berlaku jika hosting bersama memberlakukan batasan seperti itu. Pada sistem OpenVZ, tonton konten

# cat / proc / user_beancounters

Ini akan memberi Anda di kolom paling kanan overruns pertama. Jika ini benar, baik pindah ke paket hosting yang lebih besar atau cari pelakunya yang paling mungkin: database mysql atau mariadb yang mungkin, di hadapan aplikasi PHP yang rusak, bocor menangani file ke ratusan per detik.

Ini juga dapat terjadi jika server web Anda telah membuka ssh ke internet dan menerima login nama pengguna / kata sandi: bahkan jika Anda telah menjalankan jalan2 gagal, Anda mungkin telah menarik kamus break terdistribusi dalam upaya yang juga menghabiskan banyak sumber daya.

aquaherd
sumber