kswapd0 mengambil banyak cpu

46

kswapd0 mengambil 99,9% dari CPU saya sebagai top menunjukkan kepada saya, masalah muncul hari ini ketika bermain game dan pertama kali hilang setelah 6 menit dan sekarang telah melakukannya selama sekitar 20 menit. Bagaimana ini diperbaiki dan apa yang menyebabkan ini?

Kaspar
sumber
Ini terjadi dengan saya di Ubuntu 14.04 juga.
eri0o
Ini terjadi pada saya untuk 18,04 juga. Detail di sini: askubuntu.com/questions/1118932/…
Yuvraj Jaiswal

Jawaban:

49

Proses kswapd0 adalah proses yang mengelola memori virtual. Mesin Anda harus memiliki RAM, SWAP, dan EXT4 pada HDD / SSD Anda. Ext4 adalah tempat semuanya disimpan, dan selalu lebih lambat untuk diakses daripada RAM. RAM seperti ruang berjalan setengah jalan bagi program untuk mengakses informasi dengan cepat. Sebagian besar komputer memiliki setidaknya 4GB RAM, yang dalam kondisi normal cukup banyak. Saat bermain game, bagaimanapun, Anda dapat kehabisan ruang RAM, di situlah SWAP masuk.

SWAP adalah RAM palsu yang terletak di HDD / SSD Anda di sebelah EXT4 Anda. Ini lebih cepat untuk diakses daripada EXT4, tetapi jauh lebih lambat dari RAM yang sebenarnya. Ketika kehabisan memori, kswapd0 memindahkan program yang tidak Anda gunakan / tidak gunakan sebanyak program lain ke SWAP, yang menyebabkan keterlambatan ekstrem pada proses tersebut. Jika game Anda membutuhkan RAM 5GB, 1GB paling tidak akan berada di SWAP. Itu berarti ketika mencoba mengakses informasi itu, ia harus menunggu lebih lama untuk mendapatkannya.

Seluruh proses ini menyebabkan penggunaan CPU yang ekstrem, memindahkan informasi dari dan ke SWAP dan RAM dan menangani permintaan informasi secara bersamaan. Bagaimana cara mengatasi masalah ini?

  1. Katakan kswapd0 untuk hanya memindahkan barang ke SWAP saat Anda kehabisan RAM. Ini adalah metode tunggal paling efektif untuk menyelesaikan masalah SWAP. Menjalankan

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

    di mana 0persen yang tersisa dari 100mana SWAP harus digunakan (ketika Anda memiliki 0% RAM yang tersisa, SWAP akan mulai mengambil data). Anda juga dapat mengedit /etc/sysctl.conf sesuai dengan keinginan Anda alih-alih menambahkan perintah ini ke akhir setiap kali menggunakan gedit atau nano atau apa pun, pastikan untuk sudo, file ini dimiliki oleh root. Reboot dan Anda siap!

  2. Kurangi konsumsi RAM oleh proses lain atau tutup program lain saat menjalankan program memori tinggi. Inilah sebabnya mengapa sebagian besar game meminta Anda untuk menutup semua jendela lain sebelum bermain, atau instalasi melakukan hal yang sama. Hal-hal seperti layanan sinkronisasi file cenderung memakan banyak memori.
  3. Beli lebih banyak RAM. Memasang RAM tidak sesulit kedengarannya. Satu atau dua sekrup pada kompartemen kecil (jika Anda menggunakan laptop) dan klik sederhana. Pastikan Anda membeli jenis yang benar!
  4. Proses CPU lebih rendah seperti yang Anda lakukan pada RAM. Ini akan membantu RAM untuk SWAP burst menjadi lebih lancar.

Itu yang terbaik yang bisa Anda lakukan. Orang lain mungkin mengatakan menonaktifkan swap sepenuhnya, tapi itu berbahaya dan saya TIDAK akan merekomendasikan itu. Itu dapat menyebabkan seluruh sistem membeku jika ada kebocoran memori atau terlalu banyak aplikasi yang berjalan. Sadarilah bahwa SWAP adalah failafe yang aman untuk RAM. Ini jelas tidak secepat atau seefisien RAM, tetapi lebih baik daripada Window's Pagefile! (yang mencapai tujuan yang sama)

EDIT: Jika Anda tertarik untuk mempelajari lebih lanjut tentang SWAP, lihat di sini .

Zzzach ...
sumber
Saya tidak ingat persis apa yang memperbaiki masalah bagi saya lagi, tetapi saya berterima kasih atas jawaban yang ditulis dengan baik yang menjelaskan banyak hal.
Kaspar
Menurut jawaban Anda, saya menghentikan beberapa proses sehingga swap lebih sedikit digunakan. Sekarang prosesnya kwapd0hilang. Terima kasih.
mtoloo
29

kswapd0 beroperasi pada 99,9% dari satu CPU tetapi sebenarnya tidak bertukar sama sekali

Bagi saya itu terjadi di Ubuntu 14.04 dengan kernel 3.19.0-50-generic (dan sebelumnya) berjalan di VMware vm. Saya tidak tahu, apa yang membuatnya muncul, tetapi itu datang selama waktu siaga.

top menunjukkan:

# 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

Solusi sementara

reboot memecahkan masalah - sementara.

mengikuti jawaban di serverfault (kswapd sering menggunakan CPU 100% saat swap digunakan) di sana pengaturan yang sama pada sistem saya:

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

solusinya sebenarnya # 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

sekarang baik-baik saja:

# 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

Solusi permanen (dapat ditemukan)?

tetapi karena alasan sebenarnya belum diketahui, dan saya tidak mendenda penjelasan yang sesuai di internet, ini bukan solusi permanen. Sebenarnya, jawaban yang dipilih bisa menjadi solusi permanen. Saya hanya ingin menambahkan ini untuk referensi di masa mendatang, karena reboot (untuk membuat sysctl berlaku) tidak selalu mungkin.

Solusi lain mungkin untuk mengatur THP ke salah satu madviceatau never(lihat komentar poige untuk jawabannya , Bagaimana cara memodifikasi "/ sys / kernel / mm / transparent_hugepage / diaktifkan" dan Manual MongoDB yang direferensikan tentang Nonaktifkan Halaman Besar Hilang (THP) )

pekerjaan cron

Saya telah mengatur batch berikut sebagai tugas cron sebagai solusi "permanen":

#!/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

dipanggil dengan

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

Martin Rüegg
sumber
Jawaban yang sangat bagus, terima kasih. Kernel RPi diperbarui dan ini yang saya dapatkan, berserking kswap.
Paul B
Terima kasih, @ PaulB. Saya telah menambahkan jawaban saya pada pekerjaan cron yang saya gunakan sebagai solusi permanen pada sistem saya.
Martin Rüegg
Seperti yang ditunjukkan oleh @Veger dengan benar , ini juga berfungsi pada 16.04. Karena saya sedang menggunakan diri saya sendiri. Jadi ditambahkan tag. Terima kasih!
Martin Rüegg
Terima kasih lagi, @Veger ! - Saya sudah mengoreksi tanda seru yang hilang di Sha-Bang naskah.
Martin Rüegg
1
"echo 1> / proc / sys / vm / drop_caches" memperbaiki penggunaan CPU yang tinggi untuk saya - perbedaan malam dan siang! kswapd0 berubah dari 100% CPU menjadi 0%. Penjelasan mengapa dan solusi permanen akan bagus. (Catatan: Saya menjalankan kernel linux 4.8.0-36-generik dengan 16 GB mem dan 16 GB swap.)
josephdpurcell