Pertanyaan Mengapa swap digunakan meskipun saya memiliki banyak RAM gratis?


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


183
2018-06-29 22:16


asal


Silakan berbagi konten atau output dari perintah / file berikut untuk lebih membantu kami memecahkan masalah Anda (instruksi dalam jawaban ini): free -m, top -b 1 - ish
Akan memperbarui pertanyaan dengan pastebins dari perintah tersebut 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:


Anda dapat mencoba mengubah nilai "swappiness" Anda:

Dari FAQ Swap Ubuntu:

Apa yang dimaksud dengan swappiness dan bagaimana cara mengubahnya?

Parameter swappiness mengontrol kecenderungan kernel untuk memindahkan proses keluar 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 memberitahu kernel untuk menghindari proses swapping dari memori fisik selama mungkin

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

Pengaturan default di Ubuntu adalah swappiness = 60. Mengurangi nilai default dari 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 dibuat dengan

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 seperti yang diinginkan. Jika vm.swappiness tidak ada, tambahkan ke ujung file seperti:

vm.swappiness=10

Simpan file dan reboot.

Anda juga bisa memeriksanya: https://askubuntu.com/a/103916/54187


160
2018-06-29 23:10



Spekulasi diam: ini sebenarnya bisa bermanfaat untuk kinerja - halaman yang belum diakses dalam beberapa saat dapat disalin ke ruang swap, yang memungkinkan OS untuk mengusirnya dengan cepat jika perlu memori, tetapi isi halaman tetap berada di memori . - Simon Richter
@SimonRichter Ya itulah idenya. Swappiness 60 mungkin terlalu agresif pada sistem modern, karena itu berarti Anda mulai bertukar ketika Anda masih memiliki beberapa gigs of free memory. - Brendan Long
Menjalankan sudo sysctl --load=/etc/sysctl.conf setelah mengedit file untuk menerapkan perubahan - deFreitas


Ada beberapa aspek berbeda untuk pertanyaan Anda.

Pertama, apa definisi Anda tentang "gratis" itu. Sebenarnya tidak sesederhana yang terdengar di Linux (atau sistem operasi modern).

Bagaimana Linux menggunakan RAM (sangat disederhanakan)

Setiap aplikasi dapat menggunakan sebagian dari memori Anda. Linux menggunakan semua memori yang tidak terisi (kecuali untuk beberapa Mb terakhir) sebagai "cache". Ini termasuk cache halaman, cache inode, dll. Ini adalah hal yang baik - ini membantu mempercepat pekerjaan. Menulis ke disk dan membaca dari disk dapat sangat cepat diserap oleh cache.

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

Setelah aplikasi mengklaim lebih banyak RAM, itu hanya masuk ke beberapa ruang yang digunakan oleh cache, menyusutkan cache. De-alokasi cache murah dan cukup mudah yang hanya dilakukan secara real time - semua yang ada di cache adalah hanya salinan kedua dari sesuatu yang sudah ada di disk, jadi bisa langsung dialihkan, atau itu sesuatu yang kita akan harus menyiram ke disk dalam beberapa detik berikutnya bagaimanapun.

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

Ketika Anda berbicara tentang RAM gratis, itu jauh lebih berarti termasuk cache, karena praktis gratis - tersedia jika aplikasi memintanya. Di Linux, free perintah melaporkan kedua cara - baris pertama termasuk cache di kolom RAM yang digunakan, dan baris kedua berisi cache (dan buffer) di kolom gratis.

Bagaimana Linux menggunakan swap (bahkan lebih sederhana)

Setelah Anda menggunakan cukup memori yang tidak cukup tersisa untuk cache yang berjalan lancar, Linux dapat memutuskan untuk mengalokasikan ulang beberapa memori aplikasi yang tidak terpakai dari RAM untuk bertukar.

Itu tidak melakukan ini sesuai dengan cut-off yang pasti. Ini tidak seperti Anda mencapai persentase tertentu dari alokasi kemudian Linux mulai bertukar. Ini memiliki agak "fuzzy" algoritma. Diperlukan banyak hal, yang dapat digambarkan dengan "seberapa besar tekanan yang ada untuk alokasi memori". Jika ada banyak "tekanan" untuk mengalokasikan memori baru, maka itu akan meningkatkan peluang sebagian akan ditukarkan untuk membuat lebih banyak ruang. Jika ada lebih sedikit "tekanan" maka itu akan mengurangi peluang ini.

Sistem Anda memiliki pengaturan "swappiness" yang membantu Anda mengubah bagaimana "tekanan" ini dihitung. Biasanya tidak dianjurkan untuk mengubah ini sama sekali, dan saya tidak akan merekomendasikan Anda untuk mengubahnya. Menukar secara keseluruhan adalah hal yang sangat baik - meskipun ada beberapa kasus tepi di mana itu merugikan kinerja, jika Anda melihat kinerja sistem secara keseluruhan itu adalah manfaat bersih untuk berbagai tugas. Jika Anda mengurangi swappiness, Anda membiarkan jumlah memori cache mengecil sedikit lebih banyak daripada yang seharusnya, bahkan ketika itu benar-benar berguna. Apakah ini merupakan pertukaran yang cukup baik untuk masalah apa pun yang Anda hadapi dengan swapping terserah Anda. Anda hanya harus tahu apa yang Anda lakukan, itu saja.

Ada situasi terkenal di mana swap benar-benar merugikan kinerja yang dirasakan pada sistem desktop, dan itu adalah bagaimana cepatnya aplikasi dapat merespon input pengguna lagi setelah dibiarkan menganggur untuk waktu yang lama dan memiliki proses latar belakang yang berat dalam IO (seperti semalam backup) jalankan. Ini adalah kelesuan yang sangat terlihat, tetapi tidak cukup untuk membenarkan mematikan swap bersama-sama dan sangat sulit untuk mencegah 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 bukan situasi yang terbatas pada Linux juga.

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

Jika Anda memiliki sistem di mana Anda memiliki sejumlah besar RAM (pada saat penulisan, 8GB adalah jumlah yang sangat besar untuk distro Linux yang khas), maka Anda akan sangat jarang sekali mengenai situasi di mana swap diperlukan sama sekali. Anda bahkan dapat mencoba menonaktifkan 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 lakukan.

Tapi bagaimana bisa menukar mempercepat sistem saya? Tidak bertukar hal yang lambat?

Tindakan mentransfer data dari RAM ke swap adalah operasi yang lambat, tetapi hanya diambil ketika kernel cukup yakin manfaat keseluruhan akan lebih besar daripada ini. Sebagai contoh, jika memori aplikasi Anda telah meningkat ke titik di mana hampir tidak ada 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 pertukaran data untuk membebaskannya.

Ini juga merupakan pilihan terakhir jika aplikasi Anda benar-benar meminta lebih memori dari yang sebenarnya Anda miliki. Dalam hal ini, swapping diperlukan untuk mencegah situasi out-of-memory yang sering mengakibatkan aplikasi crash atau harus dibunuh secara paksa.

Swapping hanya terkait 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, pertukaran terjadi karena sistem Anda menjadi macet, bukan sebaliknya.

Setelah data di swap, kapan data itu keluar lagi?

Mentransfer data dari swap adalah (untuk hard disk tradisional, paling tidak) sama menghabiskan waktu seperti meletakkannya di sana. Jadi dapat dimengerti, kernel Anda akan segan untuk menghapus data dari swap, terutama jika itu tidak benar-benar digunakan (yaitu baca dari atau ditulis ke). Jika Anda memiliki data dalam swap dan itu tidak digunakan, maka itu sebenarnya hal yang baik bahwa itu tetap dalam swap, karena itu meninggalkan lebih banyak memori untuk hal-hal lain yang adalah sedang digunakan, berpotensi mempercepat sistem Anda.


83
2017-07-04 03:50



+1 untuk penjelasan detail. Saya juga ingin menyimpan 2GiB swap di komputer saya. Jika sesuatu menjadi buruk - kebocoran memori, dll., Maka Anda dapat melihat swap naik dan mencari masalah sebelum kehabisan memori terjadi. Ini jaring pengaman serta alat kinerja. - Joe
Di netbook saya, yang hanya memiliki RAM 2GB, saya menyimpan 4GB swap. Ini karena saya menggunakan netbook untuk lebih banyak yang dimaksudkan untuk dan program saya sering membutuhkan lebih dari 2GB memori. Karena Linux berperilaku sangat buruk dalam situasi di luar 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 untuk membuang lebih banyak RAM di dalamnya (ini sangat murah!) Karena RAM yang melelahkan akan merusak kinerja. Untuk kepentingan pembaca lain: pastikan Anda tidak hanya melihat memori cache yang ada seharusnya untuk mengasimakan RAM yang tersedia - lihat referensi lain free -m. - thomasrutter
@neon_overload: Saya hanya perlu mencatat bahwa menurut HP, RAM maksimum netbook saya adalah 1GB. Saya punya 2GB di sana sekarang, dan sumber internet menunjukkan bahwa 2GB adalah maksimum yang sebenarnya. Dengan demikian kebutuhan akan solusi semacam ini. - Scott Severance
@thomasrutter: Bagaimana jawaban Anda berubah untuk server besar, salah satu dari saya memiliki 1TB (ya satu terabyte penuh) dan masih menggunakan swap; pengaturan swappiness dan partisi swap ukuran berapa yang akan Anda rekomendasikan? - chrisinmtown


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

Toggling swap sedikit berisiko jika Anda tidak berhati-hati. Jika Anda tidak memiliki cukup RAM gratis untuk menyimpan semuanya dalam RAM plus segala sesuatu dalam swap, mencoba menonaktifkan swap akan menyebabkan sistem Anda menjadi tidak responsif. Skrip saya terlebih dahulu memeriksa apakah ada cukup RAM gratis (yang perlu sedikit dilakukan, karena jumlah aktual RAM gratis berbeda dari apa free laporan sebagai gratis), maka hanya matikan swap jika demikian. Tetapi, jika Anda sedikit kekurangan RAM, jangan memulai proses besar lainnya saat skrip sedang 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 (misalnya, dengan sudo). Skrip ini tidak akan meninggalkan sistem Anda tanpa respons; jika Anda tidak memiliki RAM yang cukup, ia akan menolak untuk beralih swap. Saya telah menggunakan skrip ini tanpa masalah selama hampir lima tahun sekarang.


21
2017-07-04 02:38



+1 untuk skrip. Anda mungkin ingin memodernkannya sedikit dengan mengubah MB ke MiB di output. Saya menulis skrip yang serupa tanpa semua tes keamanan (baik) yang Anda masukkan. Di notebook lama saya di mana swap digunakan sangat banyak, akan membutuhkan waktu untuk berjalan - satu atau dua menit, tetapi tidak melukai apa pun. Sesekali ia akan gagal karena tidak ada cukup memori gratis untuk menjalankannya, tetapi itu tidak menimbulkan masalah tambahan. Saya harus me-reboot untuk menyelesaikan masalah ketika itu terjadi. Itu harus dilakukan dengan apa yang tampak seperti kebocoran memori di Transmisi (karena tetap, saya percaya) dan hanya memiliki 2GiB ram. - Joe
Jika sesuatu telah dipindahkan untuk ditukar dan tetap dalam pertukaran, itu biasanya hal yang baik - itu berarti data tidak benar-benar digunakan, dan itu membebaskan beberapa RAM Anda untuk hal-hal lain, menghasilkan dorongan potensial dalam kecepatan. Apa yang membuat Anda percaya bahwa data ini tidak boleh di swap dan seharusnya mengambil lebih banyak RAM yang berharga? Biasanya kernel cukup bagus dalam mengetahui apa yang tidak terpakai, dan yang dapat dengan aman tetap bertukar untuk membebaskan RAM. - thomasrutter
@neon: Ingatlah bahwa mesin saya memiliki RAM 2GB dan 3GB, yang sangat sedikit belakangan ini. Bukti ada dalam kinerja. Misalnya, memunculkan menu atau beralih program bisa lambat karena bertukar, seperti halnya efek Compos visoal. Kelambatan ini disembuhkan dengan beralih swap, sehingga menunjukkan bahwa setidaknya dalam beberapa situasi algoritma optimasi kernel adalah suboptimal. Saya tidak bisa berdebat dengan pengalaman berulang. - Scott Severance
Fiuh !! Ini hanya mendorong ke 0% dari swap .... Saya tidak punya banyak waktu untuk melihat ke dalam pertanyaan lengkap ini dan jawabannya tetapi saya Menginginkannya untuk membacanya ketika saya mendapatkan waktu luang. - AzkerM
Mengapa Anda tidak menetapkan saja kesenangan pada nilai yang rendah? Itu sepertinya melakukan hal yang sama dengan naskah Anda, tetapi dengan cara yang jauh lebih terkontrol. - jhfrontz


Umumnya swap tetap tidak digunakan pada sistem sekarang-per-hari. Dalam pengalaman saya, proses yang berjalan untuk waktu yang lama tanpa operasi intensif digeser untuk ditukar oleh linux.
Itu membuat beberapa program yang terpengaruh berjalan lambat.
Jika Anda memiliki banyak ram gratis, Anda dapat mengganti swap dengan menjalankan perintah:
swapoff -av (kamu akan membutuhkan sudo hak untuk itu.)
Jika Anda tidak suka swap, Anda dapat mengaktifkannya, menggunakan perintah simetris:
swapon -av (lagi sudo wajib).


4
2018-06-29 22:24



Mematikan semua adalah overkill karena swapiness = 0 melakukan hal yang sama, tetapi lebih aman (jika Anda melakukan berakhir dengan terlalu banyak barang di memori, itu akan melempar sesuatu dalam swap). - Brendan Long
@BrendanLong Titik adil .. Terima kasih telah mengajari saya. :) - drake01


Setelah swap digunakan untuk program, program ini cenderung tetap dipetakan selama masa program. Banyak program memiliki kode (dan data) yang jarang digunakan .. Setelah memori ditukar, tidak mungkin menukarnya.

Salah satu cara untuk memaksa halaman ini ke dalam memori adalah mematikan perangkat swap. Jika Anda memiliki dua, Anda dapat mematikannya, 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 dapat terjadi.

Selain hal-hal normal dalam memori, tempfs menggunakan ruang swap, dan akan bertukar seperti sisa memori. Jika Anda menjalankan sesuatu yang memerlukan banyak disk sementara, ini dapat memaksa halaman untuk ditukarkan. Setelah dibuat temp file mungkin tidak lagi digunakan setelah beberapa menit dan 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 ekstra untuk sementara.


3
2018-06-30 04:02





Saya mengedit naskah Scott Severance untuk mencocokkan versi gratis yang lebih baru yang sudah termasuk bidang memori total 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

2
2017-10-03 13:37