Takas tamamen nasıl devre dışı bırakılır?


30

Extian ile biçimlendirilmiş sabit disk, Linux 3.1 üzerinde çalışan Debian sid kullanıyorum

Önceki linux sürümlerinde (belki 3.0'dan önce) hatırlıyorum, bellek yetersizse ve takas özelliği etkin değilse, programlar genellikle çökecektir. Bu benim ortamım için mükemmel: kritik bir işlem yapmadan basit web'de gezinme. Diğer bir deyişle, yanlışlıkla çok fazla bellek kullanan kötü bir web sitesi üzerinden geçersem, terminalimi kullanılamaz hale getirmeden çöküyor.

Ancak mevcut kurulumumda, bilgisayar arka planda şiddetli I / O verimi ile kilitleniyor. iotop, kswapd0'in suçlu olduğunu ortaya koyuyor, yani takas nedeniyle. swapon -sEtkinleştirilen takasları belirlemek için kullandıktan sonra , swapoff -atüm takasları devre dışı bırakmak için kullandım ve swapon -stüm takasların devre dışı bırakıldığını onaylamak için tekrar kullandım.

Sonra tekrar hafıza kullanımını maksimize etmeye çalıştım. Ne yazık ki, beklediğim davranış gerçekleşmedi. Bunun yerine, kswapd0, RAM'i değiştirmek için tekrar tekrar dener ve takas alanı olmadığından başarısız olur. Asla pes etmediğinden, bilgisayarım sonsuz G / Ç donma durumunda kilitli, diskimin sağlığı için kötü.

Denemekte yanlış bir şey swapoff -ami yapıyorum ? Davranış neden eskisinden farklı (neden muhtemelen 3.0 öncesi)?


Bu gerçekten mantıklı değil. Yapma swapoff -a kendini şeyler takas olsaydı, I / O bir sürü üretecektir (ve yeterince gerçek RAM Mevcut yoksa öldürülmek süreçlerinde neden olabilir). swapoff -aG / Ç "fırtınasına" sebep olanın olmadığından emin misin ?
Mat

1
Takasla ilgili fstabçizgiyi yorumlamanın yeterli olduğunu düşünüyorum . Davranışın aynı olup olmadığını deneyin.
enzotib

@Mat swapoff -a, takas işlemini kalıcı olarak devre dışı bırakmalı, bir sonraki yeniden başlatmanın ardından devre dışı kalması gerekir. Bunu onayladım. Yine de, I / O "fırtına", bir sonraki yeniden başlatmanın ardından oturum sırasında hala gerçekleşiyor. Kayıt için G / Ç "fırtınası" o anda olmadı swapoff -açünkü takas o zamanlar 0 idi.
syockit

9
@syockit: swapoff -aolduğu değil kalıcı.
Mat,

1
veri tabanı yüklemesi 14 saat içinde% 15'e ulaştı. Takas kapatıldı ve bir sonraki denemede 4 saat içinde% 40'a ulaştı. kuşkusuz, sunucu güçsüzdür ve ram konusunda yetersizdir, ancak takas açılmadan OpenSuSE bu işlem için çok daha hızlı çalışır. İşletim sisteminin "daha iyi" ve benim düşüncesi, basit bir mysql db yükü sırasında önemli ölçüde farklıdır. / etc / fstab içindeki takas sürücüsünü yorumladı ve yeniden başlattı.
TheSatinKnight

Yanıtlar:


15

Değişimi devre dışı bırakmak istediğiniz şeyi yapmaz. Hala şiddetli G / Ç verimi alacaksınız, ancak kirli olanlardan ziyade temiz sayfalardan oluşacak.

Takas yapılmadığında, sistem temiz (değiştirilmemiş) sayfaların önbelleğini sıfıra sıkıştıracaktır, çünkü bunlar fiziksel bellekten çıkarabilecekleri tek sayfalardır. Yalnızca kirli (değiştirilmiş) sayfaları bellekten takas için yazarak çıkartabilir, takas yapmadan, kirli sayfaları çıkarmanın bir yolu yoktur.

Fiziksel hafızanız azalıyorsa, her işlem önceki işlem kod sayfalarını çıkarırken kod sayfalarını diskten yüklemek zorunda kalacaktır. Sonuç, takas alt sistemi tarafından yapılan şiddetli devrilme ve aşırı çalışmalar olacaktır.

Bu çok önemli bir ilkenin özel bir örneğidir: İyi tasarlanmış bir sistem için, seçimlerini azaltarak daha iyi çalışmasını sağlayamazsınız. Linux iyi tasarlanmış bir sistemdir. Takasın kaldırılması sadece daha az seçenek sunar, bu yüzden daha kötü davranması şaşırtıcı değildir.


1
Bu, yalnızca tüm hafızanın çok azını ayırırsanız geçerlidir. Bir kaçma süreci genellikle çok daha fazlasını tahsis etmeye çalışacak ve bu nedenle sistemi daha fazla tahsisat yapmaya çalışarak ölüme takmaya devam etmenin aksine, bu belleği serbest bırakarak erken öldürülecek, bu nedenle takas işleminin devre dışı bırakılması yararlı olabilir. koç kullanımınızı sadece kaçak bir işlemden aldınız.
psusi

1
Tüm hafızanın çok az olması her zaman tahsis edilecektir. Linux özellikle bu şekilde ayarlanmıştır. Bir Do cat /proc/meminfoyükün birkaç saat sonra herhangi bir tipik Linux'ta.
David Schwartz

2
@ syockit Sayfalamayı devre dışı bırakırsanız, hiçbir programı çalıştıramazsınız. Çağrı, dosyaların hafızaya eşlendiği zaman okunduğu mekanizmadır.
David Schwartz

2
@ psusi: Değiştirdiğiniz zaman temiz sayfalar minimuma indirilmez. Bunun yerine, son zamanlarda kullanılmamış, kirli ve anonim sayfaların yerini alacak. Elbette, çalışma kümesi fiziksel belleği aşıyorsa, her iki şekilde de sonunda şiddetli bir şekilde şiddetleneceksiniz. Mesele şu ki, takas olsun ya da olmasın, gerçekte hafızanız tükenmeden önce çok fazla şiddetli sarsıntı yaşarsınız. Aradaki fark, takasla birlikte şiddetli çakılmanın değişeceğidir (kirli sayfalar, yazma ve okuma). Takas olmadan, şiddetli çökme kod hataları olacaktır (yalnızca temiz sayfalar, salt okunur).
David Schwartz

2
@ psusi: Endişe, bellek tüketiminde hızla patlayan kaçak bir işlem olup olmadığı konusunda haklısınız. Fakat OP'nin bahsettiği şey bu değil; aşırı tüketen, ancak sınırsız ya da çok fazla bellek tüketen bir süreç. Büyük tatlı noktadan (önbelleğin sıkıldığı yerde) büyürken, sistem çöktüğünde daha yavaş büyür.
David Schwartz

13

En iyisi, bellek azaldığında rasgele işlemlerin ölmesine neden olacak olan takas kapatmanın daha iyi bir çözümü, işleri ağdan çeken işlemler için işlem başına veri segmenti sınırını belirlemektir. Bu şekilde, kaçak bir tarayıcı tüm sistemin kullanılamaz hale gelmesine neden olmak yerine, sınıra çarpacak ve ölecektir. Örnek, kabuktan

(ulimit -d 400000; firefox) &

-D'den sonraki sayı kilobayt cinsindendir. Tarama alışkanlıklarınız için en iyi değeri seçmek için bunu sisteminizde denemelisiniz. Parantezler alt kabuğun oluşturulmasına neden olur; ulimit komutu yalnızca o kabuğu ve çocuklarını etkiler, etkilerini ana kabuktan izole eder.


Bu krom için işe yarar, chromiumküçük bellek parçalarını kullanan bir sürü işlemin nerede olduğunu söyler miyiz ?
jberryman

@jberryman Hayır, bellek sınırları kullanıcı başına değil işlem başınadır.
Kyle Jones

Bellek sınırına ulaştığında belirli bir sinyal (örneğin, SIGHUP) göndermenin bir yolu var mı?
Geremia

1
@Geremia Hayır. Brk ve sbrk sistemi durmayı, çoğu şeyin kıvrılıp ölmesini sağlayacak şekilde çalışmayı durdurur.
Kyle Jones

Manuel ayarlamaya geçmek istiyorsanız, ulimit yerine hafıza grubu kullanmanızı öneririm, çünkü hafıza grubu ile tüm işlem grubu için limit ayarlayabilir ve hafıza ayırma işlemini durması için yapılandırabilir ve kullanıcı modu politika işleminize ne yapılacağına karar verebilirsiniz. yapın (örneğin, bazı sinyaller gönderin, öldürülecek işlemi seçin, anında bellek sınırını yükseltin). Ayrıntılar için kernel.org/doc/Documentation/cgroup-v1/memory.txt ve kernel.org/doc/Documentation/cgroup-v2.txt adresine bakın.
Mikko Rantalainen

4

Takas işleminin kullanılmadığından emin olmak için, takas sırasında takas eklemesinin engellenmesi daha iyi olur. Bu, sisteme bağlı olarak, swapönyükleme servisini devre dışı bırakarak veya sadece takas girişini yorumlayarak yapılabilir /etc/fstab.

Kapatma işleminiz söz konusu olduğunda, içindeki stop()işlev /etc/init.d/swapbir ipucu verebilir:

stop()
{
       ebegin "Deactivating swap devices"

       # Try to unmount all tmpfs filesystems not in use, else a deadlock may
       # occure. As $RC_SVCDIR may also be tmpfs we cd to it to lock it
       cd "$RC_SVCDIR"
       umount -a -t tmpfs 2>/dev/null

       case "$RC_UNAME" in
               NetBSD|OpenBSD) swapctl -U -t noblk >/dev/null;;
               *)              swapoff -a >/dev/null;;
       esac
       eend 0
}

Kilitlenme hakkındaki bölüme dikkat edin . Takas kapatmadan önceumount -a -t tmpfs kendiniz yapmayı deneyebilirsiniz .


Düzenle:

Muhtemelen, sysctlayarları değiştirerek de hedefinize ulaşabilirsiniz ( bu soruya bakın ).


Ben yok swapiçinde init.d, ne de onu var fstabama var /etc/init.d/mountoverflowtmpolduğu bağlar tmpfsacil günlüğü yazma için. Takas arka plan programı da kullanıyor tmpfsmu?
syockit

Başka bir yerde etkinleştirmiş olabilirsiniz - grep -RF swap /etc/bulmak istiyorsanız yapın. Ancak bir hizmeti devre dışı bırakmak için şu komutu kullanırsınız service(IIRC; Debian'ı kendim kullanmıyorum).
rozcietrzewiacz

1
Bir bellek içi (RAM) dosya sistemi olduğundan takas kullanmaz . Ancak kullanan diğer hizmetler / programlar özel bir şekilde takas işlemine bağlı olabilir. Gerçekten bilmiyorum, ama önbelleğe alma ile ilgisi olabilir veya sürücünün takas alanına eriştiğini iddia ettiği özel bir yol olabilir . tmpfstmpfstmpfstmpfs
rozcietrzewiacz

Linux'un anlamadığım sanal belleği nasıl kullandığı hakkında bir şeyler var. Değişimi mümkün olan birçok yolla devre dışı bıraktım: via swapoffve via vm.swappiness=0. Yine kswapd0de hala çalışıyor! Acaba bunun 2.4 günlük bir gerileme olup olmadığını…
syockit

5
@ syockit Beklenen davranış. Sistem hala temiz sayfaları değiştiriyor (dosya verilerinin kopyalarını içeren sayfalar). Temiz sayfaları değiştirmek için takas alanı gerekmez, çünkü takas dışındaki kaynaklardan okunabilirler.
David Schwartz

2

Takas bölümü girişini yorumlamak her önyüklemeden sonra /etc/fstabçalıştırılmaktan daha iyidir swapoff -a.

Donanımımda kswapd0 ile aynı sorunu yaşıyorum.

vm.swappinessSistem parametresini ayarlamak bana yardımcı olmaz.

sysctl -w vm.swappiness=0

Googled ve çok sayıda yazı, posta listesi okudum ve şimdi bunun çekirdek hatası olduğunu düşünüyorum.

Aktif bir takas bölümü olmadığında ve boş hafıza bir miktar eşikten daha az hale geldiğinde (benim durumumda yaklaşık 300 MB) sistem kswapd0 deliliği nedeniyle tepkisizleşir.

Muhtemelen özel konfigürasyon ve şartlarla yeniden üretilir.

Biri için, kswapd0engelli özel bir çekirdeği inşa ederek başkaları için yeniden bölümlendirme ile sistemin yeniden kurulmasıyla çözülür .


2
Eğer kswapd0delirir ve takas RAM bitti aktive yok. Seçimleriniz OOM Katili veya kswapd0. Linux devam ediyor kswapd0çünkü çekirdek, işlemi bitirmekten daha yavaş bitirmenin daha önemli olduğunu varsayar. Sıradan insanlar için, çekirdeğin yeterince ileri bir ilerlemenin hala gerçekleşmekte olduğunu düşündüğü eşik zaten buzul yavaş ve neredeyse herkes OOM Killer'ı seçmeyi tercih ediyor.
Mikko Rantalainen

1

Sistemimde (debian sid 2016-11-15), şunu yaptım:

  1. değiş tokuşu şimdi devre dışı bırak:

    swapoff -a
    
  2. / etc / fstab konumunda swap bölümü bulunan satırı yorumlayınız

    #### #UUID=c6ddbc95-3bb5-49e1-ab25-b1c505e5360c none            swap    sw              0       0
    
  3. sistemde takas montajını devre dışı bırak

    systemctl --type swap
    systemctl stop dev-sda6.swap
    systemctl mask dev-sda6.swap
    

Yeterli olurdu. /etc/initramfs-tools/conf.d/resumeDosyadaki takas referansı var . Bunun amacının ne olduğunu bilmiyorum. Belki de bu dosya bir sonraki yeniden başlatmada sorun yaratacaktır (Henüz yeniden başlatmayı denemiyorum, çalışma zamanım değerli;).


1

bilgisayar arka planda şiddetli I / O verimi ile kilitleniyor. iotop, kswapd0'ın suçlu olduğunu ortaya koyuyor

Bundan kaçınmanın bir yolunu buldum (şimdiye kadar). Test etmek ve sisteminizde nasıl çalıştığını görmek istiyorsanız, bu sorunun içindeki çekirdek yamasını inceleyin . Temel olarak, bellek baskısı altındayken sayfaları (en azından) çıkarmaz , bu nedenle diskin çökmesi (sürekli okuma) neredeyse hiçbir şeye düşürülmez ve OOM-katilinin işletim sistemi dondurmak yerine 1 saniye içinde tetiklenmesine izin verilir. Kalıcı gibi (veya en azından birkaç dakika). Gerçek programcıların (ki ben değilim) yamayı iyileştireceğini ve bunu gerçek bir çözüme dönüştüreceğini umuyorum, şimdi bu durumlar için ne işe yaradığını görüyorlar . Active(file)


Bu çekirdek düzeltme eki zaten ana hat üzerinde
insanlıkANDpeace

@ insanlıkANDpeace muhtemelen, çünkü o kadar iyi değil (bir programcı olmadığım için), ancak bunun gibi bir sorunla karşılaştım, örneğin: bazen iş yüküne bağlı olarak, bu yamaya sahip durumlarda, hafızanız tükenebilir hangi Bu yama olmadan olmazdı ve ben çalıştırmak SÜRECE böylece OOM katili, Xorg ve xfwm4 öldürecek echo 1 | sudo tee /proc/sys/vm/drop_cachesne zaman Active(file):(bir / proc / meminfo) -it max 4G gidebilirsiniz (16G RAM sistemi üzerinde) 2GB bitti
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.