Mengapa kswapd0 berjalan di komputer tanpa swap?

21

Saya memiliki server cloud dengan ~ 14G RAM dan tanpa swap. Namun, saya kadang-kadang melihat kswapd0 mengambil beberapa CPU ketika saya menjalankan top. Mengapa kswapd0 dapat berjalan sama sekali jika tidak ada ruang swap untuk dikelola?

Thomas Johnson
sumber

Jawaban:

8

Masih memiliki proses untuk memeriksa apakah ada swap. Untuk menguranginya, Anda harus mengatur swappiness Anda -

edit "/etc/sysctl.conf" sebagai root, lalu ubah (atau tambahkan)

vm.swappiness = 0
Elliott Frisch
sumber
3
Ok, tapi mengapa menggunakan 1% dari cpu saya?
portforwardpodcast
2
jika kswapd0menggunakan CPU apa pun dan Anda tidak memiliki swap, sistem hampir kehabisan RAM dan mencoba untuk menangani situasi tersebut dengan (dalam praktiknya) menukar halaman dari executable. Perbaikan yang benar adalah mengurangi beban kerja, menambah swap atau (lebih disukai) menginstal lebih banyak RAM. Menambahkan swap akan meningkatkan kinerja karena kernel akan memiliki lebih banyak opsi tentang apa yang akan ditukar ke disk. Tanpa swap kernel praktis dipaksa untuk menukar kode aplikasi.
Mikko Rantalainen
Jika Anda telah mengaktifkan swap dan kswapd0menggunakan beberapa CPU dan Anda tidak menginginkannya, turunkan swappinesspengaturan. Namun, kecuali jika swap Anda didukung oleh SSD yang menderita penulisan (mis. Algoritma level aus yang buruk), menurunkan swappinessperforma keseluruhan sistem akan berkurang. Idenya adalah untuk menyimpan salinan RAM dalam swap jika lebih banyak RAM diperlukan - dalam hal ini salinan dalam RAM dibuang segera daripada mulai menukar itu sebelum RAM dapat digunakan. Pertukaran optimis ini hanya dilakukan ketika sistem cukup siaga sehingga tidak boleh memperlambat sistem Anda.
Mikko Rantalainen
26

Swap space hanya digunakan untuk data yang tidak didukung oleh file lain. Data yang dipetakan dari file lain pada disk (seperti program yang dapat dieksekusi) masih ditukar dengan file masing-masing bahkan jika Anda tidak memiliki perangkat swap.

psusi
sumber
9
Sebagai contoh, perhatikan suatu kasus di mana Anda memiliki nol swap dan sistem hampir kehabisan RAM. Kernel akan mengambil memori dari mis. Firefox (dapat melakukan ini karena Firefox menjalankan kode yang dapat dieksekusi yang telah dimuat dari disk - kode dapat diambil dari disk lagi jika diperlukan). Jika Firefox kemudian perlu mengakses RAM itu lagi N detik kemudian, CPU menghasilkan "kesalahan keras" yang memaksa Linux untuk membebaskan beberapa RAM (misalnya mengambil beberapa RAM dari proses lain), memuat data yang hilang dari disk dan kemudian memungkinkan Firefox untuk melanjutkan biasa. Ini sangat mirip dengan swapping normal dan kswapd0 melakukannya.
Mikko Rantalainen
4

Ini adalah masalah yang diketahui bahwa ketika Linux kehabisan memori, ia dapat memasukkan swap loop daripada melakukan apa yang seharusnya dilakukan, membunuh proses untuk membebaskan ram. Ada pembunuh OOM (Kehabisan Memori) yang melakukan ini tetapi hanya jika Swap dan RAM penuh.

Namun ini seharusnya tidak menjadi masalah. Jika ada banyak proses yang menyinggung, misalnya Firefox dan Chrome, masing-masing dengan tab yang menggunakan dan mengambil memori, maka proses ini akan menyebabkan swap dibaca kembali. Linux kemudian memasuki lingkaran di mana memori yang sama dipindahkan bolak-balik antara memori dan hard drive. Hal ini pada gilirannya menyebabkan pembalikan prioritas mana bertukar beberapa proses bolak-balik membuat sistem tidak responsif.

Jika Anda menonaktifkan swap, Anda memperburuk masalah ini karena kswapd0 sekarang tidak memiliki pilihan selain menukar memori yang dipetakan seperti executable. Jika Anda menukar executable, kemungkinan besar mereka akan ditukar kembali dengan agak cepat.

Saya mencoba memicu perilaku ini di NetBSD untuk pengujian dan apa yang terjadi di sana adalah bahwa proses yang menyinggung menjadi lambat luar biasa sementara OS itu sendiri sangat responsif. Berarti bahwa masalah swapping memang terjadi tetapi tidak ada inversi prioritas. Namun NetBSD tidak memiliki driver AMDGPU jadi saya tetap menggunakan Linux untuk sementara waktu. Mungkin NetBSD tidak memetakan executable memory dan itu sebabnya ia tidak memasukkan loop swap tetapi saya tidak benar-benar cukup tahu tentang implementasinya untuk mengatakan mengapa itu tidak menjadi tidak responsif.

Facebook juga memiliki masalah ini dan menciptakan OOMD yang merupakan Daemon Memori Habis. Ini adalah daemon yang mendeteksi aktivitas kswapd0 dan mulai mematikan proses. Dan menurut Facebook ini hampir seluruhnya menghilangkan masalah server Linux menjadi tidak responsif. Namun saya belum mengujinya dan saya tidak tahu seberapa baik itu akan bekerja di server lain atau desktop / laptop. Menariknya OOMD memiliki beberapa logika memutuskan proses apa yang harus dibunuh terlebih dahulu untuk menjaga proses sistem dan bagian dari sistem server mereka yang bertanggung jawab untuk meluncurkan kembali apa pun yang terbunuh.

Namun ini bukan bagaimana itu harus diselesaikan. OOMD adalah HACK UGLY. Solusi sebenarnya adalah untuk memperbaiki inversi prioritas yang menyebabkan loop swap serta membuat kernel OOM Killer lebih agresif dalam membunuh proses untuk membebaskan memori. Perbaikan berada di dalam kernel karena itu satu-satunya tempat di mana kita dapat memastikan bahwa masalah terdeteksi dalam waktu dan proses sedang dimatikan dengan benar.

Pengaturan swappiness = 0 bukanlah solusi karena ketika sistem kehabisan RAM gratis, ia mulai bertukar apa pun yang terjadi. Tidak ada opsi untuk menjamin bahwa sistem tidak mulai bertukar.

Dan juga memperbaiki aplikasi yang menyinggung bukanlah perbaikan. Terutama tidak jika pengguna ingin mengeksploitasi bug ini untuk sengaja membuat OS tidak responsif. Menjadi responsif adalah tanggung jawab kernel. Jika Firefox membuat dirinya sendiri tidak responsif maka perbaikannya adalah ke aplikasi. Namun itu tidak hanya membuat dirinya tidak responsif tetapi menyebabkan seluruh OS menjadi sangat lambat dan tidak responsif. Untuk tingkat yang dibutuhkan setengah jam untuk masuk ke SSH. SSH tidak ada hubungannya dengan dan jika tidak bisa dijalankan itu adalah bug di kernel, tidak di bagian lain dari sistem. Dan itu bukan bug, itu adalah dua bug. Satu bug adalah inversi prioritas di mana siklus swapping dari rel diizinkan untuk mengganggu proses lain selain proses menyinggung dan itu sendiri buruk. Bug lainnya adalah tidak t mendeteksi bahwa ia berada dalam loop swap dan yang menyebabkan keausan gila pada HDD / SSD atau penyimpanan apa pun yang mendukung swap. Ketika bertukar executable ini kurang masalah karena mereka hanya membaca peta memori yang tidak ditulis kembali ke disk tetapi kswapd0 masih terkunci membaca apa itu pada saat yang sama dihapus dari memori.

Oh dan ada bug ketiga. Fakta bahwa tidak ada cara untuk melindungi CACHE disk agar tidak dimakan ketika aplikasi yang haus memori menelan semua memori yang tersedia. Ini adalah salah satu alasan mengapa kswapd0 membuat sistem tidak responsif. Memori terpetakan paling panas data biasanya disimpan dalam cache disk tetapi ketika firefox telah memakan cache itu, nah itu berarti bahwa membaca disk harus terjadi.

Itu belum tentu Firefox yang menyebabkan masalah Anda tetapi itu adalah browser default, bukan Chrome. Dan keduanya diketahui secara luas memicu masalah ini karena mereka memperlakukan memori yang tersedia sebagai sesuatu yang terbuang, termasuk cache dan swap memori yang dalam Linux dianggap sebagai "memori yang tersedia". Jadi agar tidak mendapatkan "memori yang tersedia" dapatkan sia-sia menggunakannya untuk caching dan hal-hal lain. Jelas menggunakan SWAP untuk DISK CACHE adalah IDE SANGAT BURUK tetapi orang-orang di Firefox dan Chrome meresponsnya dengan "memori bebas memori terbuang".

Jadi yang kita miliki di sini adalah tiga bug kernel yang tampaknya tidak dipertimbangkan oleh tim kernel. Dan bug di Firefox, Chrome dan semua turunannya tidak mereka anggap bug. Saya mencoba membuat Firefox di laptop Fedora saya untuk melihat masalah ini dan mungkin menambalnya. Tebak apa. Membangun Firefox dengan GCC pada CPU 4 inti dengan ram 4GB memicu SWAP LOOP dengan PRIORITY INVERSION. Jadi salah satu aplikasi yang harus ditulis ulang adalah GCC. Pada NetBSD yang terjadi hanyalah 4 instance GCC yang berjalan menjadi lebih lambat daripada menjalankan satu instance tetapi tidak membekukan sistem.

Ya ini sedikit kata-kata kasar tapi saya berharap itu menjelaskan masalah saat ini dengan subsistem memori Linux serta aplikasi yang menyebabkannya.

pengguna1657170
sumber
1

Jika Anda tidak memiliki swap dan kswapd0sedang berjalan, sistem Anda sebenarnya menggunakan hampir semua RAM pada saat itu. Sudah waktunya untuk mendapatkan alat yang lebih baik untuk memantau penggunaan memori (atau memori gratis / tersedia dalam sistem).

Perbaikan sebenarnya adalah mengurangi penggunaan memori (menjalankan proses dengan kebocoran memori lebih sedikit, menjalankan lebih sedikit proses, melewatkan menjalankan beberapa proses sama sekali, membatasi jumlah proses anak / pekerja dari beberapa perangkat lunak server) atau untuk mendapatkan lebih banyak RAM. Jika kebutuhan RAM disebabkan oleh kebocoran memori, Anda dapat memilih untuk menggunakan swap. Linux harusnya cukup pintar mendapatkan bagian yang bocor untuk ditukar dengan waktu yang cukup. Memiliki swap lebih baik daripada tidak sama sekali tetapi itu bukan pengganti nyata untuk memiliki jumlah RAM yang memadai.

Mikko Rantalainen
sumber
Ada informasi yang baik di sini dan juga di komentar Anda, tetapi mengaktifkan swap bukanlah solusi dalam batas di mana semua memori yang tersedia (ram + swap) semakin diisi. Ini adalah solusi yang sangat buruk jika terjadi kebocoran memori, karena tidak dapat dihindari bahwa semua memori pada akhirnya akan penuh. Hasil ketika swap + ram penuh sama dengan ketika ram penuh dan swap dinonaktifkan.
Kode Bling