“En büyük süreci öldür” butonu


14

Bu dizüstü bilgisayarın bir SSD'si var ve bu yüzden takası atlamaya karar verdim. Bu çoğu durumda iyi çalışır, ancak bazen RAM biraz kısalır ve bilgisayar gerçekten durgunlaşır ve donma eğilimindedir. Donmayı yeterince hızlı fark edersem doğrudan çekirdeğe giden bir "en büyük süreci öldür" düğmesi uygulamanın bir yolu var mı? Ya da, bir bilgisayar olduğu için, donmaya ve en büyük sürecin kendisini çekmeye başladığı zaman için bir buluşsal yöntem de iyi olur.


Şunu mu demek istediniz: "en büyük işlemi öldür" komutu?
Ramesh

Linux buna sahiptir. Buna OOM katili deniyor. Ancak, bellek fazla çalışmasını etkinleştirmeniz gerekir (ve çoğu dağıtımda varsayılan olarak açıktır).
Patrick

@Patrick overcommit_memoryolduğu 0, overcommit_ratioolduğu 50.
Reactormonk

Yanıtlar:


12

Yorumunuzdan, sistem sadece değişiyor gibi görünüyor.

Linux'un OOM katili var, bu sistem bellekte fazla çalıştığında çağrılıyor ve şimdi tükeniyor.
Linux varsayılan olarak aşırı bellek gerçekleştirir, bu da programlara sistemin gerçekte olduğundan daha fazla bellek verdiği anlamına gelir. Bu, programların gerçekten istedikleri hafızayı kullanmayacağı varsayımıyla yapar. Ancak, sistemin belleği dolduğunda, çalışan çeşitli işlemlere zaten belleğe sahip olduklarını söylemişti, bu yüzden artık onu reddedemez. Bunun yerine OOM katilini çağırmak. OOM katili temel olarak çekirdeğin bellek yetersiz durumunu hafifleteceğini düşündüğü bir süreç bulur. Genellikle bu sadece en fazla belleği kullanan işlemdir, ancak algoritma aslında bundan çok daha karmaşıktır.

Eğer beri overcommit_memoryayarlı 0(otomatik mod), çekirdek bellek overcommit gerçekleştiriyor. Yani açıkladığınız davranıştan, sistemin sadece çok fazla değiştiği anlaşılıyor.

Buradan 2 seçenek var.

Takas oranını azalt

Sisteminizde RAM bitiyor ve böylece çekirdek bir şeyi takas etmeye başlıyor. Sisteminizde takas kalmazsa, OOM katilini çağırır. Ancak boş takas alanınız kaldığı için bu gerçekleşmez.

Orijinal fikriniz, bir işlemi elle öldürün.

Sistemin çok fazla değiştiğini ve bir şeyin ölmesi gerektiğini düşündüğünüzde bir işlemi manuel olarak öldürebilirsiniz. Bu, çekirdek SysRq tetikleyicileri aracılığıyla yapılabilir.

Çekirdeğin "sihirli SysRq" dediği şey var. Bu, çekirdeğe bir tür acil durum işlemi gerçekleştirmesini söyleyen bir işlevdir. Bu, "salt okunur tüm birimleri yeniden", "tüm dosya sistemlerini senkronize et" veya "şimdi yeniden başlat" gibi şeyler olabilir. Bu seçeneklerden biri de OOM katilini çağırmaktır.

Çekirdeğinizde sihirli SysRq etkinleştirilmişse (çekirdek seçeneği CONFIG_MAGIC_SYSRQ), bunu 2 şekilde yapabilirsiniz.

  1. Alt+ SysRq+ f
    Klavyedeki bu 3 tuşa basmanız yeterlidir.
  2. echo f > /proc/sysrq-trigger
    Bu, klavye yöntemiyle tam olarak aynı görevi gerçekleştirir, ancak bunu programlı olarak yapar.

Ayrıca takas işlemini tamamen devre dışı bırakabilirsiniz ve sistemlerimin çoğunda ve tam da bu nedenle bunu yapıyorum. Takas, çekirdeğin kullanılmayan verileri önleyici olarak değiştirmesi ve koçunuzun daha fazlasının önbellekleme için kullanılmasına izin vermesi açısından faydalıdır. Ama bu gördüğünüz zorla takas sorununa yol açıyor.

Bence en iyi çözüm, zorla takas konusunda OOM katilini çağırmak için bir çeşit çekirdek seçeneği olduğunu düşünüyorum. Temel olarak önleyici takasın çalışmasına izin verin, ancak çekirdek RAM dışında olduğunuz için bir şeyi takas haline getirmek zorunda kalırsa, OOM katilini çağırın.
Ne yazık ki bu sadece kendi kişisel dileğim. Bunu yapmaz.


OOM Killer'ı bilmiyordum. Komut kullanarak sürekli bellek kullanımını topveya pskomutunu izleyen ve belirli eşik sınırını aşarsa, killkomut kullanarak bu işlemi öldüren bir komut dosyası düşünüyordum .
Ramesh

Takas kullanmıyorum.
Reactormonk

oom katili tarafından hangi işlemin öldürüldüğünü görmek için:grep -E "oom-killer|Killed process" /var/log/syslog /var/log/syslog.1
lesmana

@Tass Oh, ben tamamen "Ben takas atlamaya karar verdi" yorum üzerinde sırlı, üzgünüm :-(. "Manuel olarak bir işlemi öldürmek" bilgileri hala duruyor. Ancak bellek tükenirken yavaşlık yaşamamalısınız. sadece çekirdeği öldüren çekirdeği deneyimlemeli
Patrick

@Patrick olur, ancak ~ 30 dakika sonra.
Reactormonk
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.