Pertanyaan Apakah ide yang buruk untuk membuat skrip cron yang mengosongkan swap setiap jam?


Selama bertahun-tahun saya mengalami masalah yang sama dengan konfigurasi Ubuntu kecil saya: ruang swap yang digunakan meningkat seiring waktu. Saya mendapat kesan bahwa ini terutama karena memori yang dialokasikan tidak pernah kembali ke RAM meskipun ada cukup ruang untuk itu, kecuali dalam kasus tindakan pengguna seperti menonaktifkan swap.

Saya membuat pendek cron perintah untuk mengotomatisasi ini, dan saya memiliki hasil yang bagus:

#! /bin/sh

echo "* */1 * * * root swapoff -a && swapon -a" >> /etc/crontab

Tetapi karena ini lebih merupakan trik daripada solusi nyata untuk masalah ini, saya bertanya-tanya tentang kemungkinan alasan itu mungkin ide yang buruk, atau bagaimana saya bisa memperbaiki skrip ini untuk membuatnya sedikit lebih pintar?


25
2017-11-06 14:25


asal


Maafkan ketidaktahuan saya, tetapi apa sebenarnya maksud Anda dengan mengatakan ruang SWAP tumbuh seiring dengan waktu dan pengosongan ke RAM dari memori yang dialokasikan? Biasanya Anda mengalokasikan sebagian ruang sebagai swap ke sistem dan tidak pernah mendengarnya lagi. Siapa yang peduli berapa banyak swap yang sebenarnya diambil? Apa masalahnya? - dessert
Mengapa Anda bahkan ingin melakukan ini? Menurut Anda, mengapa beberapa penggunaan swap adalah hal yang buruk? Berapa banyak penggunaan swap yang kita bicarakan? - marcelm
Saya agak bingung. Anda terus berbicara tentang "masalah" tetapi sebenarnya tidak menggambarkan efek negatif apa pun. Mengapa Anda menganggap ini sebagai masalah? - David Schwartz
Jika sesuatu masuk ke dalam swap dan tetap di sana, itu karena tidak ada yang menggunakannya. Dan jika tidak ada yang menggunakannya, lebih baik membiarkan RAM digunakan untuk sesuatu itu aku s diakses, seperti cache, daripada menukar data kembali. - hobbs
Bagaimana ini lebih baik daripada hanya meninggalkan swap? - immibis


Jawaban:


Menggunakannya seperti itu: ya, jelek. Anda benar-benar perlu memeriksa apakah ada cukup memori yang tersedia sebelum Anda mematikannya. Lihat https://askubuntu.com/a/90399/15811 untuk versi yang lebih baik.

Juga: apakah Anda yakin tentang ini? Swap yang dialokasikan tidak berarti swap digunakan. Perintah vmstat, kolom si (swap in) dan so (tukar keluar). Jika tetap 0, Anda mendapat masalah lain. Dalam pertukaran pengalaman saya hampir tidak digunakan, dan Anda mungkin tidak menggunakannya berpikir itu tidak mengosongkannya tetapi tidak ada yang kosong.


51
2017-11-06 14:55



Tunggu apa? Jika tidak ada cukup memori untuk pertukaran berhasil, pertukaran akan terbunuh oleh pembunuh OOM terlebih dahulu. Ya, mereka benar-benar hardcoded itu (itu memeriksa oleh system call). - Joshua
@Yoshua yakin tetapi dia ingin itu bekerja otomatis. Bukan kesalahan. - Rinzwind
Untuk menguraikannya tanpa menuliskan jawaban saya sendiri, menukar penggunaan yang berkembang dari waktu ke waktu bukan hal yang buruk sama sekali. Maksudnya adalah kernel secara perlahan mencari tahu sampah apa yang memakan memori tidak pernah terbiasa dan memindahkannya untuk bertukar sehingga memori dapat digunakan untuk hal-hal yang benar-benar membantu Anda (seperti mampu menyimpan lebih banyak data fs cache sehingga tidak perlu terus membuangnya dan membacanya kembali dari disk). - R..
@Rinzwind cron bekerja dengan baik dengan pekerjaan kesalahan itu, dan skrip yang terhubung tidak digunakan vmstat, antara. - jpaugh


Saya akan mengatakan itu ide yang buruk. Jika Anda berpikir Anda memiliki memori bebas dan proses aktif tidak sedang dipindahkan dari swap ke RAM, maka Anda tidak memiliki banyak memori bebas seperti yang Anda pikir Anda lakukan, atau prosesnya tidak seaktif yang Anda pikirkan aku s.

Jika proses aktif terus bertukar, Anda harus memperbaiki apa pun yang menyebabkan tekanan pada memori. Jika ini bukan proses aktif, apa masalahnya?


41
2017-11-06 14:54



+1: Apa masalahnya? Jangan pernah mengubah sistem yang sedang berjalan, Saya tidak berpikir orang harus mengacaukan fungsi inti sistem seperti itu, terutama bukan tanpa perlu. - dessert
Saya kadang-kadang memiliki masalah di mana saya membunuh proses dengan kebocoran memori (yang memaksa semua yang lain ke dalam swap), meninggalkan saya dengan ~ 10% RAM yang digunakan ... tetapi semua program yang sedang berjalan bertukar sampai saya mengaksesnya lagi. Jadi setiap kali Anda menyentuh sesuatu, ada penundaan dua detik. Saya dapat melihat dari mana OP berasal, dan itu akan bagus untuk itu dilakukan secara otomatis, tetapi ini bukan cara yang benar. - Someone Somewhere
@SomeoneSomewhere Tapi itu bukan cara kerjanya. Jika prosesnya membocorkan memori, secara definisi, tidak aktif menggunakan memori itu (tidak membaca dan menulisnya); itu hanya dialokasikan, oleh kecelakaan. Jika ada proses aktif lainnya, memori yang bocor akan berganti dan itu akan menjadi swap Anda yang penuh dengan sampah, bukan RAM fisik Anda. - David Richerby
@DavidRicherby Jika Anda membuka program di latar belakang, maka program itu tetap kurang aktif daripada kebocoran memori - dan ketika Anda beralih kembali ke sana, ia harus keluar dari swap. - Someone Somewhere
@SomeoneSomewhere Sepertinya Anda salah memahami cara kerja sistem memori. Anda tidak harus memiliki keseluruhan proses dalam RAM fisik: swap dikelola dengan perincian satu halaman. Halaman apa pun yang tidak digunakan untuk sementara waktu dapat ditukar, dan halaman yang seluruhnya terdiri dari memori bocor tidak akan pernah digunakan lagi, jadi tidak akan pernah bertukar kembali setelah ditukar. - David Richerby


Itu ide yang buruk.

Kernel mulai menyalin (tidak bergerak) data untuk bertukar jauh sebelum memori fisik hampir penuh, karena jika beberapa proses membutuhkan banyak memori, setiap halaman yang sudah memiliki salinan yang valid dalam swap dapat digunakan kembali segera tanpa perlu menulis lagi. ke disk.

Umumnya itu terjadi sebagian besar untuk halaman yang belum diakses dalam waktu yang lama, yang merupakan indikator yang baik bahwa tidak mungkin mereka akan segera diakses.

Jika Anda secara eksplisit membuang salinan, yang tidak bermanfaat, karena data masih ada dalam RAM, tetapi mungkin membebani Anda kecepatan ketika beberapa proses ingin mengalokasikan banyak memori dan swapping menjadi perlu.

Kernel juga akan selalu menggunakan ruang swap segera setelah memori fisik di atas 50% penuh, sehingga angka-angka ini tidak akan nol bahkan jika Anda memiliki cukup memori yang terpasang.


34
2017-11-06 15:40



selalu: Saya pikir Anda mengasumsikan itu /proc/sys/vm/swappiness dibiarkan pada nilai defaultnya 70, yang baik untuk server dan halaman yang cukup agresif keluar halaman-halaman kotor dari proses yang belum menyentuh mereka untuk sementara waktu untuk memberikan ruang bagi lebih banyak pagecache. Ini sering buruk untuk desktop karena alt-tab bisa lambat. - Peter Cordes
@PeterCordes, jika halaman benar-benar digusur maka cache telah melihat lebih banyak akses daripada halaman aplikasi yang bersangkutan, jadi ada manfaat bersih untuk menggunakan ini sebagai disk cache. Saya dapat melihat bagaimana kinerja Alt-Tab lebih terlihat oleh pengguna daripada mis. mengkompilasi waktu untuk proyek besar, tetapi merasa sulit untuk merumuskan kebijakan yang menjamin respons instan tanpa mengorbankan terlalu banyak kinerja. - Simon Richter
Dengan kata lain: kernel disetel untuk throughput (swappiness=70), tetapi latensi lebih penting bagi pengalaman pengguna di desktop. Ini adalah tradeoff. Jika Anda secara rutin mengumpulkan hal-hal yang terlalu besar untuk tetap berada di pagecache, maka tentu saja, pergi swappiness sedikit lebih tinggi, seperti 20 atau 30, bukan 5 atau 10. Lihat juga akitaonrails.com/2017/01/17/optimizing-linux-for-slow-computers. Melihat vm.vfs_cache_pressure lebih rendah dari 100 juga mendukung inode cache / metadata direktori di atas halaman data, yang bagus untuk respon UI juga. - Peter Cordes
Tunable lainnya: ambang batas tulis-kembali lonesysadmin.net/2013/12/22/…. Ini mengendalikan seberapa cepat Linux mulai menulis ke disk setelah sesuatu menulis ke file, dan berapa banyak halaman kotor yang diizinkan. (mis. berapa banyak memori yang dapat dihabiskan untuk menulis cache) - Peter Cordes


Ini ide yang buruk. Jika ini berguna, kernel Linux akan menerapkannya dengan cara ini. Saya tidak percaya ada alasan untuk mengubah lebih dari beberapa parameter tuning, karena skrip shell sederhana kemungkinan besar tidak lebih pintar daripada algoritma pengembang kernel.

Pada dasarnya Anda memiliki dua kasus:

  • Proses di ruang swap tidak digunakan pula. Mengapa Anda ingin menarik mereka kembali ke RAM?
  • Ada sedikit RAM, sehingga mereka bertukar dan Anda menariknya kembali ke RAM. Maka sistem Anda akan mengembalikannya sesegera mungkin.

Jadi ada dua poin utama:

  1. Pertama, sistem Anda akan lambat ketika ada terlalu sedikit RAM untuk menjalankan semua program Anda sekaligus. Swap akan membantu Anda menjalankan lebih banyak program, tetapi tidak beralih dengan cepat ke program yang jarang digunakan, yang dapat di-swap. Tidak ada swap bisa mendapatkan yang jarang digunakan yang terbunuh atau mengirim yang sudah digunakan sebelumnya pengecualian out-of-memory.
  2. Kedua, swap adalah hal yang baik dan begitu juga dengan hal-hal dalam pertukaran, karena Anda memiliki RAM gratis dengan biaya program yang saat ini tidak Anda gunakan.

Meskipun tidak mendapatkan masalah kehabisan memori dengan terlalu banyak program, beberapa program dapat mengalokasikan memori berdasarkan RAM yang saat ini gratis (mungkin browser Anda akan menggunakan lebih banyak memcache dan Anda dapat menjelajah lebih cepat) dan kernel dapat menggunakan RAM gratis untuk penyimpanan disk dan pengoptimalan yang serupa. Ketika Anda memaksa swap Anda kosong, kernel akan menjatuhkan cache pembacaan dan mis. memulai instance Firefox baru akan membutuhkan waktu lebih lama daripada saat Firefox masih dalam cache disk.

Jika Anda ingin menyetel perilaku kernel, lihat parameter swappiness.

Dua sumber daya tambahan disumbangkan oleh @ peter-cordes:

Jika Anda benar-benar ingin memiliki swap kosong, Anda dapat mematikan swap secara permanen. Saya tidak melihat mengapa memilikinya selama satu jam dan kemudian mengosongkan itu memiliki kelebihan daripada tidak memiliki swap.


21
2017-11-06 15:34



Lihat juga akitaonrails.com/2017/01/17/optimizing-linux-for-slow-computers dan lonesysadmin.net/2013/12/22/… untuk lebih banyak saran / detail penyetelan. - Peter Cordes


Anda dapat mencapai hasil yang sama dengan memberi tahu kernel untuk membebaskan cache:

echo 3 > /proc/sys/vm/drop_caches

Dengan cara ini Anda menghindari momen singkat dari kemungkinan kelaparan dan meninggalkan kernel memutuskan apa yang diperlukan dan apa yang bisa dibuang.


5
2017-11-07 13:24





Bertentangan dengan ide umum SWAP itu sendiri tidak buruk.
Apa sebenarnya memperlambat sistem Anda adalah aktivitas kernel yang memindahkan Data dari RAM ke SWAP dan kembali ke RAM, swappiness.
Sistem melakukan ini secara otomatis karena dikonfigurasi dengan swappiness.
Ini membuat Memori dari proses yang tidak aktif dibuang ke Partisi Harddisk Swap.
Saya sendiri bekerja selama bertahun-tahun dengan Mesin yang tidak memiliki begitu banyak Memori RAM dan saya selalu memiliki beberapa Memori SWAP yang digunakan. Masih mesin saya bekerja dengan baik sampai Anda mulai memindahkan memori kembali ke RAM, mungkin dengan mencoba menutup aplikasi yang terbuka. Kemudian Beban Kerja mulai meningkat.

  • Jadi dengan membersihkan terus-menerus Anda SWAP Memory, Beban Kerja pada mesin Anda akan sangat meningkat.
  • Menjalankan Aplikasi yang memiliki Memori mereka pada Partisi SWAP dapat merusak dalam eksekusinya.

Sebaliknya saya akan menyarankan Anda belajar secara tertutup aplikasi mana yang menggunakan memori Anda pada baris perintah dengan htop aplikasi dan memutuskan untuk menutup beberapa Aplikasi. Itu gnome-system-monitor dapat memberi Anda wawasan yang baik juga, dalam Proses-Tabnya.
Jika Anda memiliki aplikasi besar yang menggunakan banyak RAM. Jangan jalankan semuanya sekaligus.


0
2017-11-16 13:37