Melepaskan ruang swap

10

Kadang-kadang kernel tampaknya berniat menjaga misalnya firefox dalam swap, meskipun ada cukup memori fisik yang tersedia dan saya menggunakan firefox:

robert@rm:~> free -m
             total       used       free     shared    buffers     cached
Mem:          3009       1904       1104          0        109        679
-/+ buffers/cache:       1116       1892
Swap:         4102        885       3216

Apakah ada perintah untuk memerintahkan kernel untuk menjatuhkan ruang swap dan menggunakan memori bebas yang tersedia?


Pembaruan : meskipun dalam jangka pendek saya telah menggunakan swapon / swapoff, saya sekarang mengatur

sudo sysctl vm.swappiness=30

seperti yang disarankan dalam respons lain, dan dapatkan hasil yang sangat baik.

Robert Munteanu
sumber

Jawaban:

2

Anda dapat melakukanswapoff - akan membutuhkan root privilege,
tetapi, saya kira itu bukan masalah bagi Anda.

nik
sumber
15

Anda bisa melakukan apa yang disarankan nik dan menggunakan swapoff . Namun, ada cara lain yang lebih elegan untuk mengubah "swappiness", atau seberapa agresif kernel menukar program ke disk dalam sistem yang menjalankan kernel 2.6.

Telah ada perdebatan sengit tentang mailing list kernel linux tentang kebijakan yang harus diikuti kernel mengenai perilaku swapping . Hasilnya adalah kita sekarang memiliki patch di kernel 2.6 yang memungkinkan kita mengubah perilaku ini sebagian besar.

Perhatikan bahwa Anda memerlukan hak akses root untuk melakukan ini, karena Anda akan menjalankan perintah swapoff / swapon.

Nilai "swappiness" saat ini dapat diperiksa dalam file / proc / sys / vm / swappiness , atau dengan menjalankan perintah sysctl ini :

sudo sysctl vm.swappiness

Nilai "swappiness" dapat berkisar dari 0 (tanpa swapping) hingga 100 (bertukar ke disk sebanyak mungkin). Ubuntu dikirimkan dengan swappiness default yang diatur ke 60.

Untuk mengubah ini pada suatu sesi, panggil sysctl lagi dan berikan nilai swappiness untuk digunakan:

sudo sysctl vm.swappiness=30

Selain gratis , Anda tentu saja dapat memantau efek dari melakukan ini melalui utilitas htop atau iotop yang sangat baik .

Jika Anda menyukai apa yang Anda lihat, dan ingin mempertahankan nilai ini di seluruh reboot, cukup tempatkan "vm.swappiness = 30" di file /etc/sysctl.conf .

$ sudo sysctl vm.swappiness
vm.swappiness = 30
$ sudo sysctl vm.swappiness=40
vm.swappiness = 40
$ sudo sysctl vm.swappiness
vm.swappiness = 40
$ sudo tail /etc/sysctl.conf 
#net.ipv4.conf.all.accept_source_route = 0
#net.ipv6.conf.all.accept_source_route = 0
#
# Log Martian Packets
#net.ipv4.conf.all.log_martians = 1
#
# The contents of /proc/<pid>/maps and smaps files are only visible to 
# readers that are allowed to ptrace() the process
# kernel.maps_protect = 1
vm.swappiness=30

Anda dapat bermain dengan nilai yang berbeda sampai Anda menemukan nilai yang memerlukan tingkat pertukaran yang dapat diterima pada mesin Anda.


sumber
+1 untuk sysctl. Saat bereksperimen dengan nilai swappiness yang berbeda, Anda dapat menulis langsung ke file proc (echo "30"> / proc / sys / vm / swappiness). Perubahan ini bersifat sementara dan tidak akan menulis ke /etc/sysctl.conf. Setelah Anda puas dengan pengaturannya, kemudian gunakan sysctl untuk melakukan perubahan 'permanen'.
Shawn Chin
6

Ingatlah bahwa barang-barang dalam swap ditempatkan di sana pada waktu yang lebih sibuk daripada sekarang.

Anda mungkin menemukan bahwa data juga dalam RAM - telah dimuat kembali untuk digunakan tetapi tidak dihapus dari swap. Kernel melakukan ini untuk menghemat waktu dalam periode sibuk berikutnya - jika data sudah disalin di sana hanya dapat melepaskan RAM yang digunakan daripada harus melakukan menulis disk terlebih dahulu. Jadi kecuali Anda tahu mesin tidak akan perlu bertukar lagi dalam waktu dekat, memaksa pembebasan ruang swap mungkin tidak menghasilkan apa-apa kecuali memperlambatnya sedikit lebih banyak saat bertukar diperlukan.

Ini dikelola berdasarkan delete-on-write, jadi jika salinan dalam RAM diperbarui blok dalam swap akan dirilis.

Jika ruang swap diperlukan untuk sesuatu yang lain, yang tidak akan tersedia saat ini karena Anda punya banyak yang gratis, tentu saja akan dirilis untuk penggunaan itu.

Anda tidak dapat melihat berapa banyak data dalam kondisi ini (berada di halaman berbasis disk di area swap, dan dalam RAM) di output dari free. Anda dapat melihatnya melalui /procsistem file khusus. Lihatlah output cat /proc/meminfountuk SwapCachedhitungan.

Dua alasan lain mengapa swap digunakan saat ada memori cadangan

  • ketika di bawah beban I / O yang berat, kernel telah memutuskan bahwa halaman yang belum pernah digunakan untuk usia lebih baik diganti sehingga dapat menggunakan RAM untuk cache / buffer, meskipun melihat freeoutput Anda yang mungkin tidak terjadi di sini karena Anda memiliki sepotong RAM yang benar-benar tidak terisi serta yang digunakan oleh IO cache / buffer.
  • halaman-halaman tersebut diganti karena beberapa alasan sebelumnya, dan sejak itu tidak diperlukan lagi - mungkin ini adalah memori yang digunakan oleh suatu proses yang telah tidak aktif selama beberapa waktu. Dalam hal ini melepaskan swap (sehingga memuat kembali halaman ke dalam RAM) dapat meningkatkan waktu respons dari proses itu di lain waktu diperlukan untuk melakukan sesuatu selain tidur, tetapi jika sudah tidak aktif selama beberapa waktu sudah mungkin tidak diperlukan bagaimanapun juga dalam waktu dekat.
David Spillett
sumber
1
+1 untuk penjelasan yang bagus. FYI, vmstat memungkinkan Anda melihat / proc / meminfo data melalui tidak semuanya.
1

Ingat itu freehanyalah snapshot dari penggunaan memori. Hasil yang Anda lihat mungkin menyiratkan bahwa, di beberapa titik di masa lalu, sistem kekurangan RAM sehingga menukar bahan RAM-resident. Sejak itu, RAM telah menjadi bebas tetapi materi tentang swap belum diperlukan sehingga masih diadakan pada swap daripada hanya mengacaukan RAM. Jika itu masalahnya, mematikan swap akan menjadi ide yang buruk. Apakah ada proses yang dapat menuntut jumlah RAM yang begitu besar sejak pemuatan terakhir?

Selain itu, Anda mungkin ingin memeriksa bahwa Anda tidak memiliki batasan pada ukuran penduduk maksimum yang ditetapkan melalui ulimit (biasanya di / etc / profile tetapi mungkin bervariasi dengan distribusi dan dapat disetel per proses (misalnya dalam skrip peluncuran) ).

Terakhir, pada Microsoft Windows ada laporan masalah khusus dengan Firefox yang ditukar ke disk, misalnya saat diperkecil (mis http://joeabiraad.com/mozilla-firefox/control-your-firefox-ram-usage/113 ). Saya belum pernah mendengar tentang itu pada sistem GNU / Linux tetapi mungkin perlu ditelusuri.

mas
sumber
Terima kasih atas jawabannya. Masalah saya bukanlah swap yang digunakan, tetapi swap sekarang digunakan untuk program aktif, misalnya Firefox dan Thunderbird, yang terasa lamban. Pertukaran / pertukaran membuat mereka merasa tajam lagi.
Robert Munteanu