Aplikasi saya berjalan sebagai proses latar belakang di Linux. Saat ini dimulai pada baris perintah di jendela Terminal.
Baru-baru ini seorang pengguna menjalankan aplikasi untuk sementara waktu dan itu mati secara misterius. Teks:
Terbunuh
berada di terminal. Ini terjadi dua kali. Saya bertanya apakah seseorang di Terminal yang berbeda menggunakan perintah kill untuk menghentikan proses? Tidak.
Dalam kondisi apa Linux memutuskan untuk menghentikan proses saya? Saya percaya shell ditampilkan "terbunuh" karena proses mati setelah menerima sinyal kill (9). Jika Linux mengirim sinyal kill, haruskah ada pesan di log sistem di suatu tempat yang menjelaskan mengapa ia terbunuh?
/var/log/messages
(3) Shell tempat proses berjalan yang merupakan proses yang mencetakKilled
notifikasi ketika status keluar dariwaitpid(2)
menunjukkan proses anak meninggal karena sinyal 9./var/log/syslog
Jawaban:
Jika pengguna atau sysadmin tidak mematikan program, kernel mungkin memilikinya. Kernel hanya akan membunuh proses dalam keadaan luar biasa seperti kelaparan sumber daya yang ekstrim (berpikir mem + swap kelelahan).
sumber
dmesg
untuk melihat log kernel: di sini saya menemukan proses python saya terbunuh oleh kernel karena konsumsi memori virtual yang ekstrim.Mencoba:
Di mana
-B100
menandakan jumlah garis sebelum pembunuhan terjadi.Hapus -T di Mac OS.
sumber
info egrep
: "egrep sama dengan grep -E. ... Doa langsung karena egrep atau fgrep sudah tidak digunakan lagi"'killed process'
Anda hanya dapat menggunakangrep
alih-alihegrep
tanpa perubahan lainnya. Untuk pola yang lebih kompleks, Anda akan mengganti ganti misegrep -i -B100 'foo|ba[rz]'
dengangrep -E -i -B100 'foo|ba[rz]'
. T&J ini memberikan lebih banyak detail.dmesg -T
untuk mendapatkan cap waktu yang dapat dibacaIni terlihat seperti artikel bagus tentang masalah ini: Menjinakkan pembunuh OOM .
Intinya adalah bahwa Linux overcommitsPenyimpanan. Ketika suatu proses meminta lebih banyak ruang, Linux akan memberikannya ruang, bahkan jika diklaim oleh proses lain, dengan asumsi bahwa tidak ada yang benar-benar menggunakan semua memori yang mereka minta. Proses akan mendapatkan penggunaan eksklusif dari memori yang telah dialokasikan ketika itu benar-benar menggunakannya, bukan ketika memintanya. Ini membuat alokasi menjadi cepat, dan mungkin memungkinkan Anda untuk "menipu" dan mengalokasikan lebih banyak memori daripada yang sebenarnya Anda miliki. Namun, begitu proses mulai menggunakan memori ini, Linux mungkin menyadari bahwa terlalu murah hati dalam mengalokasikan memori yang tidak dimilikinya, dan harus mematikan proses untuk membebaskan sebagian. Proses untuk dibunuh didasarkan pada skor dengan memperhitungkan runtime akun (proses yang berjalan lama lebih aman), penggunaan memori (proses serakah kurang aman), dan beberapa faktor lainnya, termasuk nilai yang dapat Anda sesuaikan untuk membuat proses lebih kecil kemungkinannya untuk dibunuh. Semuanya dijelaskan dalam artikel dengan lebih detail.
Sunting: Dan di sini ada artikel lain yang menjelaskan dengan sangat baik bagaimana suatu proses dipilih (dijelaskan dengan beberapa contoh kode kernel). Hal yang hebat tentang ini adalah bahwa ia memasukkan beberapa komentar tentang alasan di balik berbagai
badness()
aturan.sumber
Ijinkan saya menjelaskan kapan dan mengapa OOMKiller dipanggil?
Katakanlah Anda memiliki 512 RAM + 1GB Swap memory. Jadi secara teori, CPU Anda memiliki akses ke total memori virtual 1,5GB.
Sekarang, untuk beberapa waktu semuanya berjalan dengan baik dalam 1,5GB dari total memori. Tetapi tiba-tiba (atau secara bertahap) sistem Anda telah mulai menggunakan lebih banyak memori dan mencapai sekitar 95% dari total memori yang digunakan.
Sekarang katakanlah setiap proses telah meminta potongan memori besar dari kernel. Kernel memeriksa memori yang tersedia dan menemukan bahwa tidak ada cara untuk mengalokasikan proses Anda lebih banyak memori. Jadi itu akan mencoba untuk membebaskan memori memanggil / memanggil OOMKiller ( http://linux-mm.org/OOM ).
OOMKiller memiliki algoritma sendiri untuk menilai peringkat untuk setiap proses. Biasanya proses mana yang menggunakan lebih banyak memori menjadi korban untuk dibunuh.
Di mana saya dapat menemukan log OOMKiller?
Biasanya dalam direktori / var / log. Baik /var/log/kern.log atau / var / log / dmesg
Semoga ini bisa membantu Anda.
Beberapa solusi khas:
sumber
Ini adalah Linux out of memory manager (OOM) . Proses Anda dipilih karena ' kejahatan ' - kombinasi dari kebaruan, ukuran penduduk (memori digunakan, bukan hanya dialokasikan) dan faktor lainnya.
Anda akan melihat pesan seperti:
sumber
Seperti dwc dan Adam Jaskiewicz telah nyatakan, pelakunya kemungkinan adalah Pembunuh OOM. Namun, pertanyaan selanjutnya yang berikut adalah: Bagaimana saya mencegah ini?
Ada beberapa cara:
Saya menemukan (2) sangat mudah diimplementasikan, berkat artikel ini .
sumber
The PAM modul untuk sumber batas yang disebabkan persis hasil yang Anda dijelaskan: proses saya meninggal secara misterius dengan teks Tewas di jendela konsol. Tidak ada output log, baik di syslog maupun di kern.log . Program teratas membantu saya menemukan bahwa tepat setelah satu menit penggunaan CPU proses saya terbunuh.
sumber
Alat seperti systemtap (atau pelacak) dapat memonitor logika dan laporan transmisi sinyal kernel. misalnya, https://sourceware.org/systemtap/examples/process/sigmon.stp
if
Blok filter dalam skrip itu dapat disesuaikan dengan selera, atau dihilangkan untuk melacak lalu lintas sinyal seluruh sistem. Penyebab dapat diisolasi lebih lanjut dengan mengumpulkan backtraces (tambahkan aprint_backtrace()
dan / atauprint_ubacktrace()
ke probe, untuk kernel- dan userspace- masing-masing).sumber
Dalam lingkungan lsf (interaktif atau sebaliknya) jika aplikasi melebihi pemanfaatan memori melampaui ambang batas yang ditetapkan oleh admin pada antrian atau permintaan sumber daya dalam mengirimkan ke antrian proses akan dibunuh sehingga pengguna lain tidak menjadi korban potensi melarikan diri. Itu tidak selalu mengirim email ketika melakukannya, tergantung pada bagaimana pengaturannya.
Salah satu solusi dalam hal ini adalah menemukan antrian dengan sumber daya yang lebih besar atau menentukan persyaratan sumber daya yang lebih besar dalam pengiriman.
Anda mungkin juga ingin mengulas
man ulimit
Meskipun saya tidak ingat
ulimit
hasilnyaKilled
sudah lama sejak saya membutuhkannya.sumber
Kami memiliki masalah berulang di Linux di situs pelanggan (Red Hat, saya pikir), dengan OOMKiller (out-of-memory killer) membunuh kedua aplikasi utama kami (yaitu alasan server ada) dan proses basis data.
Dalam setiap kasus, OOMKiller hanya memutuskan bahwa prosesnya menggunakan banyak sumber daya ... mesin itu bahkan tidak akan gagal karena kekurangan sumber daya. Baik aplikasi maupun basis datanya memiliki masalah dengan kebocoran memori (atau kebocoran sumber daya lainnya).
Saya bukan ahli Linux, tetapi saya lebih suka mengumpulkan algoritma untuk memutuskan kapan untuk membunuh sesuatu dan apa yang harus dibunuh itu kompleks. Juga, saya diberitahu (saya tidak dapat berbicara tentang keakuratan ini) bahwa OOMKiller dimasukkan ke dalam Kernel dan Anda tidak bisa tidak menjalankannya.
sumber
echo "2" > /proc/sys/vm/overcommit_memory
sudo echo "2" > /proc/sys/vm/overcommit_memory
/ proc / sys / vm / overcommit_memory: Izin ditolakecho 2 | sudo tee /proc/sys/vm/overcommit_memory
Dalam kasus saya ini terjadi dengan pekerja antrian Laravel. Log sistem tidak menyebutkan pembunuhan, jadi saya melihat lebih jauh dan ternyata pekerja itu pada dasarnya bunuh diri karena pekerjaan yang melebihi batas memori (yang diatur ke 128M secara default).
Menjalankan pekerja antrian dengan
--timeout=600
dan--memory=1024
memperbaiki masalah untuk saya.sumber
Pengguna memiliki kemampuan untuk membunuh programnya sendiri, menggunakan kill atau Control + C, tapi saya mendapat kesan bukan itu yang terjadi, dan bahwa pengguna mengeluh kepada Anda.
root memiliki kemampuan untuk membunuh program tentu saja, tetapi jika seseorang memiliki root pada mesin Anda dan membunuh hal-hal Anda memiliki masalah yang lebih besar.
Jika Anda bukan sysadmin, sysadmin mungkin telah mengatur kuota pada CPU, RAM, penggunaan disk ort dan proses auto-kill yang melebihi mereka.
Selain dugaan itu, saya tidak yakin tanpa info lebih lanjut tentang program ini.
sumber
Saya mengalami masalah ini belakangan ini. Akhirnya, saya menemukan proses saya terhenti tepat setelah pembaruan zypper opensuse dipanggil secara otomatis. Untuk menonaktifkan pembaruan zypper memecahkan masalah saya.
sumber
Memecahkan masalah ini dengan meningkatkan ukuran swap :
/ubuntu/1075505/how-do-i-increase-swapfile-in-ubuntu-18-04
sumber