Süreçimi ne öldürdü ve neden?


614

Uygulamam Linux'ta arka plan işlemi olarak çalışıyor. Şu anda bir Terminal penceresindeki komut satırında başlatılır.

Son zamanlarda bir kullanıcı uygulamayı bir süredir yürütüyordu ve gizemli bir şekilde öldü. Metin:

Öldürülen

terminalin üzerindeydi. Bu iki kez oldu. Farklı bir Terminalden birinin süreci öldürmek için kill komutunu kullanıp kullanmadığını sordum? Hayır.

Linux hangi koşullarda sürecimi öldürmeye karar verecek? Kabuğun "öldürülmüş" gösterdiğine inanıyorum çünkü kill (9) sinyalini aldıktan sonra süreç öldü. Linux öldürme sinyalini gönderdiyse, sistem kaydında neden öldürüldüğünü açıklayan bir mesaj olmalı mı?


23
linux sürecimi öldürdü ve redhat üzerinde / var / log / messages'da oturum açtı
Dean Hiller

1
Bu cevaba ayrıca unix.stackexchange.com adresinden de bakınız.
Richard

Bu etkinlikte 3 oyuncu vardır: (1) (ortak neden) çok fazla bellek alan ve OOM durumuna neden olan süreç (2) SIGKILL'i (sinyal 9) sonlandırmak ve bazı sistemlerde gerçeği günlüğe kaydetmek için çekirdek gibi log /var/log/messages(3), kabuk altında işlemdir işlem ran Yazdırabilen Killedçıkış durumu bildirim waitpid(2)alt işlem sinyali 9. öldü gösterir
arielf

@ DeanHiller'in cevabını okuduktan sonra Ubuntu'da günlük mesajları buldum/var/log/syslog
Dinei

Yanıtlar:


403

Kullanıcı veya sysadmin programı öldürmediyse, çekirdekte olabilir. Çekirdek, yalnızca aşırı kaynak açlığı (düşün mem + takas tükenmesi) gibi istisnai durumlarda bir süreci öldürür.


25
Çekirdek işlemi öldürürse, bir yere bir günlüğe bir mesaj koyar mı?
sbq

186
Sadece hafızayı belirsiz bir döngüde bozan bir program yazdım. Sistem yavaşladıktan sonra terminalde "Öldürüldü" mesajı görüntülenir ve işlem sonlandırılır. /Var/log/kern.log dosyası, sonlandırma hakkında birçok bilgi içeriyordu. İşaretçi için teşekkürler.
sbq

6
Neredeyse kesinlikle öyle. TAing yaparken bunu çok gördüm. Birçok öğrenci nesnelerini serbest bırakmayı unutur ve uygulamalar sonunda 3GB sanal bellek kullanımına ulaşır. Bu noktaya gelir gelmez öldürüldü.
Herms

8
"Program sadece çöküyor", o ise işletim sistemi aslında süreci öldürme!
Bernd Jendrissek

79
dmesgÇekirdek günlüğünü görmek için kullanın : burada aşırı sanal bellek tüketimi nedeniyle çekirdek tarafından öldürülen python süreçlerimi buluyorum.
caneta

273

Deneyin:

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

Burada -B100öldürme gerçekleşmeden önceki satır sayısını ifade eder.

Atla -T Mac OS üzerinde.


6
FYI, from info egrep: "egrep, grep -E ile aynıdır. ... egrep veya fgrep gibi doğrudan çağırma onaylanmamıştır"
Air

9
'killed process'Sizin gibi basit bir desen söz konusu olduğunda, başka değişiklik yapmadan kullanmak grepyerine kullanabilirsiniz egrep. Daha karmaşık bir desen için, örneğin egrep -i -B100 'foo|ba[rz]'ile değiştirirsiniz grep -E -i -B100 'foo|ba[rz]'. Bu soru-cevap daha fazla ayrıntı veriyor.
Hava

2
Ayrıca dmesg -Tokunabilir zaman damgaları almak için kullanmanızı öneririm
gukoff

171

Bu konuda iyi bir makale gibi görünüyor: OOM katilini evcilleştirmek .

İşin özü, Linux'un fazla işlemesihafıza. Bir süreç daha fazla alan istediğinde, Linux, başka bir işlem tarafından talep edilse bile, bu alanın hiç kimsenin istediği hafızayı gerçekten kullanmadığı varsayımı altında bu alanı verecektir. İşlem, istediği zaman değil, gerçekte kullandığında ayırdığı belleği özel olarak kullanacaktır. Bu, ayırmayı hızlı hale getirir ve gerçekte olduğundan daha fazla bellek ayırmanıza ve ayırmanıza izin verebilir. Bununla birlikte, süreçler bu belleği kullanmaya başladığında, Linux sahip olmadığı belleği ayırmada çok cömert olduğunu fark edebilir ve bir kısmını boşaltmak için bir işlemi öldürmek zorunda kalacaktır. Öldürülecek süreç, çalışma süresini (uzun süren süreçler daha güvenli), bellek kullanımını (açgözlü süreçler daha az güvenlidir) ve diğer birkaç faktörü dikkate alan bir puana dayanır, bir işlemi öldürme olasılığını azaltmak için ayarlayabileceğiniz bir değer dahil. Her şey makalede çok daha ayrıntılı olarak açıklandı.

Düzenleme: Ve burada bir işlem (bazı çekirdek kodu örnekleri ile açıklamalı) nasıl seçildiğini oldukça iyi açıklayan başka bir makale var. Bununla ilgili en güzel şey , çeşitli kuralların ardındaki akıl yürütme hakkında bazı yorumlar içermesidir badness().


3
Makale bağlantılarını gerçekten çok seviyorum. Konuyla ilgilenen herkese onları okumasını öneriyorum - özellikle de yalın makaledeki yorumlar.
Jon Bringhurst

4
"Linux başka bir işlem tarafından iddia edilse bile bu alana yer verecek" Sanal bellek
böyle çalışmaz

1
makale oldukça eskidir (2009) ve makalede önerilen tüm işlevler ana hatlarında değildir.
Alex

50

Önce OOMKiller'in ne zaman ve neden çağrıldığını açıklayayım.

512 RAM + 1GB Değiştirme belleğiniz olduğunu varsayalım. Teorik olarak, CPU'nuzun toplam 1.5GB sanal belleğe erişimi vardır.

Şimdi, bir süre için her şey toplam belleğin 1.5GB'ı içinde iyi çalışıyor. Ancak aniden (veya kademeli olarak) sisteminiz daha fazla bellek tüketmeye başladı ve kullanılan toplam belleğin yaklaşık% 95'ine ulaştı.

Şimdi herhangi bir işlemin çekirdekten büyük miktarda bellek istendiğini söyleyin. Çekirdek kullanılabilir belleği kontrol eder ve işleminize daha fazla bellek ayırabilmesinin bir yolu olmadığını bulur. Bu yüzden OOMKiller'i ( http://linux-mm.org/OOM ) çağıran / çağıran bazı hafızaları boşaltmaya çalışacaktır .

OOMKiller, her işlem için sıralamayı puanlamak için kendi algoritmasına sahiptir. Genellikle hangi işlem daha fazla bellek kullanırsa öldürülecek kurban olur.

OOMKiller günlüklerini nerede bulabilirim?

Genellikle / var / log dizininde bulunur. /Var/log/kern.log veya / var / log / dmesg

Umarım bu sana yardımcı olur.

Bazı tipik çözümler:

  1. Belleği artırın (değiştirmeyin)
  2. Programınızdaki bellek sızıntılarını bulun ve düzeltin
  3. Herhangi bir işlemin kullanabileceği belleği kısıtla (örneğin JVM belleği JAVA_OPTS kullanılarak kısıtlanabilir)
  4. Günlükleri ve google'ı görün :)

17

Bu, bellek yetersiz Linux'un (OOM) Linux'u . İşleminiz ' kötülük ' nedeniyle seçildi - yakınlık, yerleşik boyut (sadece tahsis edilmekten ziyade kullanılan bellek) ve diğer faktörlerin bir kombinasyonu.

sudo journalctl -xb

Şuna benzer bir mesaj göreceksiniz:

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

Dwc ve Adam Jaskiewicz'in belirttiği gibi, suçlu muhtemelen OOM Katili. Ancak, bir sonraki soru şudur: Bunu nasıl önleyebilirim?

Birkaç yol vardır:

  1. Mümkünse sisteminize daha fazla RAM verin (eğer bir VM ise kolay)
  2. OOM katilinin farklı bir işlem seçtiğinden emin olun.
  3. OOM Katilini devre dışı bırak
  4. OOM Killer devre dışı bırakılmış bir Linux dağıtımı seçin.

Bu makale sayesinde (2) 'nin uygulanmasının özellikle kolay olduğunu gördüm .


2
Benim için RAM'di. 2'den 4GB RAM'e yükselttim ve sorun gitti. Şimdi sorun tasarı ile: P
Gus

9

Limit kaynaklarına PAM modülü size tarif tam sonuç neden: My süreç metinle esrarengiz öldü öldürdü konsol penceresinde. Hiçbir günlük çıkışı, içinde ne syslog ne de içinde kern.log . En iyi program, bir dakikalık CPU kullanımından sonra sürecimin öldürüldüğünü keşfetmeme yardımcı oldu.


8

Systemtap (veya izleyici) gibi bir araç, çekirdek sinyal iletim mantığını izleyebilir ve raporlayabilir. ör. 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

Bu ifkomut dosyasındaki filtreleme bloğu tada göre ayarlanabilir veya sistem çapında sinyal trafiğini izlemek için elenebilir. Sebepler geri çekmeler toplanarak daha fazla izole edilebilir ( çekirdek ve kullanıcı alanı için sırasıyla a print_backtrace()ve / veya print_ubacktrace()prob ekleyin ).


4

Bir lsf ortamında (etkileşimli veya başka türlü), uygulama sıradaki yöneticiler veya kuyruğa gönderilen kaynak isteği tarafından önceden belirlenmiş bir eşiğin ötesinde bellek kullanımını aşarsa, diğer kullanıcılar bir potansiyelin kurbanı olmayacak şekilde işlemler öldürülür Kaçmak. Nasıl ayarlandığına bağlı olarak, her zaman bir e-posta göndermez.

Bu durumda bir çözüm, daha büyük kaynaklara sahip bir kuyruk bulmak veya gönderimde daha büyük kaynak gereksinimleri tanımlamaktır.

Ayrıca incelemek isteyebilirsiniz man ulimit

Hatırlamıyorum rağmen ulimitsonuçlanan Killedonun olmuş bir ihtiyacım beri süre o.


2

Bir müşteri sitesinde (Red Hat, sanırım) Linux altında tekrarlanan sorunlar yaşadık, hem OOMKiller (bellek dışı katil) hem prensip uygulamamızı (yani sunucunun var olmasının nedeni) ve veri tabanı süreçlerini öldürüyor.

Her durumda OOMKiller, süreçlerin çok fazla kaynağa kullanıldığına karar verdi ... makine, kaynak eksikliği nedeniyle başarısız olmak üzereydi. Ne uygulama ne de veritabanı, bellek sızıntıları (veya başka bir kaynak sızıntısı) ile ilgili sorunlara sahip değildir.

Ben bir Linux uzmanı değilim, ama bir şeyi ne zaman öldüreceğine ve neyin öldürüleceğine karar vermek için algoritmasını topladım. Ayrıca, bana (bunun doğruluğu hakkında konuşamam), OOMKiller'in Çekirdeğe pişirildiği ve sadece çalıştıramayacağınız söylendi.


1
IIRC, OOMKiller sadece son çare olarak çağrıldı. Sistemin çeşitli uygulamalara, OOMKiller'i çağırmaya zorlanmadan önce bazı kaynaklardan vazgeçmelerini isteyen bir sinyal bile göndereceğini düşünüyorum. Uzun zamandır olduğu gibi bir tuz tanesi ile al ...
rmeador

1
Sen edebilirsiniz basitçe çalışmaz. Çekirdeğe pişirilir, ancak nasıl çalıştığını ve hatta hangi süreçleri öldüreceğini ayarlamak için seçenekler vardır. Belirli bir işlem çok fazla kullandığında değil, tüm sistemin belleği dolduğunda çalışır. Daha fazla ayrıntı için cevabıma bakın.
Adam Jaskiewicz

6
Oomkiller'ı çalıştırmamak oldukça kolaydır. echo "2" > /proc/sys/vm/overcommit_memory
R .. GitHub BUZA YARDIMCI DURDUR

Red Hat, değiştirilmesine izin vermek istemiyor: sudo echo "2" > /proc/sys/vm/overcommit_memory / proc / sys / vm / overcommit_memory: İzin reddedildi
Brent Faust

2
Deneyin echo 2 | sudo tee /proc/sys/vm/overcommit_memory
Hypershadsy

2

Benim durumumda bu bir Laravel kuyruk çalışanı ile oluyordu. Sistem günlükleri herhangi bir öldürmeden bahsetmedi, bu yüzden daha fazla baktım ve işçinin temel olarak bellek sınırını aşan bir iş nedeniyle kendini öldürdüğü ortaya çıktı (varsayılan olarak 128M'ye ayarlı).

İle kuyruk işçi çalıştırma --timeout=600ve --memory=1024benim için sorun giderildi.


0

Kullanıcı, kill veya Control + C kullanarak kendi programlarını öldürme yeteneğine sahiptir, ancak olanların olmadığı ve kullanıcının size şikayet ettiği izlenimini edindim.

root, elbette programları öldürme yeteneğine sahiptir, ancak birisinin makinenizde kök varsa ve bir şeyleri öldürüyorsa, daha büyük sorunlarınız vardır.

Eğer sysadmin değilseniz, sysadmin CPU, RAM, or disk kullanımı ve bunları aşan otomatik öldürme işlemlerinde kotalar ayarlamış olabilir.

Bu tahminler dışında, program hakkında daha fazla bilgi olmadan emin değilim.


6
CTRL-C bildirilen OP'den farklı bir öldürme gönderir (hatırladığım gibi SIGINT (2), program bir SIGKILL (9) alır).
Powerlord

0

Son zamanlarda bu sorunla karşılaştım. Son olarak, opensuse zypper güncellemesi otomatik olarak çağrıldıktan hemen sonra süreçlerimin öldürüldüğünü buldum. Zypper güncellemesini devre dışı bırakmak benim sorunumu çözdü.


Aynı sorunu görüyorum. Hangi sürecin sürecinizi öldürdüğünü nasıl izlediniz? SIGKILL'in bir sürece kimin gönderdiğini kontrol etmek için bir araç var gibi görünüyor.
Howy

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.