kswapd0 bir çok işlemci alıyor

24

kswapd0, CPU'mın% 99,9'unu üst sırada gösterdiğini gösteriyor, bugün oyun ve ilk kez 6 dakika sonra ilk defa oyun çıktı ve şimdi yaklaşık 20 dakika sürüyor. Bu nasıl düzeltilebilir ve buna neden kaynaklanır?

    
sordu Kaspar 22.02.2013 13:32

2 cevap

22

Kswapd0 işlemi, sanal belleği yönetmekten ibarettir. Makinenizin HDD / SSD'nizde RAM, SWAP ve EXT4 olması gerekir. Ext4, her şeyin depolandığı yerdir ve RAM'den daha hızlı erişim için 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 bilgisayar normal şartlarda bol olan en az 4 GB RAM'e sahiptir. Ancak, bir oyun oynarken, SWAP'ın girdiği RAM alanı düşük olabilir.

SWAP, HDD / SSD'nizde EXT4'ünüzün yanında bulunan sahte bir RAM'dir. EXT4'ten daha hızlıdır, ancak gerçek RAM'den çok daha yavaştır. Düşük bellekte çalıştırdığınızda, kswapd0, kullanmadığınız / SWAP için diğer programları kadar kullanmadığınız programları taşır, bu da bu işlemlerde aşırı gecikmeye neden olur. Oyununuz 5GB RAM'e ihtiyaç duyuyorsa, LEAST'te 1GB SWAP içinde olurdu. Bu, bu bilgiye erişmeye çalıştığında, onu elde etmek için daha fazla beklemek zorunda olduğu anlamına gelir.

Bu sürecin tümü, aşırı CPU kullanımı, SWAP ve RAM'den gelen ve SWAP ve RAM'e bilgi taşınmasına ve aynı zamanda bilgi talebini ele almasına neden olur. Bu sorunu nasıl çözebilirim?

  1. Kswapd0 öğesinin, tamamen RAM'in dışında olduğunuzda yalnızca parçaları SWAP'ye geçirmesini söyleyin. SWAP sorunlarını çözmek için en etkili yöntem budur. Çalıştır

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

    Burada 0 , SWAP'ın kullanılması gereken 100 'si dışında kalan yüzde (% 0 RAM kaldığında, SWAP veri almaya başlar). Ayrıca, /etc/sysctl.conf dosyasını her seferinde sonuna sonuna bu komutu eklemek yerine gedit veya nano kullanarak ya da her neyse, sudo olduğundan emin olun, bu dosyanın köküne sahip olabilirsiniz. Yeniden başlat ve ayarlandı!

  2. Yüksek bellek programlarını çalıştırırken diğer işlemlerle RAM tüketimini azaltın veya diğer programları kapatın. Bu yüzden oyunların çoğu, oynamadan önce tüm diğer pencereleri kapatmanızı söyler veya kurulumlar aynı şeyi yapar. Dosya senkronizasyonu hizmetleri gibi şeyler çok fazla bellek almaya eğilimlidir.
  3. Daha fazla RAM satın alın. RAM'in takılması göründüğü kadar zor değil. Küçük bir bölmedeki bir veya iki vida (bir dizüstü bilgisayardaysanız) ve basit bir tıklama. Doğru tür satın aldığınızdan emin olun!
  4. RAM ile yaptığınız gibi CPU'nun daha düşük süreçleri. Bu, RAM'in SWAP patlamalarına daha sorunsuz geçmesine yardımcı olacaktır.

Yapabileceğin en iyisi bu. Diğerleri tamamen takas devre dışı bırak söyleyebiliriz, ama bu tehlikeli ve bunu tavsiye ETMEM. Bu, bir bellek sızıntısı veya çok fazla sayıda uygulama varsa, tüm sistemlerin donmasına neden olabilir. Sadece SWAP'ın RAM için bir hata olduğunu anlayın. Kesinlikle RAM kadar hızlı veya verimli değil, ama Window'ın Pagefile'sinden daha iyi! (aynı amacı yerine getirir)

DÜZENLEME: SWAP hakkında daha fazla bilgi edinmek istiyorsanız burayı ziyaret edin.

    
verilen cevap Zzzach... 30.09.2014 18:37
21

kswapd0, bir CPU'nun% 99.9'unda çalışır, ancak aslında hiç değişmez

Bana göre Ubuntu 14.04'te, bir VMware vm sürümünde çalışan 3.19.0-50-jenerik (ve daha önceki) çekirdeğe sahip oluyor. Hiçbir fikrim yok, ne ortaya çıktı, ama boşta kalma süresi içinde geliyor.

top şunu gösteriyor:

# 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

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

serverfault (kswapd çoğunlukla Takas kullanımdayken% 100 CPU). Burada 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 idi:

# 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 mı?)

fakat asıl neden henüz bilinmediğinden ve ağda uygun bir açıklama yapmadığından, bu kalıcı bir çözüm değildir. Aslında, seçilen yanıt kalıcı çözüm olabilir. Ben sadece bunu gelecekteki başvurular için eklemek istedim, bir yeniden başlatma (sysctl'nin etkili olması için) her zaman mümkün değildir.

Başka bir çözüm, THP'yi madvice veya never değerine (bkz. poige'nin yorumuna ayarlamak olabilir. answer , Nasıl / sys / kernel / mm / transparent_hugepage / enabled" modunu değiştiririm ve başvurulan MongoDB Manual on Saydam Büyük Sayfaları Devre Dışı Bırakma (THP) )

cron işi

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

#!/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 "$$ 
# m h  dom mon dow   command
  * *  *   *   *     /bin/bash /path/to/batch/drop_caches.sh >> /var/log/syslog 2>&1
: cache dropped (kswapd0 %CPU=$cpu)" >&2 \ && exit 1 exit 0

ile çağrıldı

%pre%

    
verilen cevap Martin Rüegg 20.02.2016 11:09

Etiketlerdeki diğer soruları oku