Mengapa swap digunakan meskipun saya memiliki banyak RAM gratis?

208

Saya pikir seluruh esensi dari swap adalah untuk bertindak sebagai jaring pengaman penyimpanan sementara ketika RAM penuh tetapi partisi swap saya terus digunakan walaupun saya kadang-kadang memiliki sebanyak 3GB RAM gratis. Apakah ini normal?

Mysterio
sumber
3
Silakan berbagi konten atau output dari perintah berikut / file untuk lebih membantu kami memecahkan masalah Anda ( petunjuk dalam jawaban ini ) : free -m,top -b 1
ish
Akan memperbarui pertanyaan dengan pastebins dari perintah-perintah itu besok. Sekarang jam 12 pagi :(
Mysterio
Saya harus mengedit judul untuk menambahkan "... tapi saya terlalu mengantuk untuk peduli sekarang, jadi kalian juga tidur siang": P
ish

Jawaban:

188

Anda dapat mencoba mengubah nilai "swappiness" Anda:

Dari FAQ Swap Ubuntu :

Apa itu swappiness dan bagaimana cara mengubahnya?

Parameter swappiness mengontrol kecenderungan kernel untuk memindahkan proses dari memori fisik dan ke swap disk. Karena disk jauh lebih lambat daripada RAM, ini dapat menyebabkan waktu respons yang lebih lambat untuk sistem dan aplikasi jika proses terlalu agresif keluar dari memori.

  1. swappiness dapat memiliki nilai antara 0 dan 100

  2. swappiness = 0 memberi tahu kernel untuk menghindari proses swapping dari memori fisik selama mungkin. Untuk Kernel versi 3.5 dan yang lebih baru menonaktifkan swapiness.

  3. swappiness = 100 memberitahu kernel untuk secara agresif menukar proses dari memori fisik dan memindahkannya ke swap cache

Pengaturan default di Ubuntu adalah swappiness = 60. Mengurangi nilai default swappiness mungkin akan meningkatkan kinerja keseluruhan untuk instalasi desktop Ubuntu yang khas. Nilai swappiness = 10 direkomendasikan, tetapi jangan ragu untuk bereksperimen. Catatan: Instalasi server Ubuntu memiliki persyaratan kinerja yang berbeda untuk sistem desktop, dan nilai default 60 kemungkinan lebih cocok.

Untuk memeriksa nilai swappiness

cat /proc/sys/vm/swappiness

Untuk mengubah nilai swappiness Perubahan sementara (hilang saat reboot) dengan nilai swappiness 10 dapat dilakukan

sudo sysctl vm.swappiness=10

Untuk membuat perubahan permanen , edit file konfigurasi dengan editor favorit Anda:

gksudo gedit /etc/sysctl.conf

Cari vm.swappiness dan ubah nilainya sesuai keinginan. Jika vm.swappiness tidak ada, tambahkan ke akhir file seperti ini:

vm.swappiness=10

Simpan file dan reboot.

Anda juga dapat melihat: https://askubuntu.com/a/103916/54187

jpetersen
sumber
1
Spekulasi menganggur: ini sebenarnya bisa bermanfaat untuk kinerja - halaman yang belum diakses dalam beberapa saat dapat disalin ke ruang swap, yang memungkinkan OS untuk mengusir mereka dengan cepat jika membutuhkan memori, tetapi konten halaman tetap dalam memori .
Simon Richter
7
@SimonRichter Ya itu idenya. Swappiness of 60 mungkin terlalu agresif pada sistem modern, karena itu berarti Anda mulai menukar ketika Anda masih memiliki beberapa gigs memori bebas.
Brendan Long
1
Jalankan sudo sysctl --load=/etc/sysctl.confsetelah mengedit file untuk menerapkan perubahan
deFreitas
92

Ada beberapa aspek berbeda untuk pertanyaan Anda.

Pertama, apa definisi Anda tentang "bebas". Ini sebenarnya tidak sesederhana seperti yang terdengar di Linux (atau sistem operasi modern).

Bagaimana Linux menggunakan RAM (sangat sederhana)

Setiap aplikasi dapat menggunakan sebagian dari memori Anda. Linux menggunakan semua memori yang tidak dihuni (kecuali untuk beberapa Mb terakhir) sebagai "cache". Ini termasuk halaman cache, inode cache, dll. Ini adalah hal yang baik - ini membantu mempercepat segalanya. Baik menulis ke disk maupun membaca dari disk dapat dipercepat dengan cache.

Idealnya, Anda memiliki cukup memori untuk semua aplikasi Anda, dan Anda masih memiliki beberapa ratus Mb tersisa untuk cache. Dalam situasi ini, selama aplikasi Anda tidak meningkatkan penggunaan memori dan sistem tidak berjuang untuk mendapatkan ruang yang cukup untuk cache, tidak perlu untuk swap apa pun.

Setelah aplikasi mengklaim lebih banyak RAM, itu hanya masuk ke beberapa ruang yang digunakan oleh cache, menyusut cache. De-alokasi cache murah dan cukup mudah dilakukan secara real time - semua yang berada di cache adalah salinan kedua dari sesuatu yang sudah ada di disk, jadi bisa langsung dibatalkan alokasinya secara instan, atau itu adalah sesuatu yang kita inginkan harus flush ke disk dalam beberapa detik ke depan pula .

Ini bukan situasi yang khusus untuk Linux - semua sistem operasi modern bekerja dengan cara ini. Sistem operasi yang berbeda mungkin hanya melaporkan RAM bebas secara berbeda: beberapa menyertakan cache sebagai bagian dari apa yang mereka anggap "bebas" dan beberapa mungkin tidak.

Ketika Anda berbicara tentang RAM gratis, itu jauh lebih berarti untuk memasukkan cache, karena sebenarnya gratis - itu tersedia jika ada aplikasi yang memintanya. Di Linux, freeperintah melaporkannya dua arah - baris pertama termasuk cache di kolom RAM yang digunakan, dan baris kedua termasuk cache (dan buffer) di kolom gratis.

Bagaimana Linux menggunakan swap (bahkan lebih disederhanakan)

Setelah Anda menggunakan cukup memori sehingga tidak ada cukup sisa untuk cache yang berjalan mulus, Linux dapat memutuskan untuk mengalokasikan kembali beberapa memori aplikasi yang tidak digunakan dari RAM untuk swap.

Itu tidak melakukan ini sesuai dengan cut-off yang pasti. Ini tidak seperti Anda mencapai persentase alokasi tertentu kemudian Linux mulai bertukar. Ini memiliki algoritma yang agak "fuzzy". Dibutuhkan banyak hal untuk diperhitungkan, yang dapat dijelaskan dengan "berapa banyak tekanan yang ada untuk alokasi memori". Jika ada banyak "tekanan" untuk mengalokasikan memori baru, maka itu akan meningkatkan peluang beberapa akan ditukar untuk membuat lebih banyak ruang. Jika ada sedikit "tekanan" maka itu akan mengurangi peluang ini.

Sistem Anda memiliki pengaturan "swappiness" yang membantu Anda mengubah cara "tekanan" ini dihitung. Biasanya tidak disarankan untuk mengubahnya sama sekali, dan saya tidak akan merekomendasikan Anda mengubahnya. Bertukar secara keseluruhan adalah hal yang sangat baik - meskipun ada beberapa kasus tepi yang membahayakan kinerja, jika Anda melihat kinerja sistem secara keseluruhan, itu adalah keuntungan bersih untuk berbagai tugas. Jika Anda mengurangi swappiness, Anda membiarkan jumlah memori cache menyusut sedikit lebih banyak daripada yang seharusnya, bahkan ketika itu mungkin benar-benar bermanfaat. Apakah ini pertukaran yang cukup baik untuk masalah apa pun yang Anda alami dengan bertukar, itu terserah Anda. Anda hanya harus tahu apa yang Anda lakukan, itu saja.

Ada situasi yang terkenal di mana swap benar-benar merusak kinerja yang dirasakan pada sistem desktop, dan itu adalah seberapa cepat aplikasi dapat menanggapi input pengguna lagi setelah dibiarkan menganggur untuk waktu yang lama dan memiliki proses latar belakang yang berat di IO (seperti backup semalam) dijalankan. Ini adalah kelambatan yang sangat terlihat, tetapi tidak cukup untuk membenarkan mematikan swap secara bersamaan dan sangat sulit untuk dicegah dalam sistem operasi apa pun. Matikan swap dan kelesuan awal ini setelah pemindaian cadangan / virus mungkin tidak terjadi, tetapi sistem mungkin berjalan sedikit lebih lambat sepanjang hari. Ini juga bukan situasi yang terbatas pada Linux.

Ketika memilih apa yang akan ditukar ke disk, sistem mencoba untuk memilih memori yang sebenarnya tidak digunakan - baca atau tulis. Ini memiliki algoritma yang cukup sederhana untuk menghitung ini yang memilih dengan baik sebagian besar waktu.

Jika Anda memiliki sistem di mana Anda memiliki jumlah RAM yang sangat besar (pada saat penulisan, 8GB adalah jumlah yang sangat besar untuk distro Linux biasa), maka Anda akan sangat jarang mendapatkan situasi di mana swap diperlukan sama sekali. Anda bahkan dapat mencoba mematikan swap. Saya tidak pernah merekomendasikan melakukan itu, tetapi hanya karena Anda tidak pernah tahu kapan lebih banyak RAM dapat menyelamatkan Anda dari beberapa aplikasi crash. Tetapi jika Anda tahu Anda tidak akan membutuhkannya, Anda bisa melakukannya.

Tetapi bagaimana cara swap mempercepat sistem saya? Tidak bertukar hal memperlambat?

Tindakan mentransfer data dari RAM ke swap adalah operasi yang lambat, tetapi itu hanya diambil ketika kernel cukup yakin manfaat keseluruhan akan lebih besar daripada ini. Misalnya, jika memori aplikasi Anda telah naik ke titik di mana Anda hampir tidak memiliki cache yang tersisa dan I / O Anda sangat tidak efisien karena ini, Anda sebenarnya bisa mendapatkan lebih banyak kecepatan dari sistem Anda dengan membebaskan beberapa memori, bahkan setelah biaya awal swapping data untuk membebaskannya.

Ini juga merupakan pilihan terakhir jika aplikasi Anda benar-benar meminta lebih banyak memori daripada yang sebenarnya Anda miliki. Dalam hal ini, bertukar diperlukan untuk mencegah situasi kehabisan memori yang sering mengakibatkan aplikasi mogok atau harus dibunuh secara paksa.

Swapping hanya dikaitkan dengan waktu di mana sistem Anda berkinerja buruk karena itu terjadi pada saat Anda kehabisan RAM yang dapat digunakan, yang akan memperlambat sistem Anda (atau membuatnya tidak stabil) bahkan jika Anda tidak memiliki swap. Jadi untuk menyederhanakan banyak hal, swapping terjadi karena sistem Anda menjadi macet, bukan sebaliknya.

Setelah data dalam swap, kapan keluar lagi?

Mentransfer data dari swap adalah (untuk hard disk tradisional, setidaknya) sama memakan waktu dengan memasukkannya ke sana. Jadi bisa dimengerti, kernel Anda akan segan untuk menghapus data dari swap, terutama jika itu tidak benar-benar digunakan (yaitu membaca dari atau ditulis ke). Jika Anda memiliki data dalam swap dan itu tidak digunakan, maka itu sebenarnya hal yang baik bahwa itu tetap di swap, sejak ia meninggalkan lebih banyak memori untuk hal-hal lain yang sedang digunakan, berpotensi mempercepat sistem anda.

thomasrutter
sumber
5
+1 untuk penjelasan terperinci. Saya juga suka menyimpan swap 2GiB di komputer saya. Jika ada masalah - memori bocor, dll., Maka Anda dapat melihat swap naik dan mencari masalah sebelum kehabisan memori terjadi. Ini adalah jaring pengaman serta alat kinerja.
Joe
1
Di netbook saya, yang hanya memiliki 2GB RAM, saya menyimpan swap 4GB. Ini karena saya menggunakan netbook lebih banyak dari yang seharusnya dan program saya sering membutuhkan lebih dari 2GB memori. Karena Linux berperilaku sangat buruk dalam situasi kehabisan memori, saya lebih suka memiliki jaring pengaman yang besar. Dan saya punya banyak ruang disk.
Scott Severance
Jika program Anda sering membutuhkan lebih dari 2GB memori saya akan mempertimbangkan membuang lebih banyak RAM di sana (sangat murah!) Karena melelahkan RAM akan melukai kinerja. Untuk kepentingan pembaca lain: pastikan Anda tidak hanya melihat memori cache yang seharusnya menyimpan RAM yang tersedia - lihat referensi lain untuk free -m.
thomasrutter
2
@neon_overload: Saya hanya perlu mencatat bahwa menurut HP, RAM maksimum netbook saya adalah 1GB. Saya punya 2GB di sana sekarang, dan sumber internet menyarankan bahwa 2GB adalah maksimum sebenarnya. Jadi, kebutuhan akan solusi semacam ini.
Scott Severance
@thomasrutter: Bagaimana jawaban Anda berubah untuk server besar, salah satu dari saya punya ram 1TB (ya satu terabyte penuh) dan masih menggunakan swap; pengaturan swappiness apa dan partisi swap ukuran apa yang akan Anda rekomendasikan?
chrisinmtown
24

Menetapkan nilai swappiness tidak berfungsi di setiap situasi. Jika itu berhasil untuk Anda, bagus. Jika tidak, saya telah menulis skrip untuk menghapus swap secara berkala dengan mematikannya dan kembali lagi.

Beralih swap agak berisiko jika Anda tidak hati-hati. Jika Anda tidak memiliki RAM bebas yang cukup untuk menampung semuanya di dalam RAM plus semua yang ada di swap, mencoba menonaktifkan swap akan menyebabkan sistem Anda menjadi tidak responsif. Skrip saya pertama-tama memeriksa apakah ada cukup RAM bebas (yang perlu sedikit dilakukan, karena jumlah sebenarnya RAM bebas berbeda dari apa yang freedilaporkan sebagai bebas), kemudian hanya beralih bertukar jika demikian. Tetapi, jika Anda kekurangan RAM, jangan memulai proses besar lainnya saat skrip berjalan. Ini dia:

#!/bin/bash

# Make sure that all text is parsed in the same language
export LC_MESSAGES=en_US.UTF-8
export LC_COLLATE=en_US.UTF-8
export LANG=en_US.utf8
export LANGUAGE=en_US:en
export LC_CTYPE=en_US.UTF-8

# Calculate how much memory and swap is free
free_data="$(free)"
mem_data="$(echo "$free_data" | grep 'Mem:')"
free_mem="$(echo "$mem_data" | awk '{print $4}')"
buffers="$(echo "$mem_data" | awk '{print $6}')"
cache="$(echo "$mem_data" | awk '{print $7}')"
total_free=$((free_mem + buffers + cache))
used_swap="$(echo "$free_data" | grep 'Swap:' | awk '{print $3}')"

echo -e "Free memory:\t$total_free kB ($((total_free / 1024)) MB)\nUsed swap:\t$used_swap kB ($((used_swap / 1024)) MB)"

# Do the work
if [[ $used_swap -eq 0 ]]; then
    echo "Congratulations! No swap is in use."
elif [[ $used_swap -lt $total_free ]]; then
    echo "Freeing swap..."
    swapoff -a
    swapon -a
else
    echo "Not enough free memory. Exiting."
    exit 1
fi

Anda harus menjalankan skrip ini sebagai root (mis. Dengan sudo). Skrip ini tidak akan membuat sistem Anda tidak responsif; jika RAM Anda tidak mencukupi, itu akan menolak untuk beralih swap. Saya telah menggunakan skrip ini tanpa masalah selama hampir lima tahun sekarang.

Scott Severance
sumber
+1 untuk skrip. Anda mungkin ingin memodernisasi sedikit dengan mengubah MB ke MiB di output. Saya menulis skrip yang sama tanpa semua tes keamanan (baik) yang Anda sertakan. Di buku catatan lama saya di mana swap sering digunakan, perlu beberapa saat untuk menjalankan - satu atau dua menit, tetapi tidak ada salahnya. Sekali waktu itu akan gagal karena tidak ada memori bebas yang cukup untuk dijalankan, tetapi itu tidak menyebabkan masalah tambahan. Saya harus reboot untuk membersihkan semuanya ketika itu terjadi. Itu ada hubungannya dengan apa yang tampak seperti kebocoran memori dalam Transmisi (sejak diperbaiki, saya percaya) dan hanya memiliki ram 2GiB.
Joe
6
Jika sesuatu telah dipindahkan untuk ditukar dan tetap dalam swap, itu biasanya hal yang baik - itu berarti data tidak benar-benar digunakan, dan itu membebaskan sebagian RAM Anda untuk hal-hal lain, menghasilkan potensi peningkatan kecepatan. Apa yang membuat Anda percaya bahwa data ini tidak boleh di-swap dan seharusnya menggunakan RAM yang lebih berharga? Biasanya kernel cukup bagus untuk mengetahui apa yang tidak digunakan, dan yang aman dapat tetap bertukar untuk membebaskan RAM.
thomasrutter
@neon: Ingatlah bahwa mesin saya masing-masing memiliki 2GB dan 3GB RAM, yang sangat sedikit belakangan ini. Buktinya ada dalam kinerja. Misalnya, memunculkan menu atau beralih program bisa lambat karena bertukar, begitu juga efek viso Kompos. Kelambatan ini disembuhkan dengan beralih swap, sehingga menunjukkan bahwa setidaknya dalam beberapa situasi algoritma optimasi kernel adalah suboptimal. Saya tidak bisa berdebat dengan pengalaman yang berulang.
Scott Severance
Fiuh !! Ini hanya mendorong turun ke 0% dari swap .... Saya tidak punya banyak waktu untuk melihat ke pertanyaan lengkap dan jawabannya tetapi saya suka untuk membacanya ketika saya mendapatkan waktu luang.
AzkerM
Mengapa Anda tidak mengatur swappiness ke nilai yang rendah? Tampaknya melakukan hal yang sama dengan naskah Anda, tetapi dengan cara yang jauh lebih terkontrol.
jhfrontz
4

Umumnya swap tetap tidak digunakan pada sistem sekarang-a-hari. Dalam pengalaman saya, proses yang berjalan untuk waktu yang lama tanpa operasi intensif dialihkan ke swap oleh linux.
Itu membuat beberapa program yang terpengaruh berjalan lambat.
Jika Anda memiliki banyak ram gratis, Anda dapat menonaktifkan swap dengan menjalankan perintah:
swapoff -av(Anda akan memerlukan sudohak untuk itu.)
Jika Anda tidak suka swap off, Anda dapat mengaktifkannya, menggunakan perintah simetris:
swapon -av( sudodiperlukan lagi ).

drake01
sumber
12
Menghidupkan Swap off seluruhnya adalah berlebihan karena swapiness = 0 melakukan hal yang sama, tapi lebih aman (jika Anda lakukan berakhir dengan terlalu banyak hal dalam memori, ia akan melempar sesuatu di swap).
Brendan Long
@BrendanLong Fair point .. Terima kasih sudah mengajari saya. :)
drake01
3

Sekali swap telah digunakan untuk suatu program, ia cenderung tetap dipetakan selama program. Banyak program memiliki kode (dan data) yang jarang digunakan .. Setelah memori ditukar, tidak mungkin untuk ditukar.

Salah satu cara untuk memaksa halaman-halaman ini ke dalam memori adalah mematikan perangkat swap. Jika Anda memiliki dua, Anda dapat mematikan satu, menyalakannya kembali, lalu mematikan yang kedua. Jika swap benar-benar diperlukan, itu akan berpindah antar perangkat. Anda bisa mematikan perangkat swap (atau file), tetapi jika Anda benar-benar membutuhkan ruang swap, hal-hal drastis bisa terjadi.

Selain hal-hal normal dalam memori, tempfs menggunakan ruang swap, dan akan bertukar keluar seperti sisa memori. Jika Anda menjalankan sesuatu yang membutuhkan banyak disk sementara, itu mungkin memaksa halaman untuk ditukar. Setelah file temp dibuat tidak dapat digunakan lagi setelah beberapa menit dan merupakan kandidat yang baik untuk dipindahkan ke perangkat swap.

Dalam keadaan darurat, Anda dapat menggunakan file sebagai perangkat swap. Ini berguna jika Anda membutuhkan ruang swap tambahan sementara.

BillThor
sumber
2

Saya mengedit skrip Scott Severance untuk mencocokkan versi gratis yang lebih baru yang sudah menyertakan total bidang memori yang tersedia.

#!/bin/bash

free_mem="$(free | grep 'Mem:' | awk '{print $7}')"
used_swap="$(free | grep 'Swap:' | awk '{print $3}')"

echo -e "Free memory:\t$free_mem kB ($((free_mem / 1024)) MiB)\nUsed swap:\t$used_swap kB ($((used_swap / 1024)) MiB)"
if [[ $used_swap -eq 0 ]]; then
    echo "Congratulations! No swap is in use."
elif [[ $used_swap -lt $free_mem ]]; then
    echo "Freeing swap..."
    sudo swapoff -a
    sudo swapon -a
else
    echo "Not enough free memory. Exiting."
    exit 1
fi
derberlinersmurf
sumber