Bagaimana FreeBSD mengalokasikan memori?

9

Saya sadar bahwa ini disederhanakan / penjelasan umum, tapi top(1)memori membagi utilitas di FreeBSD menjadi enam renang- Active, Inactive, Wired, Cache, Buffersdan Free. Contoh dari top(1)output:

Mem: 130M Active, 42M Inact, 51M Wired, 14M Cache, 34M Buf, 648K Free
Swap: 512M Total, 512M Free

Activedigunakan dengan menjalankan proses dan Wireddigunakan terutama untuk kernel. Inactiveadalah memori dari proses tertutup yang masih di-cache jika perlu digunakan kembali, Cachedata di-cache, Buffersadalah buffer disk (saya kira itu mirip dengan cacheddi free(1)output Linux (?)) dan Freebenar-benar memori yang tidak digunakan. Apakah saya benar bahwa kernel FreeBSD secara otomatis mengalokasikan ruang dari Inactive, Cachedan Buffersmenggabungkan ke Activeatau Wiredjika diperlukan?

Martin
sumber

Jawaban:

13

Untuk membuatnya pendek, aktif dan kabel digunakan memori yang tidak boleh atau tidak dapat ditukar untuk membebaskan memori. Meskipun tidak aktif dapat ditukar dengan benar, tetapi masih dimiliki (tidak dibebaskan) oleh suatu proses atau kernel, jadi ini bukan memori yang banyak digunakan, tetapi masih digunakan.

Baru adalah cucian yang merupakan daftar halaman memori kotor, yang mungkin perlu ditulis ke perangkat swap. Baik jika memori kotor perlu ditukar atau tidak, mereka ditambahkan kembali ke antrian tidak aktif.

Memori berkabel tidak seharusnya ditukar, untuk keamanan (dalam kasus kernel) atau untuk optimasi proses userland (seperti ZFS). Memori berkabel digunakan untuk cache sistem file, yang mungkin dibebaskan oleh kernel. Paling tidak untuk ZFS ini dapat dilihat sebagai sebagian besar memori bebas.

Gratis memori pasti gratis.

Tembolok (sekarang sudah usang, saya kira) siap untuk dibebaskan, karena sudah ditukar dan hanya ada untuk kemungkinan realokasi.

Buffer digunakan sebagai cache oleh sebagian besar sistem file (UFS, FAT, ...) dan merupakan jumlah memori yang digunakan oleh sistem file. Itu bisa actice, tidak aktif atau kabel.

ARC (Adaptive Replacement Cache) adalah cache yang digunakan oleh ZFS dan itu adalah memori yang dapat dibebaskan saat dibutuhkan.

Dari Wiki FreeBSD pada Memori

Kelas Memori

Aktif

  • Berisi halaman "aktif" (baru-baru ini) yang direferensikan oleh userland
  • Berisi campuran halaman bersih dan kotor
  • Halaman dipindai secara teratur oleh daemon halaman (setiap halaman dikunjungi setiap vm.pageout_update_ period detik)
  • Pemindaian memeriksa untuk melihat apakah halaman telah dirujuk sejak pemindaian terakhir
  • Jika cukup pemindaian selesai tanpa melihat referensi, halaman dipindahkan ke antrian tidak aktif
  • Menerapkan pseudo-LRU

Non-aktif

  • Berisi halaman yang keluar dari antrian aktif
  • Berisi halaman yang diusir dari cache buffer
  • Berisi campuran halaman bersih dan kotor
  • Halaman dipindai oleh daemon halaman (mulai dari kepala antrian) ketika ada kekurangan memori:
    • Halaman yang telah direferensikan dipindahkan kembali ke antrian aktif atau ujung antrian tidak aktif
    • Halaman yang kotor dipindahkan ke ujung antrian cucian
    • Halaman yang tidak direferensikan dan bersih dapat dibebaskan dan digunakan kembali dengan segera
  • Menerapkan LRU kesempatan kedua

Cucian

  • Antrian untuk mengelola halaman tidak aktif yang kotor, yang harus dibersihkan ("dicuci") sebelum dapat digunakan kembali
  • Dikelola oleh utas terpisah, utas pencucian, alih-alih halaman daemon
  • Binatu utas cuci sedikit halaman untuk menyeimbangkan antrian tidak aktif dan binatu
  • Frekuensi pencucian tergantung pada:
    • Berapa banyak halaman bersih yang dibebaskan daemon halaman; lebih banyak membebaskan berkontribusi pada frekuensi pencucian yang lebih tinggi
    • Ukuran antrian cucian relatif terhadap antrian tidak aktif; jika antrean binatu bertambah, kita akan mencuci lebih sering
  • Halaman dipindai oleh utas cucian (mulai dari ujung antrian):
    • Halaman yang telah direferensikan dipindahkan kembali ke antrian aktif atau ekor antrian binatu
    • Halaman kotor dicuci dan kemudian dipindahkan dekat ke kepala antrian tidak aktif

Gratis

  • Memori tersedia untuk digunakan oleh seluruh sistem.

Wired

  • Memori tidak dapat dipindah-pindah: tidak dapat dibebaskan sampai dirilis secara eksplisit oleh pemiliknya
  • Memori Userland dapat ditransfer dengan mlock (2) (tergantung pada sistem dan batas per-pengguna)
  • Pengalokasi memori kernel mengembalikan memori kabel
  • Isi ARC dan cache buffer ditransfer
  • Sebagian memori ditransfer secara permanen dan tidak pernah dibebaskan (mis. File kernel itu sendiri)

Dari Desain dan implementasi sistem operasi FreeBSD bab 6.12 Halaman Penggantian (Tidak sepenuhnya akurat lagi, tapi di sini untuk referensi dari pertanyaan lama):

Kernel membagi memori utama menjadi lima daftar:

  1. Berkabel : Halaman berkabel terkunci dalam memori dan tidak dapat dihubungi. Biasanya halaman-halaman ini digunakan oleh kernel atau pager fisik-memori, atau mereka telah dikunci dengan mlock . Selain itu, semua halaman yang digunakan untuk menyimpan tumpukan thread dari proses yang dimuat (yaitu tidak diganti) juga ditransfer.
  2. Aktif : Halaman aktif sedang digunakan oleh satu atau lebih wilayah memori virtual. Walaupun kernel dapat mengeluarkannya, hal tersebut kemungkinan akan menyebabkan proses aktif kembali.
  3. Tidak aktif : Halaman tidak aktif mungkin kotor dan memiliki konten yang masih diketahui, tetapi mereka biasanya bukan bagian dari wilayah aktif mana pun. Jika konten halaman kotor, konten harus ditulis ke backing store sebelum halaman tersebut dapat digunakan kembali. Setelah halaman dibersihkan, halaman dipindahkan ke daftar cache. Jika sistem menjadi kekurangan memori, daemon pageout dapat mencoba untuk memindahkan halaman aktif ke daftar tidak aktif dengan harapan menemukan halaman yang tidak benar-benar digunakan. Kriteria pemilihan yang digunakan oleh daemon pageout untuk memilih halaman yang akan dipindahkan dari daftar aktif ke daftar tidak aktif dijelaskan nanti di bagian ini. Ketika memori bebas dan daftar cache turun ke rendah, daemon pageout melintasi daftar tidak aktif untuk membuat lebih banyak cache dan membebaskan halaman.
  4. Cache : Halaman-halaman cache memiliki konten yang masih diketahui, tetapi mereka bukan bagian dari pemetaan. Jika mereka salah ke wilayah aktif, mereka bukan bagian dari pemetaan apa pun. Jika mereka rusak di wilayah aktif, mereka akan dipindahkan dari daftar cache ke daftar aktif. Jika mereka digunakan untuk membaca atau menulis, mereka akan dipindahkan dari daftar cache pertama ke cache buffer dan akhirnya dirilis ke daftar tidak aktif. Sebuah mlock panggilan sistem dapat merebut kembali halaman dari daftar cache dan kawat itu. Halaman pada daftar cache mirip dengan halaman tidak aktif kecuali bahwa mereka tidak kotor, baik karena mereka tidak dimodifikasi sejak mereka di-paging di atau karena mereka telah ditulis ke toko dukungan mereka. Mereka dapat diklaim untuk penggunaan baru saat halaman dibutuhkan.
  5. Gratis : Halaman gratis tidak memiliki konten yang berguna dan akan digunakan untuk memenuhi permintaan pagefault baru.

Untuk menjawab pertanyaan awal Anda

Apakah saya benar bahwa kernel FreeBSD secara otomatis mengalokasikan ruang dari kumpulan Nonaktif, Cache dan Buffer ke Aktif atau Kabel jika diperlukan?

Halaman aktif dapat menjadi tidak aktif jika tidak digunakan selama beberapa waktu. Jika kernel menukar halaman yang tidak aktif, halaman ini dipindahkan ke daftar cache . Halaman dalam daftar cache bukan bagian dari pemetaan virtual dari proses apa pun tetapi dapat dengan mudah direklamasi, sebagai aktif atau kabel . Atau ketika dibutuhkan untuk I / O sebagai cache buffer .

Memori berkabel tidak dapat ditukar keluar dari memori utama. Jika ditransfer melalui suatu proses, maka perlu disambungkan dengan munlockpanggilan untuk menjadi memori aktif lagi.

Aktif , tidak aktif dan kabel memori dapat dibebaskan oleh proses atau kernel dan ditambahkan ke bebas daftar.

Raphael Ahrens
sumber
Saya hanya melihat kesalahan dalam pertanyaan awal saya. Aku bertanya "Apakah aku benar bahwa FreeBSD kernel secara otomatis mengalokasikan ruang dari Inactive, Wired, Cachedan Bufferskolam untuk Activeatau Wiredjika diperlukan?" sementara saya bermaksud bertanya "Apakah saya benar bahwa kernel FreeBSD secara otomatis mengalokasikan ruang dari Inactive, Cachedan Buffersmenggabungkan ke Activeatau Wiredjika diperlukan?". Saya memperbarui pertanyaan awal saya. Jadi singkatnya, memori yang digunakan dalam FreeBSD adalah Wired+ Activedan jika mereka dua kolam renang perlu jumlah tambahan memori maka ini diambil dari Inacative, Cached, Buffersatau Freekolam renang?
Martin
@ Martin ya itu kedengarannya benar. Saya memperbarui jawaban saya untuk pertanyaan Anda.
Raphael Ahrens