Apa nilai vm.swappiness yang tepat saat menggunakan zram?

13

Saya menggunakan zram di komputer saya sebagai swap yang didukung RAM terkompresi. Ketika sistem perlu menukar sesuatu, menukarnya dengan file swap yang didukung zram kurang lebih sama dengan mengompresi data dalam memori untuk membebaskan ruang. Ini membuat swapping sangat cepat sebagian besar waktu, relatif terhadap swap yang didukung disk. Karena itu, saya bertanya-tanya apakah ada beberapa kinerja yang dapat diperoleh dengan mendorong sistem untuk menukar hal-hal yang tidak terpakai secara lebih agresif, karena dapat melakukannya tanpa benar-benar memukul disk?

Jadi, apakah ada yang mengacau, misalnya, mengatur vm.swappinesske 100 saat menggunakan zram? Apakah ini diinginkan?

sysctl -w vm.swappiness=100
Ryan C. Thompson
sumber
2
Ini adalah pertanyaan yang sangat bagus dan saya pikir beberapa pembandingan adalah untuk menghilangkan opini dan mendapatkan fakta ...
Penatua Geek
Ide bagus, dan zram mungkin telah meningkat sejak 2012 ketika saya menggunakannya terakhir :-)
Huygens
Melakukan tes kecil dan sejauh yang saya tahu memori "dicadangkan" untuk zram masih digunakan sebagai cache. Jika ini dikonfirmasi maka saya pikir mungkin masuk akal untuk menjaga swappiness tetap rendah untuk menghindari siklus CPU?
Vitor

Jawaban:

2

Saya benar-benar tidak akan merekomendasikan untuk menempatkan swappiness lebih tinggi. Mekanisme umum dalam kernel adalah ia akan meletakkan halaman (potongan memori) dalam swap untuk membebaskan sebagian memori untuk tugas-tugas lain yang sedang berjalan.

"Masalah" pertama ketika kernel ingin n halaman dibebaskan, m (dengan m <n, m adalah jumlah halaman terkompresi yang diperlukan untuk menahan n) baru dibuat dalam RAM, saya tidak yakin apakah itu dapat mengganggu kernel atau tidak.

Kemudian, ketika Anda memiliki halaman di swap, ada kemungkinan bahwa Anda menggunakan aplikasi nanti dengan beberapa halamannya di swap. Apa yang dilakukan kernel adalah mengembalikan halaman-halaman tersebut ke dalam memori fisik tetapi tidak menghapusnya dari swap (yang dengan swap standar dapat dilihat sebagai caching , jadi ketika aplikasi kembali di latar belakang, kernel tidak harus menulis kembali halaman-halaman tersebut ke dalam swap lambat). Namun dengan zram itu mungkin bukan trik yang bijaksana, karena Anda kemudian memiliki dalam memori halaman m di zram + halaman yang kembali dalam memori!

Kernel biasanya memiliki "total memori" yang dapat digunakan untuk menjalankan bisnisnya. Ketika Anda menambahkan zram, itu hanya dihitung dalam memori "swap", seperti pada swap berbasis disk apa pun, tetapi mengurangi "total memori" aktual dan yang tidak diharapkan / diantisipasi oleh kernel. Kadang-kadang Anda dapat memiliki perilaku aneh dan tidak diinginkan karena ini!

Dengan zram, alangkah baiknya jika kernel tidak bertukar terlalu banyak ke area ini ketika berada di bawah tekanan memori. Dan Anda harus selalu memiliki partisi swap hard disk nyata lebih besar setidaknya dari ukuran maksimum zram Anda, sehingga sistem tidak akan mendapatkan OOM sedangkan pada saat yang sama Anda akan melihat banyak ruang kosong seperti yang dilaporkan oleh free!

Huygens
sumber
zram menyediakan perangkat blok RAM. Segala sesuatu yang ditulis ke perangkat blok ini akan dikompresi. Jika perangkat zram block digunakan sebagai swap, ketika sistem mencoba untuk memindahkan bagian dari memori untuk menukar itu akan secara efektif memindahkan memori dari satu bagian RAM ke yang lain, kecuali bahwa data akan dikompresi sebelum disalin ke tujuan. Ini secara efektif berfungsi sebagai mekanisme kompresi memori yang murah untuk meningkatkan daya tanggap dalam sistem dengan jumlah memori yang terbatas. ... Zram telah berada di pentas sejak Linux 2.6.33. Di 3.14 zram dipindahkan dari pementasan ke driver / block / zram.
Penatua Geek
1
@ElderGeek tepatnya! Dan saya akan mengambil contoh untuk menggambarkan mengapa itu tidak sempurna. Kernel akan mencoba untuk menghapus 64MB RAM, itu memasukkannya ke dalam zram swap. Dikompresi potongan 64MB sekarang 32MB. Hasilnya adalah memori menurun sebesar 32MB dan bukan 64MB. Sekarang apa yang terjadi ketika aplikasi membutuhkan 64MB kembali dalam memori, salinan kernel (dan tidak bergerak) potongan kembali dalam memori. Sekarang Anda memiliki 64MB dalam RAM + 32MB dalam zram. Mengapa menyalin? Karena kernel cache halaman seperti yang saya jelaskan dalam jawaban saya. Kedua perilaku itu tidak ideal. Dan ketika memori tidak dapat dikompres dengan baik, itu bahkan lebih buruk.
Huygens
Masih dalam tahap pengujian. Saya akan berpikir bahwa harus ada beberapa cara untuk menyetel algoritma caching yang digunakan zram untuk membebaskan halaman terkompresi ketika disalin kembali ke RAM yang tidak terkompresi.
Penatua Geek
Saya sudah mencobanya beberapa kali hingga 2012. Saat itu komputer saya terbatas pada 1GB RAM dan saat browsing internet sangat lambat (saya biasanya membuka 10-50 tab). Tapi sejak itu saya tidak pernah menggunakannya lagi. Saya memiliki RAM lebih dari cukup sehingga saya tidak menggunakan swap lagi. Saat menggunakan zram dengan Firefox saat itu, saya dengan cepat mulai "bertukar" mengingat sedikit RAM yang saya miliki. Dan dengan cepat saya memiliki sistem yang tidak responsif dengan banyak crash. Tanpa zram itu sangat lambat tapi stabil setidaknya. Masalah saya adalah bahwa mungkin itu terus-menerus mengompres / membuka halaman memori.
Huygens
Ya, hasil saya agak mirip, pada sistem dengan 8GB saya bisa memaksa OOM dengan meluncurkan beberapa VM selama pekerjaan pengkodean. Apakah Anda memiliki pengalaman dengan zswap? Tampaknya merupakan alternatif yang layak berdasarkan apa yang saya baca.
Penatua Geek
2

Jawaban singkat: vm.swappiness=100adalah nilai yang sesuai untuk zram (Setidaknya di Debian Stretch dengan Linux 4.9, saya percaya itu adalah nilai terbaik)

Saya sudah menguji vm.swappiness=100untuk saya.

Saya pikir Anda dapat melakukan beberapa tes sederhana untuk memastikan nilai mana yang terbaik untuk Anda.

Saya juga membuat program sederhana untuk menguji pertanyaan ini. x Pada mesin saya nilai yang sangat rendah vm.swappiness(seperti vm.swappiness=1) akan menyebabkan masalah responsif yang jelas.

Tentang SwapCacheddi /proc/meminfo:

Pertama, coba vm.page-cluster=0, ini mungkin dapat mengurangi beberapa yang tidak berguna SwapCacheddari swap-in.

SwapCached dapat mempercepat zram sama dengan perangkat swap non-zram

SwapCached adalah dapat digunakan kembali (gratis) bila perlu:

./linux-4.9/mm$ grep -rn delete_from_swap_cache
memory-failure.c:715:   delete_from_swap_cache(p);
shmem.c:1115:       delete_from_swap_cache(*pagep);
shmem.c:1645:            * unaccounting, now delete_from_swap_cache() will do
shmem.c:1652:               delete_from_swap_cache(page);
shmem.c:1668:       delete_from_swap_cache(page);
vmscan.c:673:       __delete_from_swap_cache(page);
swap_state.c:137:void __delete_from_swap_cache(struct page *page)
swap_state.c:218:void delete_from_swap_cache(struct page *page)
swap_state.c:227:   __delete_from_swap_cache(page);
swapfile.c:947:         delete_from_swap_cache(page);
swapfile.c:987: delete_from_swap_cache(page);
swapfile.c:1023:            delete_from_swap_cache(page);
swapfile.c:1571:            delete_from_swap_cache(page);
./linux-4.9/mm$ 
buta huruf
sumber
0

Halaman perlu ditukar (ke disk) saat memori penuh. Jika Anda menggunakan memori untuk membuat tempat untuk menukar halaman ketika memori penuh, orang akan berpikir itu mengalahkan tujuannya, kecuali jika kompresi membuat perbedaan (dan kemudian akan wajar untuk memampatkan memori secara langsung daripada melalui menukar). Kira kita harus membandingkan ini, karena komputer semakin cepat dalam mengompresi dan mendekompresi dibandingkan dengan kecepatan memori.

Alexander
sumber
Saya menemukan swap yang didukung zram sendiri sangat membantu ketika sistem kehabisan memori. Ini menyelamatkan saya beberapa kali dari terjebak sepenuhnya di neraka dan harus me-restart (saya menganalisis set data besar, jadi saya perlu memori, semua 24 GB itu). Saya hanya ingin tahu apakah vm.swappinessnilainya disetel untuk swap yang didukung disk dan apakah saya harus mengubahnya jika sebagian besar saya akan menggunakan swap yang didukung zram.
Ryan C. Thompson
1
"semakin cepat"? Kompresi on the fly telah berkinerja lebih baik daripada disk I / O langsung selama lebih dari satu dekade terakhir (ini tidak akan pernah lebih cepat dari akses memori - bukan itu intinya)
symcbean
symcbean, Anda lupa "dibandingkan dengan kecepatan memori". Di mana perselisihan itu?
Alexander
Saya pikir poin symcbean adalah bahwa tujuan halaman yang didukung memori terkompresi (zram) adalah untuk menggantikan swapping ke media fisik. Alasan mengapa tidak "mengompres memori secara langsung" adalah karena akan penuh dengan kerumitan bagi aplikasi untuk menentukan bagian mana dari memorinya yang dapat dikompresi dan kapan; subsistem VM adalah tempat yang jauh lebih mudah untuk mengimplementasikannya. Beban kerja yang diuntungkan dari zram memiliki halaman yang tidak ada di set kerja dan dapat dengan mudah dikompres.
Daniel Papasian