Mengapa menggunakan swap ketika ada lebih dari cukup ruang kosong dalam RAM?

125

Menggunakan ruang swap alih-alih RAM dapat secara drastis memperlambat PC.

Jadi mengapa, ketika saya memiliki RAM lebih dari cukup, apakah sistem Linux saya (Arch) menggunakan swap?

Lihat output conky saya di bawah ini:

keluaran kerucut

Juga, mungkinkah ini penyebab masalah kecepatan dan responsif sistem yang saya alami?

Output dari free -m:

$ free -m
             total       used       free     shared    buffers     cached
Mem:          1257       1004        252          0         51        778
-/+ buffers/cache:        174       1082
Swap:          502        144        357
Stefan
sumber
5
Saya cukup yakin dinamika masalah ini telah berubah secara signifikan dengan SSD menjadi norma. Walaupun SSD konsumen reguler Anda masih jauh lebih lambat daripada RAM, sekarang masalah yang lebih murah - RAM $ / GB atau SSD $ / GB. SSD sementara lebih lambat jauh lebih murah dan dalam kebanyakan kasus cukup cepat sehingga bahkan bertukar tidak boleh secara signifikan mengganggu pengalaman pengguna seperti dulu dengan media rotasi.
lkraav
7
Terkadang, jika Anda menggunakan swap di masa lalu karena RAM penuh, Anda dapat memiliki situasi di mana data yang sebelumnya ditukar tetap di sana karena tidak berguna saat ini.
Totor
1
Seperti yang dikatakan Totor. Terkadang sistem akan mengeluarkan sesuatu (untuk alasan apa pun). Jika nanti halaman itu dipindahkan kembali ke memori untuk operasi baca, salinan di ruang swap tidak dihapus. Jika halaman yang sama kemudian ditampilkan lagi, tanpa diubah, ia dapat melakukannya tanpa menulis ke disk lagi. Salinan yang ada di sana sudah mutakhir. Dengan kata lain, sebuah halaman dapat menggunakan ruang swap dan memori utama.
izak

Jawaban:

93

Adalah normal untuk sistem Linux untuk menggunakan beberapa swap bahkan jika masih ada RAM gratis. Kernel Linux akan berpindah untuk menukar halaman memori yang sangat jarang digunakan (misalnya, gettyinstance ketika Anda hanya menggunakan X11, dan beberapa daemon tidak aktif lainnya).

Penggunaan ruang swap hanya menjadi masalah bila RAM tidak cukup, dan kernel dipaksa untuk terus memindahkan halaman memori untuk bertukar dan kembali ke RAM, hanya untuk menjaga aplikasi tetap berjalan. Dalam hal ini, aplikasi monitor sistem akan menunjukkan banyak aktivitas I / O disk.

Sebagai perbandingan, sistem Ubuntu 10.04 saya, dengan dua pengguna yang masuk dengan sesi X11 menjalankan desktop GNOME, menggunakan ~ 600MB swap dan ~ 1GB RAM (tidak termasuk buffer dan cache fs), jadi saya akan mengatakan bahwa angka Anda untuk swap penggunaan terlihat normal.

Riccardo Murri
sumber
39
Dengan menukar program yang tidak aktif, Anda memiliki lebih banyak memori untuk penyimpanan file. Dan itu mempercepat semuanya.
jmanning2k
91

Perilaku ini dapat dikonfigurasi dengan mengatur nilai:

/proc/sys/vm/swappiness

Nilai default adalah 60. Mengaturnya ke 0 berarti tidak pernah menggunakan swap ketika masih ada RAM yang tersisa dan 100 menukar memori sesegera mungkin.

Untuk mengubah nilai sementara (hilang saat reboot):

sudo sysctl vm.swappiness=10

Untuk mengubah nilai secara permanen, edit file:

/etc/sysctl.conf

sebagai root (mis. sudo nano /etc/sysctl.conf) dan ubah atau tambahkan (jika tidak ada) baris:

vm.swappiness

ke nilai yang diinginkan. Jika file ini tidak ada (misalnya di Arch Linux), maka cobalah /etc/sysctl.d/99-sysctl.conf.

Ada beberapa perdebatan tentang apakah pertukaran dengan memori bebas tersedia baik atau buruk, tetapi bantuan Ubuntu memang merekomendasikan nilai 10 untuk sistem Desktop . Lihat juga tutorial tentang Digital Ocean for CentOS ini .

Marcel Stimberg
sumber
27
Perhatikan bahwa mengurangi swappiness tidak selalu berarti peningkatan kinerja atau responsif. Saya telah melihat laporan peningkatan swappiness yang diterjemahkan ke dalam kinerja yang lebih baik. Jangan percaya apa pun yang Anda baca yang tidak termasuk tolok ukur, dan periksa apakah tolok ukur menggunakan beban kerja yang serupa dengan milik Anda.
Gilles
Apakah ini bertahan di seluruh reboot? Saya pikir / proc dibuat ulang setiap boot.
HandyGandy
@HandyGandy: Saya menambahkan informasi ke jawaban cara mengubahnya secara permanen.
Marcel Stimberg
@HandyGandy: menjadi bertele-tele, / proc tidak dibuat ulang pada setiap boot, tetapi proc adalah sistem file virtual, jadi itu hanya "dihasilkan" ketika Anda mengaksesnya. Itu tidak ada pada disk sama sekali.
Lie Ryan
swappinessNilai tidak berpengaruh pada sistem saya. Bahkan pengaturan ke 0, akan terus memindahkan halaman penting dan sering digunakan (misalnya indeks IDE saya) untuk bertukar ketika masih ada ram 2GB gratis.
chefarov
46

Linux mulai bertukar sebelum RAM diisi. Ini dilakukan untuk meningkatkan kinerja dan daya tanggap:

  • Performanya meningkat karena terkadang RAM lebih baik digunakan untuk cache disk daripada menyimpan memori program. Jadi lebih baik untuk menukar program yang sudah tidak aktif untuk sementara waktu, dan alih-alih menyimpan file yang sering digunakan dalam cache.

  • Responsiveness ditingkatkan dengan menukar halaman ketika sistem idle, daripada ketika memori penuh dan beberapa program berjalan dan meminta lebih banyak RAM untuk menyelesaikan tugas.

Swapping memang memperlambat sistem, tentu saja - tetapi alternatif untuk swapping tidak bertukar, itu memiliki lebih banyak RAM atau menggunakan lebih sedikit RAM.

Gilles
sumber
Jadi, dalam arti tertentu, swap adalah ukuran dalam kasus ? Itu, dan hal hibernasi ?
tshepang
@Tepanget: Memiliki cukup swap agar sesuai dengan memori virtual Anda tidak “dalam kasus”, itu perlu (jika tidak, program Anda akan macet karena kekurangan memori).
Gilles
1
@Tepangor: Pembunuh OOM adalah alasan mereka jatuh. (Secara teknis Anda bisa melakukannya tanpa pembunuh OOM dan tidak dapat mengalokasikan apa pun, tetapi itu akan memiliki peluang bagus untuk mengunci sistem; pembunuh OOM membuatnya sedikit lebih mungkin bagi admin untuk dapat masuk dan agar proses-proses penting tetap berjalan.)
Gilles
1
Saya mengerti maksud Anda "menukar halaman saat sistem idle, bukan ketika memori penuh", tetapi orang itu hampir tidak menggunakan 15% dari RAM-nya. Jauh dari hampir kenyang, bukan? Meskipun swapping sebelumnya yang disebabkan oleh RAM penuh mungkin telah meninggalkan situasi ini ...
Totor
1
"Linux mulai bertukar sebelum RAM diisi" kapan? tepatnya
Yousha Aleayoub
12

Ini adalah pos lama, bagaimanapun, saya masih akan mengambil kebebasan untuk meletakkan pikiran saya di sini.

Mulai dari bawah, Linux akan membagi memori menjadi beberapa halaman (biasanya 4K per halaman pada sistem x86_64). Setelah itu, memori virtual dibuat, yang pemetaannya dilakukan dengan memori fisik menggunakan MMU (Memory Management Unit).

Proses dialokasikan memori dari area memori virtual, jadi harap dicatat, ketika Anda melihat / proc / meminfo, Anda akan melihat VMalloc * sebagai detail memori virtual.

Katakanlah Anda memiliki proses yang meminta memori (katakanlah 300MB - browser web). Proses ini akan dialokasikan 300MB dari memori virtual, namun, tidak perlu memori dipetakan (yang dipetakan ke memori fisik). Ada konsep "Copy on Write" untuk manajemen memori, di mana, jika proses Anda benar-benar menggunakan memori yang dialokasikan dari memori virtual (yaitu melakukan beberapa penulisan pada memori), hanya kemudian dipetakan ke memori fisik. Ini membantu kernel untuk bekerja dengan baik di lingkungan multi-proses secara efisien.

Apa itu cache?

Banyak memori yang digunakan oleh proses dibagikan. Katakanlah pustaka glibc digunakan oleh hampir semua proses. Apa gunanya menyimpan banyak salinan glibc dalam memori, ketika setiap proses dapat mengakses lokasi memori yang sama dan melakukan pekerjaan itu. Sumber daya yang sering digunakan tersebut disimpan dalam cache sehingga ketika memproses permintaan, sumber daya tersebut dapat dirujuk ke lokasi memori yang sama. Ini membantu mempercepat proses, karena membaca glibc (dll.) Lagi & lagi dari disk akan menghabiskan waktu.

Di atas adalah untuk pustaka bersama per katakan, serupa juga berlaku untuk membaca file juga. Jika Anda membaca file besar (katakanlah 100-200MB) untuk pertama kalinya, itu akan memakan banyak waktu. Namun, ketika Anda mencoba dan melakukan baca yang sama lagi, itu akan lebih cepat. Data di-cache dalam memori, dan membaca ulang tidak dilakukan untuk semua blok.

Apa itu buffer?

Sejauh menyangkut buffer, ketika suatu proses melakukan file I / O, itu bergantung pada buffer kernel untuk menulis data ke disk. Proses, meminta kernel untuk melakukan pekerjaan. Jadi, atas nama proses, kernel menulis data ke "buffer" -nya, dan memberi tahu proses bahwa penulisan dilakukan. Dengan cara async, kernel akan terus menyinkronkan data ini dalam buffer ke disk. Dengan cara ini, proses bergantung pada kernel untuk memilih waktu yang tepat untuk menyinkronkan data ke disk, dan proses dapat terus bekerja di depan. Ingat, ini adalah I / O umum yang dilakukan proses normal. Namun, proses khusus, yang perlu mengkonfirmasi bahwa I / O benar-benar dilakukan pada disk dapat menggunakan mekanisme lain untuk melakukan I / O pada disk. Beberapa utilitas opensource adalah libaio. Juga, ada cara untuk memanggil sinkronisasi eksplisit ke FD yang dibuka dalam konteks proses Anda,

Apa itu kesalahan halaman?

Pertimbangkan sebuah contoh, ketika Anda memulai proses (misalkan browser web), yang binernya sekitar 300MB. Namun, 300MB biner peramban web yang lengkap tidak mulai berfungsi secara instan. Proses terus bergerak dari fungsi-ke-fungsi dalam kodenya. Seperti yang dikatakan sebelumnya, Memori Virtual akan dikonsumsi 300MB, tidak semua memori dipetakan ke memori fisik (RSS - memori penduduk akan lebih sedikit, lihat output atas). Ketika eksekusi kode mencapai titik, di mana memori tidak benar-benar dipetakan secara fisik, kesalahan halaman akan menjadi masalah. Kernel akan memetakan memori ini ke fisik, kaitkan halaman memori dengan proses Anda. Kesalahan halaman semacam itu disebut "Minor Page Faults". Demikian pula, ketika suatu proses melakukan kesalahan file I / O halaman utama dinaikkan.

Kapan dan mengapa Swap Out terjadi?

Situasi 1:

Sejalan dengan rincian di atas, mari kita pertimbangkan skenario ketika jumlah memori yang baik menjadi memori yang dipetakan. Dan sekarang sebuah proses dimulai, yang membutuhkan memori. Seperti dibahas di atas, kernel harus melakukan pemetaan memori. Namun, tidak tersedia cukup RAM fisik untuk memetakan memori. Sekarang, kernel akan lebih dulu melihat ke dalam cache, ia akan memiliki beberapa halaman memori lama yang tidak digunakan. Ini akan menyiram halaman-halaman itu ke partisi yang terpisah (disebut SWAP), membebaskan beberapa halaman, dan memetakan halaman yang dibebaskan ke permintaan baru yang datang. Karena penulisan disk jauh lebih lambat daripada RAM solid-state, proses ini membutuhkan banyak waktu, dan karenanya memperlambat terlihat.

Situasi 2:

Katakanlah Anda melihat banyak memori bebas yang tersedia di sistem. Bahkan kemudian Anda melihat bahwa ada banyak swap-out yang terjadi. Mungkin ada masalah kemungkinan fragmentasi memori. Pertimbangkan sebuah proses, yang membutuhkan 50 MB memori yang berdekatan dari kernel. (perlu diingat berdekatan). Jelas, kernel akan mengalokasikan halaman secara acak untuk proses yang berbeda, dan membebaskan sebagian dari mereka. Namun, ketika kita menuntut memori yang berdekatan, itu harus mencari potongan yang memuaskan proses permintaan. Jika tidak bisa mendapatkan memori seperti itu, itu harus melakukan swap-out dari beberapa halaman memori lama dan kemudian mengalokasikan yang berdekatan. Bahkan dalam kasus seperti itu SWAP akan terjadi. Mulai Kernel ver 2.6 dan di atas, masalah fragmentasi tersebut telah berkurang secara signifikan. Namun, jika sistem berjalan untuk waktu yang lama, masalah seperti itu masih bisa datang.

Lihat contoh ini ( output vmstat )

2016-10-29 03:55:32 procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
2016-10-29 03:55:32  r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
2016-10-30 03:56:04 19 23 2914752 4692144 3344908 12162628 1660    1  8803 12701 4336 37487 14  7 40 38  0
2016-10-30 03:56:34  3 20 2889296 4977580 3345316 12026752 2109    2  8445 14665 4656 36294 12  7 46 34  0
2016-10-30 03:57:04  1 11 3418868 4939716 3347804 11536356  586 4744  2547  9535 3086 24450  6  3 59 33  0  <<<-----
2016-10-30 03:57:34  3 19 3456252 5449884 3348400 11489728 3291 13371  6407 17957 2997 22556  6  4 66 24  0
2016-10-30 03:58:04  7  6 4194500 5663580 3349552 10857424 2407 12240  3824 14560 2295 18237  4  2 65 29  0
2016-10-30 03:58:34  2 16 4203036 5986864 3348908 10838492 4601 16639  7219 18808 2575 21563  6  4 60 31  0
2016-10-30 03:59:04  3 14 4205652 6059196 3348760 10821448 6624 1597  9431  4357 1750 20471  6  2 60 31  0
2016-10-30 03:59:34  2 24 4206968 6053160 3348876 10777216 5221 2067 10106  7377 1731 19161  3  3 62 32  0
2016-10-30 04:00:04  0 13 4205172 6005084 3348932 10785896 6236 1609 10330  6264 1739 20348  4  2 67 26  0
2016-10-30 04:00:34  4 11 4206420 5996396 3348976 10770220 6554 1253 10382  4896 1964 42981 10  5 58 27  0
2016-10-30 04:01:04  6  4 4177176 5878852 3348988 10825840 8682  765 10126  2716 1731 32949  8  4 69 19  0

@ 2016-10-30 03:57:04, kita melihat bahwa masih ada jumlah RAM gratis yang baik. Namun, itupun swap out terjadi. Kami memeriksa pohon proses pada saat ini, dan kami tidak melihat proses apa pun yang muncul yang menuntut jumlah memori yang tinggi (lebih dari memori bebas). Kecurigaan yang jelas adalah Situasi 2 yang dijelaskan di atas. Kami memeriksa buddyinfo dan zoneinfo log di atas (Gunakan echo m> / proc / sysrq-trigger untuk memeriksa ini, hasilnya masuk ke syslogs).

Untuk sistem normal kita, perbandingan info zona berlaku seperti ini. Dan grafik untuk cache / free / mem rendah juga disebutkan di bawah ini

info zona

swap gratis rendah, gratis

Melihat info, jelas bahwa ada fragmentasi memori di simpul 0 & simpul 1 normal (Node itu adalah mesin berbasis NUMA, maka beberapa node (lihat numactl untuk memeriksa info untuk sistem Anda)).

Fragmentasi memori juga merupakan alasan mengapa penggunaan swap dapat meningkat bahkan ketika memori bebas ada.

Anugraha Sinha
sumber
2
Anda harus mengklarifikasi jika dalam "situasi 2" Anda, proses yang menuntut mengalokasikan memori fisik yang merupakan kasus yang tidak biasa. Sebagian besar proses hanya berurusan dengan memori virtual di mana fragmentasi hampir tidak relevan. Anda mungkin juga ingin menjelaskan lebih baik bagaimana Anda menegaskan ada fragmentasi memori dari angka-angka dan grafik yang ditampilkan karena tidak jelas pada pandangan pertama. Oh, dan omong-omong, Anda sebenarnya berbicara tentang memori yang berdekatan , mudah-mudahan memori tidak menular ;-)
jlliagre
@ jlliagre: Terima kasih atas masukannya. Saya sedang mengedit kesalahan "berdekatan".
Anugraha Sinha
5

Memiliki lebih banyak memori yang tersedia

Seperti semua orang katakan, ya swap akan membantu Anda menyingkirkan memori yang tidak digunakan, sehingga dapat membantu Anda memiliki lebih banyak memori yang tersedia.

Hibernasi

Tetapi swap juga dapat digunakan untuk hibernasi yang dapat sangat berguna ketika Anda memiliki laptop atau ingin menghemat energi dan menempatkan komputer Anda dan bekerja dalam hibernasi sebelum meninggalkan pekerjaan. Jadi Anda bisa memulai lebih cepat di pagi hari sesudahnya.

Memiliki fungsi hibernasi adalah salah satu alasan utama kita masih melihat saat ini menyarankan untuk memiliki setidaknya ukuran RAM untuk swap. Dengan begitu sistem dapat menempatkan semua RAM yang digunakan ke dalam swap dan masuk ke hibernasi.

Kedatangan pendek

Berhati-hatilah bahwa sekali proses pertukaran data proses dapat dibaca dalam swap bahkan setelah shutdown, kecuali swap itu dienkripsi (tentu saja).

Menggunakan swap terenkripsi dengan hibernasi tidak bekerja di luar kotak dengan semua distribusi. Anda perlu menggunakan kunci enkripsi konstan (beberapa pengaturan secara acak menghasilkan kunci enkripsi ruang swap pada setiap boot) dan initrd / initramfs untuk mengaktifkan volume terenkripsi sebelum melanjutkan.

Huygens
sumber
3

Banyak program modern dibangun di atas kerangka yang membengkak yang menyeret banyak sampah yang sebenarnya tidak Anda perlukan untuk menjalankan program. Menukar halaman yang tidak digunakan akan membebaskan RAM untuk cache dan program yang benar-benar dapat menggunakan RAM.

Saya berbicara dari pengalaman pribadi yang menyakitkan di sini.

Tahun lalu, saya mengalihkan salah satu situs web saya ke kerangka server web baru yang menjanjikan yang dibangun di atas Firefox. Mungkin terdengar aneh untuk membangun sistem sisi-server di atas program yang berfokus pada klien seperti Firefox, tetapi memiliki beberapa manfaat besar. Firefox sangat kuat, menawarkan beberapa layanan internal yang sangat mengesankan, dan mengurangi ketidakcocokan impedansi antara server dan klien untuk memiliki keduanya menjalankan platform yang sama.

Tapi ada kekurangannya: Firefox itu besar. Sangat besar. Ini adalah proyek semacam versi 1.x, jadi mereka belum sempat melakukan hal-hal seperti menghapus dukungan GUI. [*] Situs saya tidak memerlukan semua itu, tetapi karena teknologi VPS yang digunakan penyedia hosting saya tidak melakukannya t memungkinkan ruang swap, kode GUI itu dan semua bagian lain Firefox yang tidak saya gunakan makan RAM sungguhan. Saya akhirnya membutuhkan minimal 512 MB RAM hanya untuk menjalankan situs tanpa crash karena kehabisan memori. Jika VPS saya memiliki ruang swap, saya mungkin bisa mendapatkan dengan rencana 256 MB.

[*] Menghapus kode GUI dari framework bahkan mungkin tidak diinginkan, karena salah satu manfaat platform ini adalah pengikisan web dengan kesetiaan tinggi, karena kerangka sisi server dapat mengunduh halaman web dari situs lain, dan Anda dapat memanipulasinya. sama seperti yang Anda lakukan di sisi klien. Pikirkan mashup. Banyak hal semacam itu akan pecah jika Anda tidak dapat "merender" halaman web ke dalam beberapa konteks grafis.

Ngomong-ngomong, kerangka kerja web ini pada dasarnya sudah mati sekarang, jadi tidak ada gunanya menamai dan mempermalukannya. Yang terbaik untuk mengambil pelajaran yang lebih luas ke hati: ya, swap masih berguna bahkan jika Anda memiliki pertunjukan RAM gratis.

Warren Young
sumber
3

Dari Ubuntu Swap, FAQ yang terhubung dengan Marcel

Sebagai basis minimum, sangat disarankan ruang swap harus sama dengan jumlah memori fisik (RAM). Juga, direkomendasikan bahwa ruang swap dua kali jumlah memori fisik (RAM) tergantung pada jumlah hard disk

Saya pikir Anda harus menambah ruang swap di sistem Anda. Swap mempercepat alokasi memori RAM dengan memungkinkan untuk membuang data yang sudah dipetakan.

Jader Dias
sumber
6
Saya masih menemukan ini sulit dipercaya. Mengapa saya perlu swap 8 GB untuk sistem 4GB saya, yang tidak pernah berhibernasi? Apakah saya benar-benar membutuhkan 128GB swap untuk node komputasi 64GB saya? Saya biasanya mengalokasikan tidak lebih dari 1GB untuk swap kecuali ada alasan yang sangat spesifik.
David Mackintosh
2
Ini meninggalkan lebih banyak ruang untuk caching HDD lambat-sebagai-semua-heck di RAM cepat. (Plus, beberapa skema hibernasi menyimpan salinan RAM ke dalam swapspace)
Arafangion
6
@David, @Jader: Swap = 2 * angka ram adalah kastanye tua yang bertahan baik setelah pembenaran asli menjadi tidak relevan - sekarang orang mencoba mencari cara untuk membenarkan angka ini, alih-alih menghasilkan angka yang sesuai untuk sistem mereka . Lihat mengapa kita perlu mengatur ruang swap dua kali lebih besar dari memori fisik kita? .
Gilles
1
@Gilles Saya tetap dengan posisi saya karena saya pernah melihat sebuah makalah resmi tentang hal ini yang bertentangan dengan sekelompok ahli yang saya tidak tahu seberapa dalam pengetahuan mereka.
Jader Dias
4
Jika Anda dapat mengingat referensi tersebut, silakan bagikan.
Gilles
2

Saya pikir "Gilles" telah menyebutkan fakta bahwa, sementara Anda mungkin memiliki lebih dari cukup RAM, swap dapat berguna selama "kekurangan" tertentu serta secara tetap menyimpan beberapa data bahkan setelah penutupan - atau apakah saya salah dalam mengasumsikan itu? ( sejak RAM memerah setelah reboot) Saya memiliki 12GB RAM yang tersedia di sistem saya, dan saya juga telah mempertimbangkan pertanyaan ini sebelumnya. Pada satu titik, ketika saya telah menonaktifkan semua swap dan hanya mengandalkan RAM saya, saya memiliki pengalaman yang sangat sulit mencoba men-debug beberapa kesalahan sistem, atau crash, dll setelah sistem shutdown. Sejak itu, saya telah mengaktifkan kembali partisi swap.

ILMostro_7
sumber