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

26

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 cronperintah singkat untuk mengotomatisasi ini, dan saya memiliki hasil yang baik:

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

Yvan Sraka
sumber
29
Maafkan ketidaktahuan saya, tetapi apa sebenarnya yang Anda maksud dengan mengatakan ruang SWAP tumbuh dengan waktu dan pengosongan ke RAM dari memori yang dialokasikan ? Biasanya Anda mengalokasikan beberapa ruang sebagai swap ke sistem dan tidak pernah mendengar darinya lagi. Siapa yang peduli berapa banyak swap sebenarnya diambil? Apa masalahnya?
hidangan penutup
5
Mengapa Anda bahkan ingin melakukan ini? Menurut Anda mengapa beberapa penggunaan swap adalah hal yang buruk? Berapa banyak penggunaan swap yang kita bicarakan?
marcelm
25
Saya agak bingung. Anda terus berbicara tentang "masalah" tetapi sebenarnya tidak menggambarkan efek negatif apa pun. Mengapa Anda menganggap ini masalah?
David Schwartz
17
Jika sesuatu masuk ke swap dan tetap di sana, itu karena tidak ada yang menggunakannya. Dan jika tidak ada yang menggunakannya, lebih baik untuk membiarkan RAM digunakan untuk sesuatu yang sudah diakses, seperti Cache, daripada swap kembali data dalam.
Hobbs
12
Bagaimana ini lebih baik daripada hanya meninggalkan swap off?
user253751

Jawaban:

51

Menggunakannya seperti itu: ya, buruk. Anda benar-benar perlu memeriksa apakah ada cukup memori yang tersedia sebelum Anda mematikan swap. Lihat /ubuntu//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(swap out). Jika mereka tetap 0 Anda punya masalah lain. Dalam pengalaman saya swap jarang digunakan, dan Anda mungkin tidak menggunakannya berpikir itu tidak mengosongkannya tetapi tidak ada yang kosong.

Rinzwind
sumber
3
Tunggu apa? Jika tidak ada cukup memori untuk swapoff untuk berhasil, swapoff terbunuh oleh pembunuh OOM terlebih dahulu. Ya, mereka benar-benar membuat kode (itu memeriksa dengan system call)
Joshua
@ Yosua yakin tapi dia ingin itu bekerja otomatis. Bukan kesalahan.
Rinzwind
4
Menguraikan tanpa menuliskan jawaban saya sendiri, penggunaan swap yang meningkat seiring waktu bukanlah hal yang buruk sama sekali . Apa artinya adalah bahwa kernel secara perlahan mencari tahu apa sampah yang memakan memori tidak pernah digunakan dan memindahkannya untuk bertukar sehingga memori dapat digunakan untuk hal-hal yang benar-benar membantu Anda (seperti bisa menyimpan lebih banyak data fs di-cache sehingga tidak harus terus membuangnya dan membaca kembali dari disk).
R ..
@Rinzwind cron berfungsi baik dengan pekerjaan yang salah, dan skrip yang ditautkan juga tidak digunakan vmstat.
jpaugh
41

Menurut saya itu ide yang buruk. Jika Anda berpikir Anda memiliki memori bebas dan proses aktif tidak dipindahkan dari swap ke RAM, maka Anda tidak memiliki memori bebas sebanyak yang Anda pikir Anda miliki, atau prosesnya tidak seaktif seperti yang Anda pikirkan. aku s.

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

muru
sumber
1
+1: Apa masalahnya? Jangan pernah mengubah sistem yang sedang berjalan , saya tidak berpikir seseorang harus mengacaukan fungsi inti sistem seperti itu, terutama tidak tanpa perlu.
hidangan penutup
3
Saya kadang-kadang memiliki masalah di mana saya membunuh proses dengan kebocoran memori (yang memaksa semuanya keluar ke swap), meninggalkan saya dengan ~ 10% RAM yang digunakan ... tetapi semua program yang berjalan di swap sampai saya mengaksesnya lagi. Jadi setiap kali Anda menyentuh sesuatu, ada jeda dua detik. Saya dapat melihat dari mana OP berasal, dan akan menyenangkan jika dilakukan secara otomatis, tetapi ini bukan cara yang benar.
Seseorang di suatu tempat
1
@ Seseorang di suatu tempat Tapi itu bukan cara kerjanya, sih. Jika proses ini bocor memori maka, menurut definisi, itu tidak secara aktif menggunakan memori itu (tidak membaca dan menulisnya); itu hanya dialokasikan, secara tidak sengaja. Jika ada proses aktif lainnya di sekitar, memori yang bocor akan ditukar dan itu akan menjadi swap Anda yang penuh dengan sampah, bukan RAM fisik Anda.
David Richerby
@ DavidRicherby Jika Anda punya program terbuka di latar belakang, maka program itu masih kurang aktif daripada kebocoran memori - dan ketika Anda pergi untuk kembali ke sana, itu harus keluar dari swap.
Seseorang di suatu tempat
@ Seseorang di suatu tempat Anda tampaknya salah paham tentang cara kerja sistem memori. Anda tidak harus memiliki seluruh proses dalam RAM fisik: swap dikelola pada rincian halaman tunggal. Halaman mana saja yang belum pernah digunakan untuk sementara waktu mungkin akan ditukar, dan halaman yang seluruhnya terdiri dari memori yang bocor tidak akan pernah digunakan lagi, jadi tidak akan pernah bisa ditukar kembali setelah itu ditukar.
David Richerby
34

Itu ide yang buruk.

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

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

Jika Anda secara eksplisit membuang salinan, itu tidak membawa manfaat, karena data masih ada dalam RAM, tetapi mungkin dikenakan biaya lebih cepat ketika beberapa proses ingin mengalokasikan banyak memori dan bertukar menjadi diperlukan.

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

Simon Richter
sumber
4
selalu : Saya pikir Anda menganggap bahwa /proc/sys/vm/swappinessdibiarkan pada nilai default 70, yang baik untuk server dan cukup agresif 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 menjadi lambat.
Peter Cordes
@PeterCordes, jika halaman benar-benar diusir maka cache telah melihat lebih banyak akses daripada halaman aplikasi yang bersangkutan, jadi ada manfaat bersih untuk menggunakan ini sebagai cache disk. Saya dapat melihat bagaimana kinerja Alt-Tab lebih terlihat oleh pengguna daripada misalnya waktu kompilasi untuk proyek besar, tetapi merasa sulit untuk merumuskan kebijakan yang menjamin respons instan tanpa mengorbankan terlalu banyak kinerja.
Simon Richter
1
Dengan kata lain: kernel disetel untuk throughput ( swappiness=70), tetapi latensi lebih penting untuk pengalaman pengguna di desktop. Ini tradeoff. Jika Anda secara rutin mengkompilasi barang-barang yang sedikit terlalu besar untuk tetap berada di dalam pagecache, maka pastikan, sisakan swappinesssedikit lebih tinggi, seperti 20 atau 30 daripada 5 atau 10. Lihat juga akitaonrails.com/2017/01/17/optimizing-linux-for -lambat-komputer . Melihat vm.vfs_cache_pressurelebih rendah dari 100 juga mendukung metadata caching inode / direktori pada halaman data, yang juga bagus untuk responsif UI.
Peter Cordes
1
Tunables lainnya: ambang batas tulis-kembali lonesysadmin.net/2013/12/22/… . Ini mengontrol seberapa cepat Linux mulai menulis ke disk setelah sesuatu ditulis ke file, dan berapa banyak halaman kotor yang diizinkan. (yaitu berapa banyak memori yang dapat dihabiskan untuk menulis caching)
Peter Cordes
21

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

Pada dasarnya Anda memiliki dua kasus:

  • Proses dalam ruang swap tidak digunakan. Mengapa Anda ingin menariknya kembali ke dalam RAM?
  • Ada sedikit RAM, sehingga mereka bisa diganti dan Anda menariknya kembali ke dalam RAM. Kemudian sistem Anda akan menukar mereka lagi 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 mungkin saja diganti. Tidak ada swap yang dapat membuat yang jarang digunakan terbunuh atau mengirim yang saat ini digunakan sebagai pengecualian di luar memori.
  2. Kedua, swap adalah hal yang baik dan begitu juga dengan swap, karena Anda memiliki RAM gratis dengan biaya program yang saat ini tidak Anda gunakan.

Meskipun tidak ada masalah kehabisan memori dengan terlalu banyak program, beberapa program mungkin 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 cache disk dan optimisasi serupa. Ketika Anda memaksa swap Anda menjadi kosong, kernel akan menjatuhkan cache read-nya dan mis. Memulai instance Firefox baru akan memakan waktu lebih lama daripada ketika Firefox masih dalam cache disk.

Jika Anda ingin menyesuaikan 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 mengerti mengapa menyalakannya selama satu jam dan kemudian mengosongkannya memiliki kelebihan dibanding tidak memiliki swap.

allo
sumber
1
Lihat juga akitaonrails.com/2017/01/17/optimizing-linux-for-slow-computer dan lonesysadmin.net/2013/12/22/... untuk saran / rincian penyetelan lebih lanjut.
Peter Cordes
5

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 kehabisan memori dan membiarkan kernel memutuskan apa yang perlu dan apa yang bisa dibuang.

Alex C
sumber
0

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

  • Jadi dengan membersihkan secara konstan Anda SWAP Memory Beban Kerja pada mesin Anda akan sangat meningkat.
  • Menjalankan Aplikasi yang memiliki Memori di Partisi SWAP dapat rusak dalam eksekusi mereka.

Sebaliknya saya akan menyarankan Anda mempelajari secara dekat aplikasi mana yang menggunakan memori Anda pada baris perintah dengan htopaplikasi dan memutuskan untuk menutup beberapa Aplikasi. The gnome-system-monitordapat memberikan wawasan yang baik juga, di nya Proses-Tab.
Jika Anda memiliki aplikasi besar yang menggunakan banyak RAM. Jangan jalankan semuanya sekaligus.

Bodo Hugo Barwich
sumber