Neden kswapd0 değiş tokuşu olmayan bir bilgisayarda çalışıyor?


21

~ 14G RAM ve takas olmayan bir bulut sunucum var. Ancak, kswapd0'ı çalıştırdığımda biraz CPU aldığını görüyorum top. Yönetmesi için takas alanı yoksa neden kswapd0 çalışıyor?

Yanıtlar:


8

Hala takas olup olmadığını kontrol etmek için bir süreci var. Bunu azaltmak için swappiness ayarlamanız gerekir -

"/etc/sysctl.conf" dosyasını kök olarak düzenleyin, sonra değiştirin (veya ekleyin)

vm.swappiness = 0

3
Tamam, ama neden cpu'mun% 1'ini kullanıyor?
portforwardpodcast

2
kswapd0herhangi bir CPU alıyorsa ve takasınız yoksa, sistem neredeyse RAM'in dışındadır ve (pratikte) yürütülebilir dosyalardan sayfa değiştirerek durumla başa çıkmaya çalışmaktadır. Doğru düzeltme, iş yükünü azaltmak, takas eklemek veya (tercihen) daha fazla RAM takmaktır. Takas eklemek performansı artıracaktır çünkü çekirdek diske takas etmek için daha fazla seçeneğe sahip olacaktır . Takas olmadan çekirdek, uygulama kodunu takas etmek zorunda kalır.
Mikko Rantalainen

Takas özelliğini etkinleştirdiyseniz ve kswapd0biraz CPU kullanıyorsanız ve bunu istemiyorsanız swappinessayarı düşürün . Bununla birlikte, takasınız yazma sorunu olmayan SSD tarafından desteklenmedikçe (örneğin, kötü aşınma seviyelendirme algoritması), swappinesssistemin genel performansını düşürür. Fikir, daha fazla RAM gerektiğinde RAM'in bir kopyasını takasta tutmaktır - bu durumda RAM kullanılmadan önce RAM'i kopyalamaya başlamak yerine hemen RAM atılır. Bu iyimser takas sadece sistem yeterince boştayken yapılır, böylece sisteminizi asla yavaşlatmaz.
Mikko Rantalainen

26

Takas alanı yalnızca başka bir dosya tarafından desteklenmeyen veriler için kullanılır. Diskteki diğer dosyalardan (yürütülebilir programlar gibi) eşlenen veriler, takas cihazınız olmasa bile ilgili dosyalarına değiştirilir.


9
Örneğin, sıfır takasınız olan ve sistemin RAM'in neredeyse bittiği bir durumu düşünün. Çekirdek, örneğin Firefox'tan bellek alacaktır (Firefox diskten yüklenmiş yürütülebilir kod çalıştırdığı için bunu yapabilir - kod gerekirse diskten tekrar yüklenebilir ). Firefox'un bu RAM'e tekrar erişmesi gerekiyorsa, N saniye sonra CPU, Linux'u bir miktar RAM boşaltmaya zorlayan (örneğin, başka bir işlemden RAM alır), eksik verileri diskten yükler ve Firefox'un devam etmesine izin verir. olağan. Bu normal değişime oldukça benzer ve kswapd0 bunu yapar.
Mikko Rantalainen

4

Linux'un belleği bittiğinde, yapması gerekeni yapmak yerine takas döngülerine girebilmesi, koçu serbest bırakmak için işlemleri öldürmesi iyi bilinen bir sorundur. Bunu yapan ancak yalnızca Takas ve RAM dolu olduğunda bir OOM (Bellek Yetersiz) katili vardır.

Ancak bu gerçekten bir sorun olmamalı. Her biri hem bellek kullanan hem de alan kaplayan sekmelere sahip, örneğin Firefox ve Chrome gibi bir dizi rahatsız edici süreç varsa, bu işlemler takasın yeniden okunmasına neden olur. Linux daha sonra aynı belleğin bellek ve sabit sürücü arasında ileri geri hareket ettirildiği bir döngüye girer. Bu da, birkaç işlemi ileri geri değiştirmenin sistemi tepkisiz hale getirdiği öncelikli ters çevirmeye neden olur .

Takas özelliğini devre dışı bırakırsanız, kswapd0 artık yürütülebilir dosyalar gibi eşlenen belleği takas etmekten başka seçeneğiniz olmadığından bu sorunu daha da kötüleştirirsiniz. Yürütülebilir dosyaları değiştirirseniz, daha hızlı bir şekilde tekrar takas edilmeleri daha olasıdır.

Test için NetBSD'de bu davranışı tetiklemeye çalıştım ve olan şey, işletim sisteminin kendisi çok duyarlıyken rahatsız edici sürecin inanılmaz derecede yavaş olmasıydı. Bu, takas sorununun meydana geldiği ancak öncelikli tersinme olmadığı anlamına gelir. Ancak NetBSD'nin AMDGPU sürücüleri yok, bu yüzden şimdilik Linux'a bağlı kalıyorum. Belki de NetBSD harita yürütülebilir dosyalarını hafızasında tutmaz ve bu yüzden takas döngülerine girmez, ancak neden yanıt vermediğini söylemek için uygulaması hakkında gerçekten yeterince bilgim yok.

Facebook da bu sorunu yaşadı ve Hafıza Dışı Daemon olan OOMD'yi yarattı. Bu, kswapd0 etkinliğini algılayan ve süreçleri öldürmeye başlayan cintir. Facebook'a göre bu, Linux sunucularının tepkisiz hale gelmesi sorununu neredeyse tamamen ortadan kaldırdı. Ancak test etmedim ve diğer sunucularda veya masaüstü / dizüstü bilgisayarlarda ne kadar iyi çalışacağını bilmiyorum. Görünüşe göre OOMD, sistem süreçlerini ve sunucu sistemlerinin öldürülenleri yeniden başlatmaktan sorumlu olan kısmını korumak için önce hangi işlemlerin öldürüleceğine karar veren bir mantığa sahiptir.

Ancak bu çözülmesi gereken bir şey değildir. OOMD çirkin bir hack. Asıl çözüm, takas döngüsünün neden olduğu öncelikli ters çevrmeyi düzeltmenin yanı sıra çekirdek OOM Killer'i öldürme işlemlerinde belleği boşaltmak için daha agresif hale getirmektir. Düzeltme çekirdeğe aittir, çünkü sorunun zamanında tespit edildiğinden ve süreçlerin düzgün bir şekilde öldürüldüğünden emin olabileceğimiz tek yer burasıdır.

Swappiness = 0 değerinin ayarlanması bir çözüm değildir, çünkü sistem boş RAM dışında olduğunda ne olursa olsun değiştirmeye başlar. Sistemin değiştirilmeye başlanmadığını garanti etme seçeneği yoktur.

Ayrıca, rahatsız edici uygulamaları düzeltmek de bir düzeltme değildir. Özellikle bir kullanıcı, işletim sistemini kasıtlı olarak yanıt vermemek için bu hatadan yararlanmak istiyorsa değil. Duyarlı olmak, çekirdeğin sorumluluğudur. Firefox kendini yanıt vermiyorsa, düzeltme uygulamaya yöneliktir. Ancak bu sadece kendini yanıt vermemekle kalmaz, tüm işletim sisteminin çok yavaş ve yanıt vermemesine neden olur. SSH'de oturum açmanın yarım saat alabileceği düzeye. SSH'nin bir ilgisi yoktur ve eğer çalıştırılmazsa, çekirdeğin bir hatasıdır, sistemin başka herhangi bir yerinde değil. Ve bu bir hata değil, iki hata. Bir hata, bir ray dışı takas döngüsünün, rahatsız edici işlem (ler) den başka süreçlere müdahale etmesine izin verildiği ve kendi içinde kötü olduğu öncelikli ters çevirmedir. Diğer bir hata ise ' t Takas döngüsünde olduğunu ve bunun HDD / SSD'de veya takasın yedeklendiği herhangi bir depolama biriminde çılgınca aşınmaya neden olduğunu tespit edin. Yürütülebilir dosyaları değiştirirken, yalnızca disklere yazılmayan bellek haritalarını okudukları için bu sorun daha azdır, ancak kswapd0 hala aynı anda bellekten sildiklerini okuyarak kilitlenir.

Oh ve üçüncü bir hata var. Belleğe aç uygulamalar tüm kullanılabilir belleği yuttuğunda disk CACHE'i yenmekten korumanın bir yolu yoktur. Bu kswapd0'ın sistemi yanıt vermemesinin nedenlerinden biridir. En sıcak bellek eşlemeli veriler genellikle disk önbelleğinde saklanır, ancak firefox bu önbelleği yediğinde, açıkçası disk okumalarının olması gerektiği anlamına gelir.

Soruna neden olan mutlaka Firefox değildir, ancak Chrome değil, varsayılan tarayıcıdır. Ve her ikisinin de, Linux'ta "kullanılabilir bellek" olarak sayılan önbellek ve takas belleği de dahil olmak üzere, kullanılabilir belleği boşa harcanan bir şey olarak gördüğü için bu sorunu tetiklediği bilinmektedir. Yani "kullanılabilir bellek" olsun's israf almak için önbellekleme ve diğer şeyler için kullanın. Açıkçası DISAP CACHE için SWAP kullanmak ÇOK KÖTÜ BİR FİKİRDİR, ancak hem Firefox hem de Chrome'daki arkadaşlarımız buna "boş bellek boşa bellek" ile yanıt verir.

Burada sahip olduğumuz şey, çekirdek takımının hataları düşünmediği üç çekirdek hatası. Ve Firefox, Chrome ve tüm türevlerinde bir hata dikkate almadıkları bir hata. Bu soruna bakmak ve belki de yama yapmak için Fedora dizüstü bilgisayarımda Firefox oluşturmaya çalıştım. Bil bakalım ne oldu. 4CC ram ile 4 çekirdekli bir CPU üzerinde GCC ile Firefox oluşturmak, PRIORITY INVERSION ile bir SWAP DÖNGÜSÜ tetikler. Yeniden yazılması gereken uygulamalardan biri de GCC'dir. NetBSD'de olan şey, sadece 4 çalışan GCC örneğinin bir örneği çalıştırmaktan daha yavaş hale gelmesidir, ancak sistemi dondurmaz.

Evet bu biraz rant ama umarım Linux bellek alt sistemleri ile ilgili mevcut sorunu ve buna neden olan uygulamaları açıklar.


1

Eğer takasınız yoksa ve kswapd0çalışıyorsa, sisteminiz o anda RAM'in neredeyse tamamını kullanıyor demektir. Bellek kullanımını (veya sistemdeki boş / kullanılabilir belleği) izlemek için daha iyi araçlar edinmenin zamanı geldi.

Gerçek düzeltme, bellek kullanımını azaltmak (daha az bellek sızıntısı olan işlemleri çalıştırmak, daha az işlem çalıştırmak, bazı işlemleri çalıştırmayı atlamak, bazı sunucu yazılımlarının çocuk / çalışan işlem sayısını sınırlamak) veya daha fazla RAM almaktır. RAM gereksinimi bellek sızıntılarından kaynaklanıyorsa, bunun yerine takas kullanmayı tercih edebilirsiniz. Linux sızıntı yapan parçaları takas etmek için yeterince akıllı olmalı. Takas etmek hiçbir şeyden daha iyi değildir, ancak yeterli miktarda RAM'e sahip olmak için gerçek bir yedek değildir.


Burada ve yorumlarınızda iyi bilgiler var, ancak takasın etkinleştirilmesi, kullanılabilir tüm belleğin (ram + takas) doldurulduğu sınırda bir çözüm değildir. Bir bellek sızıntısı durumunda özellikle kötü bir çözümdür, çünkü tüm belleğin sonunda dolması kaçınılmazdır. Takas + ram dolduğunda, ram dolduğunda ve takas devre dışı bırakıldığında sonuç aynıdır.
Kod Bling
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.