mengapa beberapa ruang swap saya digunakan, ketika saya masih memiliki RAM yang tidak digunakan?

9

Lebih dari rasa ingin tahu daripada masalah; dan, saya akui, pertanyaan mendasar yang memalukan:

Saya perhatikan bahwa pada banyak kesempatan, pada mesin Linux saya, saya akan memiliki ~ 500MB ruang swap yang digunakan, walaupun saya memiliki ~ 600MB RAM yang tidak terpakai.

Pemahaman tingkat tinggi saya yang naif adalah, ruang swap tidak masuk sampai RAM habis.

Saya melangkah lebih jauh dan membuat asumsi bahwa situasi ini harus dilakukan oleh kernel Linux, karena proses pengguna yang meminta memori, melakukannya hanya secara logis, dan tidak memiliki gagasan apakah memori itu secara fisik didukung oleh RAM atau ruang swap.

Yang mengarah ke pertanyaan, mengapa kernel lebih dulu menggunakan ruang swap? Apakah ini bagian dari beberapa algoritma penyesuaian kinerja? Apakah itu berpindah ke bagian disk memori yang dianggap paling tidak mungkin diakses (skema LRU, mungkin)? Jika demikian, bukankah masuk akal untuk meninggalkan semuanya dalam RAM, dan hanya ketika mendekati kelelahan, maka dan hanya kemudian menukar bagian LRU dari RAM ke ruang swap?

Saya harus mengklarifikasi, server linux saya memiliki 2GB RAM dan 2GB ruang swap.

pengguna35997
sumber
1
mengapa 4 orang untuk menutup pertanyaan ini?
2
@ Harun: Bukannya Anda memiliki pertanyaan buruk. Anda baru saja mengutarakannya dalam hal manajemen sistem sehingga lebih cocok dengan pengguna daya atau administrator server. Bahwa Anda bertanya-tanya tentang hal itu sebagai keingintahuan sepertinya lebih seperti POV pengguna daya.

Jawaban:

11

The terpakai bagian dari RAM sebenarnya digunakan sebagai cache HDD. Jika dipikir-pikir, Anda sebenarnya membaca bagian-bagian disk Anda lebih sering sehingga Anda mengakses beberapa bagian RAM. Yang masuk akal untuk meletakkan RAM ini di disk, saat menggunakan RAM untuk men-cache data HDD.

Didier Trosset
sumber
7

Masuk akal untuk menukar hal-hal di muka karena ketika Anda benar-benar membutuhkan memori, Anda tidak perlu menunggu sampai kernel selesai dengan akses disk.

Misalnya, katakanlah Anda ingin membuka gambar besar. Saat gambar dimuat, dibutuhkan 300MB RAM. Jika kernel menggunakan semua RAM yang ada, memuat gambar Anda mengharuskan kernel mentransfer 200MB dari RAM ke disk. Jika RAM dikosongkan secara proaktif sebelumnya, Anda menghemat beberapa milidetik.

Xr.
sumber
7

2 alasan:

  1. (@dtrosset) Linux akan menukar bit program yang tidak digunakan untuk memberikan lebih banyak cache dan buffer.
  2. Anda mungkin telah menggunakan lebih banyak memori di masa lalu, dan menukar beberapa hal, dan belum ditukar karena belum digunakan, meskipun apa pun yang memaksanya keluar kini telah hilang.
Douglas Leeder
sumber
1

Selain jawaban lain, Anda dapat mengonfigurasi Linux untuk meminta dukungan untuk memori yang dialokasikan, bahkan jika program tidak menggunakannya.

Memori yang berlebihan dan takut pembunuh OOM bukan bagian penting dari pengalaman Linux. Cukup dengan mengatur parameter sysctl vm / overcommit_memory ke 2 mematikan perilaku overcommit dan menjaga pembunuh OOM selamanya. Sebagian besar sistem modern harus memiliki ruang disk yang cukup untuk menyediakan file swap yang cukup untuk sebagian besar situasi. Daripada mencoba menjaga proses hewan peliharaan agar tidak terbunuh ketika memori yang terlalu banyak terjadi, mungkin lebih mudah untuk menghindari situasi sama sekali. [ Tangguh dari pembunuh OOM ]

Jika suatu program mengalokasikan memori, kernel dapat dengan mudah menandai lebih banyak halaman swap sebagai komitmen. Indikasi ini disimpan di manajer memori kernel, ruang disk sebenarnya belum tersentuh. Sampai memori itu digunakan, tidak ada yang benar-benar harus ditukar masuk dan keluar. Jika mereka tidak pernah digunakan, maka swap penggunaan akan berfluktuasi tanpa mempengaruhi kinerja.

Karena proses disajikan dengan ruang alamat mereka sendiri atau "view" (beginilah swap bekerja di tempat pertama), kernel memiliki banyak kelonggaran dalam bagaimana mengaturnya. Menggunakan contoh fork juga dari artikel yang ditautkan di atas, karena jauh lebih mungkin untuk berbagi halaman memori daripada untuk mengalokasikan sejumlah besar memori yang tidak digunakan, memori dapat dialokasikan copy-on-write, meningkatkan jumlah penggunaan swap. Ketika sebenarnya ditulis untuk (yang mungkin tidak terjadi), maka "swap berkomitmen" dapat diganti dengan RAM yang tidak digunakan (kemudian meningkatkan penggunaan RAM dan mengurangi penggunaan swap). Bayangkan sebuah proses dengan alokasi 500MB yang garpu pada mesin dengan semua atau hampir semua RAM yang digunakan. Jika ada 500MB tersedia dalam swap (dan ruang disk murah, seberapa besar 1% dari drive TB saat ini?: P), tidak ada memori yang harus disalin (belum,

Dengan demikian kemungkinan pembunuh OOM dihindari, dan jauh lebih mudah untuk merancang sebagian besar perangkat lunak dengan asumsi bahwa alokasi memori (termasuk alokasi "implisit" melalui sesuatu seperti garpu) baik berhasil atau gagal segera, dengan realisasi praktis bahwa jika memori harus ditukar maka itu mungkin mempengaruhi kinerja. Dampak itu hampir selalu kecil, tetapi dalam kasus terburuk menyebabkan swap meronta-ronta (kadang-kadang masih lebih disukai daripada crash kernel langsung atau pembunuh OOM).

Meskipun saya tidak tahu detail pasti tentang cara kerja manajer memori Linux, jawaban ini adalah pemahaman umum saya sendiri dan apa yang saya ingat baca selama bertahun-tahun. Saya telah mencoba mengedit kembali jawaban ini sehingga diperlukan pemahaman minimal tentang desain OS (ini sangat kompleks dan bukan sesuatu yang saya sangat tertarik pada diri saya sendiri), tetapi tampaknya sedikit mengoceh; tolong beri tahu saya jika Anda melihat cara meningkatkannya. Di sisi lain, itu mungkin bukan pertanyaan mendasar yang memalukan.

Roger Pate
sumber