Pada memori sistem ... khususnya perbedaan antara `tmpfs,` `shm,` dan `hugepages ...`

16

Saya ingin tahu akhir-akhir ini tentang berbagai sistem file berbasis memori kernel Linux.

Note:Sejauh yang saya ketahui, pertanyaan-pertanyaan di bawah ini harus dianggap lebih atau kurang opsional jika dibandingkan dengan pemahaman yang lebih baik dari yang diajukan dalam judul. Saya bertanya kepada mereka di bawah ini karena saya yakin menjawabnya dapat lebih membantu saya untuk memahami perbedaan, tetapi karena pemahaman saya diakui terbatas, maka orang lain mungkin tahu lebih baik. Saya siap menerima jawaban apa pun yang memperkaya pemahaman saya tentang perbedaan antara ketiga sistem file yang disebutkan dalam judul.

Pada akhirnya saya pikir saya ingin me-mount sistem file yang dapat digunakan dengan hugepages,meskipun beberapa penelitian ringan (dan masih bermain-main lebih ringan) telah membuat saya percaya bahwa a rewritable hugepage mountbukanlah pilihan. Apakah saya salah? Apa mekanika yang berperan di sini?

Juga tentang hugepages:

     uname -a
3.13.3-1-MANJARO \
#1 SMP PREEMPT \
x86_64 GNU/Linux

    tail -n8 /proc/meminfo
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:     8223772 kB
DirectMap2M:    16924672 kB
DirectMap1G:     2097152 kB

(Berikut adalah versi teks lengkap dari / proc / meminfo dan / proc / cpuinfo )

Apa yang terjadi di atas? Apakah saya sudah mengalokasikan hugepages?Apakah ada perbedaan antara DirectMaphalaman memori danhugepages?

Perbarui Setelah sedikit dorongan dari @Gilles, saya telah menambahkan 4 baris lebih di atas dan tampaknya pasti ada perbedaan, meskipun saya belum pernah mendengar DirectMapsebelumnya menariknya tailkemarin ... mungkin DMIatau sesuatu?

Hanya sedikit lagi ...

Gagal dalam keberhasilan apa pun dengan hugepagesupaya ini, dan dengan asumsi cadangan harddisk dari semua file gambar, apa risiko memasang loop dari tmpfs?Apakah sistem file saya menjadi swappedskenario terburuk? Saya mengerti tmpfsapakah cache sistem file sudah terpasang - dapatkah loopfile yang dipasang saya ditekan keluar dari memori? Apakah ada tindakan meringankan yang dapat saya lakukan untuk menghindari hal ini?

Terakhir - tepatnya apa shm,itu? Bagaimana perbedaannya dari atau termasuk salah satu hugepagesatautmpfs?

mikeserv
sumber
1
Bagaimana dengan baris sebelumnya /proc/meminfoyang berisi HugePage(atau apakah versi kernel Anda tidak memilikinya)? Arsitektur apa ini (x86_64 saya kira)?
Gilles 'SO- stop being evil'
Saya akan menambahkan mereka. Aku hanya khawatir itu terlalu lama.
mikeserv
@Gilles - Saya telah menautkan ke teks biasa di atas. Saya harap tidak apa-apa. Terima kasih telah bertanya - saya seharusnya memasukkannya di tempat pertama - saya tidak tahu bagaimana saya melewatkan itu.
mikeserv

Jawaban:

13

Tidak ada perbedaan antara tmpfs dan shm. tmpfs adalah nama baru untuk shm. shm adalah singkatan dari SHaredMemory.

Lihat: Linux tmpfs .

Alasan utama tmpfs bahkan digunakan hari ini adalah komentar ini di / etc / fstab di kotak gentoo saya. Chromium BTW tidak akan dibangun jika saluran tidak ada:

# glibc 2.2 and above expects tmpfs to be mounted at /dev/shm for 
# POSIX shared memory (shm_open, shm_unlink). 
shm                     /dev/shm        tmpfs           nodev,nosuid,noexec     0 0 

yang keluar dari dokumentasi kernel linux

Mengutip:

tmpfs memiliki kegunaan berikut:

1) Selalu ada mount internal kernel yang tidak akan Anda lihat sama
sekali. Ini digunakan untuk pemetaan anonim bersama dan
memori bersama SYSV .

Mount ini tidak tergantung pada CONFIG_TMPFS. Jika CONFIG_TMPFS tidak disetel, bagian tmpfs yang terlihat pengguna tidak dibuat. Tetapi
mekanisme internal selalu ada.

2) glibc 2.2 dan di atas mengharapkan tmpfs untuk dipasang di / dev / shm untuk
memori bersama POSIX (shm_open, shm_unlink). Menambahkan
baris berikut ke / etc / fstab harus menangani ini:

tmpfs / dev / shm tmpfs default 0 0

Ingatlah untuk membuat direktori yang ingin Anda pasang tmpfs jika perlu.

Pemasangan ini tidak diperlukan untuk memori bersama SYSV.
Mount internal digunakan untuk itu. (Dalam versi kernel 2.3,
perlu untuk memasang pendahulu tmpfs (shm fs) untuk menggunakan
memori bersama SYSV )

3) Beberapa orang (termasuk saya) merasa sangat nyaman untuk memasangnya
misalnya pada / tmp dan / var / tmp dan memiliki partisi swap yang besar. Dan sekarang
loop mount file tmpfs berfungsi, jadi mkinitrd yang dikirimkan oleh sebagian besar
distribusi harus berhasil dengan tmpfs / tmp.

4) Dan mungkin lebih banyak yang saya tidak tahu tentang :-)

tmpfs memiliki tiga opsi pemasangan untuk ukuran:

size: Batas byte yang dialokasikan untuk instance tmpfs ini. Standarnya adalah setengah dari RAM fisik Anda tanpa swap. Jika Anda memperbesar instance tmpfs Anda, mesin akan menemui jalan buntu karena OOM handler tidak akan dapat membebaskan memori itu.
nr_blocks: Sama seperti ukuran, tetapi dalam blok PAGE_CACHE_SIZE.
nr_inodes: Jumlah maksimum inode untuk instance ini. Defaultnya adalah setengah dari jumlah halaman RAM fisik Anda, atau (pada mesin dengan highmem) jumlah halaman RAM lowmem, mana yang lebih rendah.

Dari Dokumen Transparan Hugepage Kernel:

Dukungan Transparan Hugepage memaksimalkan kegunaan memori bebas jika dibandingkan dengan pendekatan reservasi hugetlbfs dengan memungkinkan semua memori yang tidak digunakan untuk digunakan sebagai cache atau bergerak lainnya (atau bahkan entitas tidak bergerak). Itu tidak memerlukan reservasi untuk mencegah kegagalan alokasi hugepage agar terlihat dari userland. Ini memungkinkan paging dan semua fitur VM canggih lainnya tersedia di hugepages. Tidak memerlukan modifikasi untuk aplikasi untuk memanfaatkannya.

Namun aplikasi dapat lebih dioptimalkan untuk memanfaatkan fitur ini, seperti misalnya mereka telah dioptimalkan sebelumnya untuk menghindari banjir panggilan sistem mmap untuk setiap malloc (4k). Mengoptimalkan userland sejauh ini tidak wajib dan sudah ditentukan sebelumnya dapat menangani alokasi halaman berumur panjang bahkan untuk hugepage aplikasi yang tidak sadar yang berurusan dengan sejumlah besar memori.


Komentar Baru setelah melakukan beberapa perhitungan:

HugePage Ukuran: 2MB
HugePages Digunakan: Tidak Ada / Nonaktif, sebagaimana dibuktikan oleh semua 0's, tetapi diaktifkan sesuai 2Mb di atas.
DirectMap4k: 8.03Gb
DirectMap2M: 16.5Gb
DirectMap1G: 2Gb

Dengan menggunakan paragraf di atas tentang Pengoptimalan dalam THS, sepertinya 8Gb memori Anda sedang digunakan oleh aplikasi yang beroperasi menggunakan mallocs 4k, 16.5Gb, telah diminta oleh aplikasi yang menggunakan mallocs 2M. Aplikasi yang menggunakan mallocs dari 2M meniru Dukungan HugePage dengan melepas bagian 2M ke kernel. Ini adalah metode yang disukai, karena begitu malloc dilepaskan oleh kernel, memori dilepaskan ke sistem, sedangkan pemasangan tmpfs menggunakan hugepage tidak akan menghasilkan pembersihan penuh sampai sistem reboot. Terakhir, yang mudah, Anda memiliki 2 program terbuka / berjalan yang meminta malloc 1Gb

Bagi Anda yang membaca yang tidak tahu malloc adalah Struktur Standar dalam C yang merupakan singkatan dari Memory ALLOCation. Perhitungan ini berfungsi sebagai bukti bahwa korelasi OP antara DirectMapping dan THS mungkin benar. Juga perhatikan bahwa memasang HUGEPAGE ONLY fs hanya akan menghasilkan peningkatan 2MB, sedangkan membiarkan sistem mengelola memori menggunakan THS sebagian besar terjadi dalam blok 4k, yang berarti dalam hal manajemen memori setiap panggilan malloc menghemat sistem 2044k (2048 - 4 ) untuk beberapa proses lain untuk digunakan.

eyoung100
sumber
2
Ini sangat bagus - apakah THS DirectMap saya ?
mikeserv
Itu saya tidak bisa menjawab ketika saya googled DirectMapping dan menemukan tidak ada yang terkait dengan tmpfs dll. Satu-satunya hal yang saya dapat temukan adalah bagaimana mengkonfigurasi Dukungan HugeMem untuk Oracle Database yang berjalan pada citarasa Linux mereka, yang berarti mereka menggunakan HugePages alih-alih THS Saya merujuk. Semua kernel di cabang 2.6 mendukung THS. Sebagai dugaan, lihat komentar baru saya di atas.
eyoung100
Ya saya juga muncul sangat sedikit. Saya sudah membaca di HP, THP. Saya cukup tertarik dengan komentar Anda. Ini benar-benar berubah, man. Bagian terakhir ini - HP hanya - yang harus saya menafsirkan ini berarti bahwa saya dapat me-mount read / write filesystem di atas hugepage mount? Seperti, file gambar loop-mount dari hugepage mount? Dapat ditulis?
mikeserv
Ya, dan dapat ditulis ketika dipasang dengan benar, tetapi perlu diperhatikan: 1. Bahwa sejak Anda memasangnya, Anda bertanggung jawab atas pembersihan 2. Memboroskan: Menggunakan contoh Anda, katakanlah bahwa loop Anda hanya berisi file teks, dengan Karakter: Halo, nama saya Mike. Dengan asumsi setiap karakter adalah 1k, file itu akan disimpan sebagai 23k. Anda telah menyia-nyiakan 2025k karena Hugepage memberi Anda 2MB. Perilaku boros itulah sebabnya manajemen memori dibangun ke dalam kernel. Itu juga mencegah kita membutuhkan pembungkus DLL seperti kernel32
eyoung100
dan terakhir 3. Anda kehilangan mount saat reboot atau crash.
eyoung100
4

Untuk mengatasi masalah "DirectMap": kernel memiliki pemetaan linear ("direct") memori fisik , terpisah dari pemetaan virtual yang dialokasikan untuk setiap proses pengguna.

Kernel menggunakan halaman terbesar yang mungkin untuk pemetaan ini untuk mengurangi tekanan TLB.

DirectMap1G terlihat jika CPU Anda mendukung halaman 1Gb (Barcelona dan seterusnya; beberapa lingkungan virtual menonaktifkannya), dan jika diaktifkan di kernel - defaultnya adalah untuk 2.6.29+.

GreenReaper
sumber
3

Tidak ada perbedaan antara shmdan tmpfs(sebenarnya, tmpfshanya nama baru dari mantan shmfs). hugetlbfsadalah tmpfsfilesystem berbasis yang mengalokasikan ruangnya dari halaman kernel yang besar dan membutuhkan beberapa konfigurasi tambahan yang dapat dibeli (cara menggunakan ini dijelaskan dalam Dokumentasi / vm / hugetlbpage.txt ).

Andreas Wiese
sumber
Ini adalah percobaan yang bagus, dan saya sudah membaca dokumen itu, tentu saja. Atau mungkin tidak tentu saja - tapi saya pikir saya akan mengeluarkan ini untuk hadiah 100rb, tapi sebelum saya melakukannya, saya akan menawarkannya kepada Anda jika Anda dapat memperluas ini. Sejauh ini Anda belum memperkaya pemahaman saya - saya sudah tahu sebagian besar, kecuali bahwa keduanya hanyalah sinonim. Dalam hal apa pun, Jika Anda dapat membuat ini menjadi jawaban yang lebih baik besok pagi, hadiah 100rep adalah milik Anda. Yang sangat menarik bagi saya adalah saya tidak menemukan DirectMapsama sekali di procfs manhalaman. Bagaimana bisa?
mikeserv
1
@mikeserv - Saya menemukan diff ini yang menunjukkan fungsi apa DirectMaps dihitung dari: lkml.org/lkml/2008/11/6/163
slm