kswapd0 çok fazla cpu alıyor


45

kswapd0, benim işlemcimin% 99.9'unu üst üste gösteriyor. Bana, oyun bugün ortaya çıktı ve ilk kez 6 dakika sonra kayboldu ve şimdi yaklaşık 20 dakika oldu. Bu nasıl çözülebilir ve buna ne sebep oluyor?


Bu benimle Ubuntu 14.04'te de oluyor.
eri0o

Bu bana 18.04 için de oluyor. Ayrıntılar burada: askubuntu.com/questions/1118932/…
Yuvraj Jaiswal

Yanıtlar:


48

Kswapd0 işlemi sanal belleği yöneten işlemdir. Makineniz gereken RAM, SWAP, ve HDD / SSD EXT4 var. Ext4, her şeyin depolandığı yerdir ve RAM'e erişmek her zaman daha yavaştır. RAM, programların bilgiye hızlı bir şekilde erişmesi için yarı yolda çalışan bir alan gibidir. Çoğu bilgisayarda, normal koşullar altında bol olan en az 4 GB RAM bulunur. Bununla birlikte, bir oyun oynarken, SWAP'ın geldiği yer olan RAM alanını azaltabilirsiniz.

SWAP, HDD’niz / SSD’nizde EXT4’ünüzün yanında bulunan sahte bir RAM'dir. EXT4'ten daha hızlı erişim sağlar, ancak gerçek RAM'den çok daha yavaştır. Belleği azalıyorsa, kswapd0 kullanmadığınız / kullanmadığınız programları SWAP'a taşıyarak bu işlemlerde aşırı gecikmeye neden olur. Oyununuz 5GB RAM'e ihtiyaç duyuyorsa, LEAST'taki 1GB SWAP'ta olacaktır. Bu, o bilgiye erişmeye çalıştığında, onu almak için daha uzun süre beklemesi gerektiği anlamına gelir.

Tüm bu süreç aşırı CPU kullanımına, bilginin SWAP ve RAM'e taşınmasına ve bilgi isteklerinin aynı anda ele alınmasına neden olur. bu sorunu nasıl çözeriz?

  1. Kswapd0 cihazına, yalnızca RAM’in tamamen ÇIKIŞI’nda bulunan öğeleri SWAP’e taşımasını söyle. SWAP sorunlarını çözmek için en etkili yöntem budur. Çalıştırmak

    echo vm.swappiness=0 | sudo tee -a /etc/sysctl.conf

    burada 0yüzde dışında bırakılmıştır 100hangi SWAP kullanılmalıdır (% 0 RAM kaldığında swap veri alarak başlayacaktır). Geet veya nano kullanarak her seferinde sonuna sonuna bu komutu eklemek yerine /etc/sysctl.conf komutunu da düzenleyebilirsiniz. Yeniden başlatın ve ayarlandı!

  2. Yüksek bellek programlarını çalıştırırken RAM tüketimini diğer işlemlerle azaltın veya diğer programları kapatın. Bu nedenle çoğu oyun size oynamadan önce diğer tüm pencereleri kapatmanızı söyler veya kurulumlar da aynı şeyi yapar. Dosya senkronizasyon servisleri gibi şeyler çok fazla hafızaya alma eğilimindedir.
  3. Daha fazla RAM al. RAM'in takılması göründüğü kadar zor değildir. Küçük bir bölmede bir veya iki vida (bir dizüstü bilgisayardaysanız) ve basit bir tıklama. Sadece doğru çeşidi aldığınızdan emin olun!
  4. İşlemcide RAM işlemlerinde olduğu gibi işlemlerinizi düşürün. Bu, RAM’in SWAP veri bloğunun daha yumuşak gitmesine yardımcı olacaktır.

Yapabileceğin en iyi şey bu. Diğerleri takas işlemini tamamen devre dışı bırakabilir diyebilir, ancak bu tehlikelidir ve bunu önermeyeceğim. Bellek sızıntısı veya çalışan çok fazla uygulama varsa, tüm sistemlerin donmasına neden olabilir. Sadece SWAP’ın RAM’ için güvenli olmadığını fark et. Kesinlikle RAM kadar hızlı ya da verimli değil, ancak Window'un Sayfa Dosyasından daha iyi! (aynı amacı yerine getirir)

EDIT: SWAP hakkında daha fazla şey öğrenmek istiyorsan, buraya bak .


Artık benim için sorunu neyin düzelttiğini tam olarak hatırlayamıyorum, ancak çok iyi açıklayan iyi cevap için teşekkür ederim.
Kaspar

Cevabınıza göre, daha az takas kullanılması için bazı işlemleri sonlandırıyorum. Şimdi süreç kwapd0gitti. Teşekkürler.
mtoloo

28

kswapd0, bir işlemcinin% 99.9'unda çalışıyor ancak aslında hiç değişmiyor

Bana göre, Ubuntu 14.04'te, çekirdeği 3.19.0-50-jenerik (ve daha önceki) bir VMware vm'de çalışan çekirdekle olur. Ne göründüğü hakkında hiçbir fikrim yok, ama boş zamanlarında geliyor.

top gösterileri:

# top
top - 09:49:35 up 5 days, 18:35,  1 user,  load average: 1.00, 1.00, 0.99
Tasks: 219 total,   2 running, 217 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us, 25.0 sy,  0.0 ni, 74.7 id,  0.2 wa,  0.0 hi,  0.1 si,  0.0 st
KiB Mem:   3028784 total,  1874468 used,  1154316 free,  1010276 buffers
KiB Swap: 15624188 total,     3032 used, 15621156 free.   234928 cached Mem

   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
    52 root      20   0       0      0      0 R  99.7  0.0 122:15.21 kswapd0
     3 root      20   0       0      0      0 S   0.3  0.0   0:29.86 ksoftirqd/0
     7 root      20   0       0      0      0 S   0.3  0.0   9:49.47 rcu_sched

Geçici çözüm

Bir yeniden başlatma sorunu çözdü - geçici olarak.

serverfault üzerindeki cevabın ardından (takas kullanımdayken kswapd genellikle% 100 CPU kullanıyor) sistemimde aynı ayarların olduğu yerler:

# cat /proc/sys/vm/swappiness
60
# cat /proc/sys/vm/vfs_cache_pressure
100
# cat /sys/kernel/mm/transparent_hugepage/enabled
[always] madvise never

çözüm aslında # echo 1 > /proc/sys/vm/drop_caches:

# cat /proc/sys/vm/drop_caches
0
# echo 1 > /proc/sys/vm/drop_caches
# cat /proc/sys/vm/drop_caches
1

şimdi iyi:

# top
top - 10:08:58 up 5 days, 18:55,  1 user,  load average: 0.72, 0.95, 0.98
Tasks: 220 total,   1 running, 219 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.2 sy,  0.0 ni, 99.8 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem:   3028784 total,   681704 used,  2347080 free,     2916 buffers
KiB Swap: 15624188 total,     3032 used, 15621156 free.    81924 cached Mem

   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
     9 root      20   0       0      0      0 S   0.3  0.0  14:10.40 rcuos/0
     1 root      20   0   45652   8124   2888 S   0.0  0.3   1:54.98 init

Kalıcı çözüm (bulunacak)?

fakat asıl sebep henüz bilinmediğinden ve net olarak uygun bir açıklama yapmadığım için bu kalıcı bir çözüm değil. Aslında, seçilen cevap kalıcı bir çözüm olabilir. Ben sadece gelecekteki referans için bunu eklemek istedim, çünkü yeniden başlatma (sysctl'in etkili olması için) her zaman mümkün değildir.

Bir diğer çözüm için ayarlanan THP nedeniyle olabilir ya madviceya never(bkz poige en Onun için yorumunu cevap , ben değiştirmek nasıl “/ sys / kernel / aa / transparent_hugepage / etkin” ve üzerinde başvurulan MongoDB Manuel devre dışı bırak Şeffaf Büyük Sayfalar (THP) )

cron işi

Aşağıdaki grubu "kalıcı" bir çözüm olarak bir cron işi olarak ayarladım:

#!/bin/bash


## run as cron, thus no $PATH, thus need to define all absolute paths
top=/usr/bin/top
grep=/bin/grep


top=$($top -bn1 -o \%CPU -u0 | $grep -m2 -E "%CPU|kswapd0")

IFS='
'
set -f

i=0

for line in $top
do
        #echo $i $line

        if ! (( i++ ))
        then
                pos=${line%%%CPU*}
                pos=${#pos}
                #echo $pos
        else
                cpu=${line:(($pos-1)):3}
                cpu=${cpu// /}
                #echo $cpu
        fi

done

[[ -n $cpu ]] && \
(( $cpu >= 90 )) \
&& echo 1 > /proc/sys/vm/drop_caches \
&& echo "$$ $0: cache dropped (kswapd0 %CPU=$cpu)" >&2 \
&& exit 1

exit 0

ile çağrıldı

# m h  dom mon dow   command
  * *  *   *   *     /bin/bash /path/to/batch/drop_caches.sh >> /var/log/syslog 2>&1


Çok güzel cevap, teşekkürler. RPi çekirdeği güncellendi ve kswap çılgına döndüğü bu oldu.
Paul B

Teşekkürler, @PaulB. Cevabımı sistemimde kalıcı bir çözüm olarak kullandığım cron işine ekledim.
Martin Rüegg

@Veger tarafından doğru şekilde belirtildiği gibi , bu 16.04 tarihinde de geçerlidir. Şu anda kendimi kullanıyorum. Böylece etiketi eklendi. Teşekkürler!
Martin Rüegg

Tekrar teşekkürler, @Veger ! - Senaryonun Sha-Bang'indeki eksik ünlem işaretini düzelttim.
Martin Rüegg

1
"echo 1> / proc / sys / vm / drop_caches" benim için yüksek CPU kullanımını düzeltti - gece ve gündüz farkı! kswapd0% 100 CPU'dan% 0'a gitti. Neden ve kalıcı bir çözüm için bir açıklama harika olurdu. (Yan not: 16 GB mem ve 16 GB takas ile Linux çekirdeği 4.8.0-36-jenerik çalıştırıyorum.)
josephdpurcell
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.