Kapan swap dipindahkan kembali ke memori fisik?

8

Kapan swap dipindahkan kembali ke memori fisik di Linux? Apakah hanya sesuai permintaan, yaitu. kapan dibutuhkan? Atau apakah swap perlahan ditransfer ke memori fisik ketika komputer tidak pada beban tinggi?

Ztyx
sumber

Jawaban:

7

Sesuai permintaan. Bahkan, Linux perlahan akan mentransfer memori fisik untuk swap saat idle (lihat: "swappiness").

Ignacio Vazquez-Abrams
sumber
Terima kasih. Jawaban singkat dan singkat. Saya suka itu (meskipun saya menghargai upaya semua orang yang dimasukkan ke dalam jawaban mereka)!
Ztyx
Jawaban ini salah. Pertanyaannya adalah kapan memori di-paging, bukan paged. Ini kebalikannya. Pada kesalahan halaman kernel akan memuat ulang halaman dari disk / swap. Jadi kebanyakan permintaan. Anda bisa mengakses semua memori virtual suatu proses untuk memicu kesalahan halaman. Akibatnya halaman akan disalin kembali ke RAM.
user228505
7

Selama operasi reguler, data dari swap dimuat ke memori sesuai permintaan, seperti dijawab orang lain, tetapi ada satu kasus lagi ketika ini terjadi: itu adalah ketika ruang swap dinonaktifkan, asalkan ada memori fisik yang cukup untuk memuat seluruh konten swap.

Kerjakan saja:

swapoff -a

... dan semua data swap Anda akan 'kembali' ke memori. Efek sampingnya adalah buffer disk / cache bisa memerah.

Kadang-kadang mungkin diinginkan untuk dilakukan swapoff -a ; swapon -a, misalnya setelah beberapa proses kehabisan memori buggy, sebelum crash, membuat proses yang lebih penting tersapu keluar - untuk memastikan setiap proses yang berjalan dalam sistem dimuat ke dalam memori dan tidak akan menunggu swap di beberapa menit.

Jacek Konieczny
sumber
Oh, kamu belajar sesuatu yang baik setiap hari! Ngomong-ngomong, akankah 'swapoff-a' gagal jika tidak ada cukup memori fisik? Apakah ada risiko terlibat dalam panggilan swapoff?
Ztyx
Ini akan gagal jika tidak ada memori fisik yang cukup. Itu masih merupakan risiko swapofftidak akan gagal, tetapi sistem akan kehabisan memori segera setelah swapoffdan OOM akan membunuh proses acak (dalam kasus terburuk shell akan memanggil swaponatau swaponperintah). Dalam praktiknya sangat tidak mungkin - banyak memori digunakan oleh cache sebelum swapoffdipanggil sehingga harus cukup RAM untuk kedua perintah untuk dijalankan.
Jacek Konieczny
7

Seperti yang telah ditunjukkan orang lain, halaman hanya akan disalin kembali ke dalam RAM bila diperlukan (sesuai permintaan) alih-alih mengambil RAM yang mungkin lebih baik tersedia untuk cache / buffer.

Fakta bahwa halaman disalin kembali ke RAM, tidak dipindahkan, adalah penting dan dapat menyebabkan kebingungan jika Anda tidak menyadarinya. Halaman tidak akan di-deallocated dari swap kecuali jika tidak diperlukan lagi sama sekali (yaitu halaman sepenuhnya di-deallocated), diubah dalam RAM (sehingga salinan dalam swap tidak lagi benar), atau swap semakin rendah (dan pada Blok-disk diperlukan untuk menukar beberapa halaman lain). Dengan cara ini jika halaman perlu ditukar lagi di masa depan tidak ada disk menulis diperlukan karena kernel tahu sudah ada salinan yang baik pada disk - ini dapat sangat mengurangi "meronta-ronta" ketika RAM yang tersedia menjadi sangat rendah tetapi ruang swap juga tidak padat.

Anda dapat melihat berapa banyak halaman saat ini dalam RAM dan swap dari cat /proc/meminfo- SwapCachedgaris adalah jumlah data yang ada di halaman yang saat ini baik dalam RAM dan pada disk. Jika menurut Anda swap Anda saat ini menggunakannya lebih tinggi dari yang Anda harapkan, periksa nilai SwapCached karena ini dapat menjelaskan perbedaan tersebut.

David Spillett
sumber
Ada diskusi seputar masalah serupa sebelumnya. Namun, bukan pertanyaan spesifik ini. Lihat juga serverfault.com/questions/100448/… yang berkaitan dengan SwapCached.
Ztyx
Saya bahkan tidak ingat menulis jawaban itu ... Saya mungkin mungkin hanya menautkan (atau menyalin + menempel) daripada mengetik di atas ...
David Spillett
0

Ini biasanya terikat pada perangkat keras yang Anda gunakan. Pada sebagian besar perangkat keras (termasuk intel), MMU mengontrol seluruh proses.

Ketika suatu program mengalokasikan memori, ia akan memintanya ke MMU dan mendapatkan kembali alamat virtual. Pada gilirannya, MMU akan mendaftarkan halaman itu sebagai "sedang digunakan" di peta ruang alamat global.

Ketika program benar-benar mengakses ruang memori itu, MMU akan mencari halaman ke dalam peta alamat. Jika halaman itu dalam memori "live", itu akan mengirim kembali "live" pointer ke OS yang akan menangani memori baca / tulis atas nama program. Jika memori saat ini tidak dialokasikan, maka itu akan memicu kesalahan halaman. Pengecualian prosesor ini kemudian ditangkap oleh OS yang kemudian bertanggung jawab untuk mencari tahu di mana data ada dalam file swap, memuatnya ke dalam memori fisik dan memberikan halaman kembali ke MMU sehingga proses awal dapat dilanjutkan.

Ini berarti bahwa, kecuali halaman memori diakses, itu tidak akan pernah kembali ke memori "langsung" setelah ditukar. Itulah sebabnya biasanya ada OS API yang memungkinkan program menentukan bahwa blok memori tertentu TIDAK untuk ditukar ke disk dan harus disimpan dalam memori (saya tidak tahu tentang Linux, tetapi di Windows, itu adalah fungsi VirtualLock) .

Stephane
sumber
mlock(2) linux.die.net/man/2/mlock
Ignacio Vazquez-Abrams