Apa yang membunuh proses saya dan mengapa?


614

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?


23
linux membunuh proses saya dan login di / var / log / messages di redhat
Dean Hiller

1
Lihat juga jawaban ini di unix.stackexchange.com.
Richard

Ada 3 pemain dalam acara ini: (1) Proses yang (penyebab umum) mengambil terlalu banyak memori dan menyebabkan kondisi OOM (2) Kernel yang mengirimkan SIGKILL (sinyal 9) untuk menghentikannya dan mencatat fakta di beberapa sistem log seperti /var/log/messages(3) Shell tempat proses berjalan yang merupakan proses yang mencetak Killednotifikasi ketika status keluar dari waitpid(2)menunjukkan proses anak meninggal karena sinyal 9.
arielf

Setelah membaca jawaban @ DeanHiller, saya menemukan pesan log di Ubuntu di bawah/var/log/syslog
Dinei

Jawaban:


403

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).


25
Jika kernel membunuh proses apakah itu akan menempatkan pesan di log di suatu tempat?
sbq

186
Saya baru saja menulis sebuah program yang memori malloc'd dalam loop inifite. Setelah sistem menjadi lambat, "Dibunuh" ditampilkan di terminal dan proses dihentikan. File /var/log/kern.log berisi banyak info tentang penghentian. -Terima kasih atas penunjuknya.
sbq

6
Itu hampir pasti. Saya melihat ini banyak ketika TAing. Banyak siswa akan lupa untuk membebaskan objek mereka, dan aplikasi pada akhirnya akan mencapai 3GB penggunaan memori virtual. Begitu mencapai titik itu ia terbunuh.
Herms

8
Ketika "Program hanya crash", yang merupakan OS benar-benar membunuh proses!
Bernd Jendrissek

79
Gunakan dmesguntuk melihat log kernel: di sini saya menemukan proses python saya terbunuh oleh kernel karena konsumsi memori virtual yang ekstrim.
caneta

273

Mencoba:

dmesg -T| grep -E -i -B100 'killed process'

Di mana -B100menandakan jumlah garis sebelum pembunuhan terjadi.

Hapus -T di Mac OS.


6
FYI, dari info egrep: "egrep sama dengan grep -E. ... Doa langsung karena egrep atau fgrep sudah tidak digunakan lagi"
Air

9
Dalam hal pola sederhana seperti 'killed process'Anda hanya dapat menggunakan grepalih-alih egreptanpa perubahan lainnya. Untuk pola yang lebih kompleks, Anda akan mengganti ganti mis egrep -i -B100 'foo|ba[rz]'dengan grep -E -i -B100 'foo|ba[rz]'. T&J ini memberikan lebih banyak detail.
Air

2
Saya juga menyarankan menggunakan dmesg -Tuntuk mendapatkan cap waktu yang dapat dibaca
gukoff

171

Ini 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.


3
Saya sangat suka tautan artikel. Saya sarankan siapa saja yang tertarik dengan topik untuk membacanya - terutama komentar pada artikel lwn.
Jon Bringhurst

4
"Linux akan memberikan ruang itu, bahkan jika diklaim oleh proses lain" Itu bukan cara kerja memori virtual ...
Mooing Duck

1
artikelnya sudah cukup tua (2009) dan tidak semua fungsi yang disarankan dalam artikel berada di jalur utama.
Alex

50

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:

  1. Tingkatkan memori (bukan swap)
  2. Temukan kebocoran memori di program Anda dan perbaiki
  3. Batasi memori yang dapat dikonsumsi oleh proses apa pun (misalnya memori JVM dapat dibatasi menggunakan JAVA_OPTS)
  4. Lihat log dan google :)

17

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.

sudo journalctl -xb

Anda akan melihat pesan seperti:

Jul 20 11:05:00 someapp kernel: Mem-Info:
Jul 20 11:05:00 someapp kernel: Node 0 DMA per-cpu:
Jul 20 11:05:00 someapp kernel: CPU    0: hi:    0, btch:   1 usd:   0
Jul 20 11:05:00 someapp kernel: Node 0 DMA32 per-cpu:
Jul 20 11:05:00 someapp kernel: CPU    0: hi:  186, btch:  31 usd:  30
Jul 20 11:05:00 someapp kernel: active_anon:206043 inactive_anon:6347 isolated_anon:0
                                    active_file:722 inactive_file:4126 isolated_file:0
                                    unevictable:0 dirty:5 writeback:0 unstable:0
                                    free:12202 slab_reclaimable:3849 slab_unreclaimable:14574
                                    mapped:792 shmem:12802 pagetables:1651 bounce:0
                                    free_cma:0
Jul 20 11:05:00 someapp kernel: Node 0 DMA free:4576kB min:708kB low:884kB high:1060kB active_anon:10012kB inactive_anon:488kB active_file:4kB inactive_file:4kB unevictable:0kB isolated(anon):0kB isolated(file):0kB present
Jul 20 11:05:00 someapp kernel: lowmem_reserve[]: 0 968 968 968
Jul 20 11:05:00 someapp kernel: Node 0 DMA32 free:44232kB min:44344kB low:55428kB high:66516kB active_anon:814160kB inactive_anon:24900kB active_file:2884kB inactive_file:16500kB unevictable:0kB isolated(anon):0kB isolated
Jul 20 11:05:00 someapp kernel: lowmem_reserve[]: 0 0 0 0
Jul 20 11:05:00 someapp kernel: Node 0 DMA: 17*4kB (UEM) 22*8kB (UEM) 15*16kB (UEM) 12*32kB (UEM) 8*64kB (E) 9*128kB (UEM) 2*256kB (UE) 3*512kB (UM) 0*1024kB 0*2048kB 0*4096kB = 4580kB
Jul 20 11:05:00 someapp kernel: Node 0 DMA32: 216*4kB (UE) 601*8kB (UE) 448*16kB (UE) 311*32kB (UEM) 135*64kB (UEM) 74*128kB (UEM) 5*256kB (EM) 0*512kB 0*1024kB 1*2048kB (R) 0*4096kB = 44232kB
Jul 20 11:05:00 someapp kernel: Node 0 hugepages_total=0 hugepages_free=0 hugepages_surp=0 hugepages_size=2048kB
Jul 20 11:05:00 someapp kernel: 17656 total pagecache pages
Jul 20 11:05:00 someapp kernel: 0 pages in swap cache
Jul 20 11:05:00 someapp kernel: Swap cache stats: add 0, delete 0, find 0/0
Jul 20 11:05:00 someapp kernel: Free swap  = 0kB
Jul 20 11:05:00 someapp kernel: Total swap = 0kB
Jul 20 11:05:00 someapp kernel: 262141 pages RAM
Jul 20 11:05:00 someapp kernel: 7645 pages reserved
Jul 20 11:05:00 someapp kernel: 264073 pages shared
Jul 20 11:05:00 someapp kernel: 240240 pages non-shared
Jul 20 11:05:00 someapp kernel: [ pid ]   uid  tgid total_vm      rss nr_ptes swapents oom_score_adj name
Jul 20 11:05:00 someapp kernel: [  241]     0   241    13581     1610      26        0             0 systemd-journal
Jul 20 11:05:00 someapp kernel: [  246]     0   246    10494      133      22        0         -1000 systemd-udevd
Jul 20 11:05:00 someapp kernel: [  264]     0   264    29174      121      26        0         -1000 auditd
Jul 20 11:05:00 someapp kernel: [  342]     0   342    94449      466      67        0             0 NetworkManager
Jul 20 11:05:00 someapp kernel: [  346]     0   346   137495     3125      88        0             0 tuned
Jul 20 11:05:00 someapp kernel: [  348]     0   348    79595      726      60        0             0 rsyslogd
Jul 20 11:05:00 someapp kernel: [  353]    70   353     6986       72      19        0             0 avahi-daemon
Jul 20 11:05:00 someapp kernel: [  362]    70   362     6986       58      18        0             0 avahi-daemon
Jul 20 11:05:00 someapp kernel: [  378]     0   378     1621       25       8        0             0 iprinit
Jul 20 11:05:00 someapp kernel: [  380]     0   380     1621       26       9        0             0 iprupdate
Jul 20 11:05:00 someapp kernel: [  384]    81   384     6676      142      18        0          -900 dbus-daemon
Jul 20 11:05:00 someapp kernel: [  385]     0   385     8671       83      21        0             0 systemd-logind
Jul 20 11:05:00 someapp kernel: [  386]     0   386    31573      153      15        0             0 crond
Jul 20 11:05:00 someapp kernel: [  391]   999   391   128531     2440      48        0             0 polkitd
Jul 20 11:05:00 someapp kernel: [  400]     0   400     9781       23       8        0             0 iprdump
Jul 20 11:05:00 someapp kernel: [  419]     0   419    27501       32      10        0             0 agetty
Jul 20 11:05:00 someapp kernel: [  855]     0   855    22883      258      43        0             0 master
Jul 20 11:05:00 someapp kernel: [  862]    89   862    22926      254      44        0             0 qmgr
Jul 20 11:05:00 someapp kernel: [23631]     0 23631    20698      211      43        0         -1000 sshd
Jul 20 11:05:00 someapp kernel: [12884]     0 12884    81885     3754      80        0             0 firewalld
Jul 20 11:05:00 someapp kernel: [18130]     0 18130    33359      291      65        0             0 sshd
Jul 20 11:05:00 someapp kernel: [18132]  1000 18132    33791      748      64        0             0 sshd
Jul 20 11:05:00 someapp kernel: [18133]  1000 18133    28867      122      13        0             0 bash
Jul 20 11:05:00 someapp kernel: [18428]    99 18428   208627    42909     151        0             0 node
Jul 20 11:05:00 someapp kernel: [18486]    89 18486    22909      250      46        0             0 pickup
Jul 20 11:05:00 someapp kernel: [18515]  1000 18515   352905   141851     470        0             0 npm
Jul 20 11:05:00 someapp kernel: [18520]     0 18520    33359      291      66        0             0 sshd
Jul 20 11:05:00 someapp kernel: [18522]  1000 18522    33359      294      64        0             0 sshd
Jul 20 11:05:00 someapp kernel: [18523]  1000 18523    28866      115      12        0             0 bash
Jul 20 11:05:00 someapp kernel: Out of memory: Kill process 18515 (npm) score 559 or sacrifice child
Jul 20 11:05:00 someapp kernel: Killed process 18515 (npm) total-vm:1411620kB, anon-rss:567404kB, file-rss:0kB

12

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:

  1. Berikan sistem Anda lebih banyak RAM jika Anda bisa (mudah jika itu VM)
  2. Pastikan pembunuh OOM memilih proses yang berbeda.
  3. Nonaktifkan Pembunuh OOM
  4. Pilih distro Linux yang dikirimkan dengan OOM Killer dinonaktifkan.

Saya menemukan (2) sangat mudah diimplementasikan, berkat artikel ini .


2
Itu adalah RAM untuk saya. Saya memutakhirkan 2 hingga 4GB RAM dan masalah hilang. Sekarang masalahnya adalah dengan tagihan: P
Gus

9

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.


8

Alat seperti systemtap (atau pelacak) dapat memonitor logika dan laporan transmisi sinyal kernel. misalnya, https://sourceware.org/systemtap/examples/process/sigmon.stp

# stap .../sigmon.stp -x 31994 SIGKILL
   SPID     SNAME            RPID  RNAME            SIGNUM SIGNAME
   5609     bash             31994 find             9      SIGKILL

ifBlok 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 a print_backtrace()dan / atau print_ubacktrace()ke probe, untuk kernel- dan userspace- masing-masing).


4

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 ulimithasilnya Killedsudah lama sejak saya membutuhkannya.


2

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.


1
IIRC, OOMKiller hanya dipanggil sebagai upaya terakhir. Saya pikir sistem bahkan akan mengirim sinyal ke berbagai aplikasi meminta mereka untuk dengan ramah menyerahkan beberapa sumber daya sebelum dipaksa untuk memanggil OOMKiller. Ambil dengan sebutir garam, karena sudah lama ...
rmeador

1
Anda tidak bisa menjalankannya. Itu dipanggang ke dalam kernel, tetapi ada beberapa opsi untuk menyesuaikan cara kerjanya, dan bahkan proses mana yang kemungkinan besar akan dimatikan. Ini berjalan ketika seluruh sistem kehabisan memori, bukan ketika proses tertentu menggunakan terlalu banyak. Lihat jawaban saya untuk lebih jelasnya.
Adam Jaskiewicz

6
Tidak menjalankan oomkiller cukup mudah. echo "2" > /proc/sys/vm/overcommit_memory
R .. GitHub BERHENTI MEMBANTU ICE

Red Hat tidak ingin mengizinkannya diubah: sudo echo "2" > /proc/sys/vm/overcommit_memory/ proc / sys / vm / overcommit_memory: Izin ditolak
Brent Faust

2
Cobaecho 2 | sudo tee /proc/sys/vm/overcommit_memory
Hypershadsy

2

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=600dan --memory=1024memperbaiki masalah untuk saya.


0

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.


6
CTRL-C mengirimkan kill berbeda dari yang dilaporkan OP (SIGINT (2) seingat saya, sedangkan program menerima SIGKILL (9)).
Powerlord

0

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.


Saya melihat masalah yang sama. Bagaimana Anda melacak proses mana yang membunuh proses Anda? Tampaknya ada alat untuk memeriksa siapa yang mengirim SIGKILL ke suatu proses.
Howy

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.