Sistem belleğinde… özellikle `tmpfs,` `shm '' ve` `büyük sayfalar '' arasındaki fark ...


16

Son zamanlarda çeşitli Linux çekirdek bellek tabanlı dosya sistemlerini merak ettim.

Note:Bence, aşağıdaki sorular, başlıkta ortaya konanların daha iyi anlaşılmasıyla karşılaştırıldığında, az çok isteğe bağlı olarak düşünülmelidir. Onlara aşağıda soruyorum çünkü onlara cevap vermenin farklılıkları anlamamda daha iyi yardımcı olabileceğine inanıyorum, ancak anlayışım itirafla sınırlı olduğu için, başkalarının daha iyi bileceği anlaşılıyor. Başlıkta belirtilen üç dosya sistemi arasındaki farkları anlamamı zenginleştiren her yanıtı kabul etmeye hazırım.

Sonuç olarak, hugepages,bazı hafif araştırmalar (ve daha hafif tinkering) ile a'nın rewritable hugepage mountbir seçenek olmadığına inanmamı sağlasa da kullanılabilir bir dosya sistemi kurmak istiyorum . Yanlış mıyım? Burada oyun mekaniği nedir?

Ayrıca 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

(İşte / proc / meminfo ve / proc / cpuinfo'nun tam metin sürümleri )

Yukarıda neler oluyor? Zaten ayırıyor muyum Bellek sayfaları hugepages?arasında bir fark var mı DirectMapvehugepages?

Güncelleme @Gilles'den bir dürtmeden sonra, 4 satır daha ekledim ve bir fark olmalı DirectMap, taildün çekmeden önce hiç duymamıştım ... belki DMIfalan?

Sadece biraz daha ...

hugepagesÇaba ile başarısız olursa ve herhangi bir görüntü dosyasının sabit disk yedeklemelerini varsayarsak, tmpfs?dosya sistemim swappeden kötü senaryo mu? tmpfsBağlı dosya sistemi önbelleği olduğunu anlıyorum - bağlı loop dosyamın belleği yetersiz olabilir mi? Bundan kaçınmak için yapabileceğim hafifletici önlemler var mı?

Son olarak - tam olarak nedir shm,? Nasıl farklı ya içermez ya hugepagesyatmpfs?


1
İçinde önceki satırlar ne /proc/meminfoolacak HugePage(ya da çekirdek sürümünüzde bu yok mu?) Bu hangi mimaride (sanırım x86_64)?
Gilles 'SO- kötü olmayı bırak'

Onları ekleyeceğim. Çok uzun olduğu için endişeliydim.
Mart'ta mikeserv

@Gilles - Yukarıdaki düz metne bağlandım. Umarım sorun olmaz. Sorduğunuz için teşekkürler - İlk etapta eklemeliydim - Bunu nasıl özlediğimi bilmiyorum.
14'te

Yanıtlar:


13

Tmpfs ve shm arasında fark yoktur. tmpfs shm'in yeni adıdır. shm, SHaredMemory anlamına gelir.

Bakınız: Linux tmpfs .

Tmpfs'nin bugün bile kullanılmasının ana nedeni, gentoo kutumdaki / etc / fstab dosyamdaki bu yorumun olmasıdır. BTW Chromium, hat eksikken oluşmayacak:

# 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 

çıktı hangi linux çekirdek belgelerinde

Alıntı yapmak:

tmpfs aşağıdaki kullanımlara sahiptir:

1) Her zaman hiç görmeyeceğiniz bir çekirdek iç yuvası vardır
. Paylaşılan anonim eşlemeler ve SYSV paylaşılan
hafızası için kullanılır.

Bu bağlama CONFIG_TMPFS'ye bağlı değildir. CONFIG_TMPFS ayarlanmamışsa, tmpfs'nin kullanıcı tarafından görülebilir kısmı oluşturulmaz. Ancak iç
mekanizmalar daima mevcuttur.

2) glibc 2.2 ve üstü
, tmpfs'nin POSIX paylaşılan hafızası (shm_open, shm_unlink) için / dev / shm üzerine monte edilmesini bekler .
/ Etc / fstab dosyasına aşağıdaki satırı eklemek bununla ilgilenmelidir:

tmpfs / dev / shm tmpfs varsayılanları 0 0

Gerekirse, tmpfs'yi yerleştirmek istediğiniz dizini oluşturmayı unutmayın.

Bu bağlanma, SYSV paylaşılan belleği için gerekli değildir . Dahili
montaj bunun için kullanılır. (2.3 çekirdek sürümlerinde,
SYSV
paylaşılan belleğini kullanmak için seleflerin (shm fs) selefinin monte edilmesi gerekiyordu )

3) Bazı insanlar (ben dahil)
örneğin / tmp ve / var / tmp üzerine monte etmeyi ve büyük bir takas bölümüne sahip olmayı çok uygun bulurlar . Ve şimdi
tmpfs dosyalarının döngü bağları işe yarıyor, bu yüzden çoğu
dağıtım tarafından gönderilen mkinitrd bir tmpfs / tmp ile başarılı olmalıdır.

4) Ve muhtemelen çok daha fazla bilmiyorum :-)

tmpfs boyutlandırma için üç montaj seçeneğine sahiptir:

size: Bu tmpfs örneği için ayrılan bayt sınırı. Varsayılan, takas olmadan fiziksel RAM'inizin yarısıdır. Tmpfs örneklerinizin büyüklüğünü ayarlarsanız, OOM işleyicisi bu belleği boşaltamayacağından makine kilitlenecektir.
nr_blocks: Boyutla aynı, ancak PAGE_CACHE_SIZE bloklarında.
nr_inodes: Bu örnek için maksimum düğüm sayısı. Varsayılan, fiziksel RAM sayfalarınızın sayısının yarısı veya (highmem olan bir makinede) lowmem RAM sayfalarının sayısıdır (hangisi daha düşükse).

Şeffaf Büyük Sayfa Çekirdeği Dokümanından:

Şeffaf Hugepage Desteği, kullanılmayan tüm belleğin önbellek veya diğer taşınabilir (veya taşınamaz varlıklar) olarak kullanılmasına izin vererek hugetlbfs'nin rezervasyon yaklaşımıyla karşılaştırıldığında boş belleğin kullanışlılığını en üst düzeye çıkarır. Devasa sayfa ayırma hatalarının kullanıcı alanından fark edilmesini önlemek için rezervasyon gerektirmez. Disk belleği ve diğer tüm gelişmiş VM özelliklerinin büyük sayfalarda kullanılabilmesini sağlar. Uygulamalardan yararlanmak için herhangi bir değişiklik gerektirmez.

Bununla birlikte, uygulamalar bu özellikten yararlanmak için daha da optimize edilebilir, örneğin her malloc (4k) için bir mmap sistemi çağrısından kaçınmak için daha önce optimize edilmişlerdir. Kullanıcı arazisini optimize etmek kesinlikle zorunlu değildir ve khugepaged zaten büyük miktarda bellekle uğraşan büyük sayfalardan habersiz uygulamalar için bile uzun ömürlü sayfa ayırmalarla ilgilenebilir.


Bazı hesaplamalar yaptıktan sonra Yeni Yorum:

HugePage Boyutu: 2MB
Kullanılan HugePages: Yok / Kapalı, tüm 0'lar tarafından kanıtlandığı gibi, ancak yukarıdaki 2Mb'ye göre etkinleştirildi.
DirectMap4k: 8.03Gb
DirectMap2M: 16.5Gb
DirectMap1G: 2Gb

THS'deki Optimizasyon ile ilgili yukarıdaki Paragrafı kullanarak, hafızanızın 8Gb'sinin 2K'lık mallokları kullanan uygulamalar tarafından 4k, 16.5Gb'lik malloklar kullanılarak çalışan uygulamalar tarafından istendiği anlaşılıyor. 2M mallokları kullanan uygulamalar, 2M bölümlerini çekirdeğe yükleyerek HugePage Desteğini taklit eder. Bu, tercih edilen yöntemdir, çünkü malloc çekirdek tarafından serbest bırakıldıktan sonra, bellek sisteme bırakılırken, dev sayfa kullanarak tmpf'lerin montajı, sistem yeniden başlatılıncaya kadar tam temizliğe neden olmaz. Son olarak, kolay olan, 1Gb'lik bir malloc isteyen 2 programınız açık / çalışıyor

Malloc bilmeyen okuduğunuzlar için C'de Memory ALLOCation anlamına gelen Standard bir Yapıdır. Bu hesaplamalar OP'nin DirectMapping ve THS arasındaki korelasyonunun doğru olabileceğinin kanıtıdır. Ayrıca, SADECE bir HUGEPAGE fs takmanın yalnızca 2MB'lık Artımlarla bir kazanım elde edeceğini unutmayın, oysa sistemin THS kullanarak belleği yönetmesine izin vermek çoğunlukla 4k bloklarda gerçekleşir, yani bellek yönetimi açısından her malloc çağrısı sistemi 2044k (2048 - 4) kurtarır. ) kullanmanız gerekir.


2
Bu gerçekten iyi - THS benim DirectMap'ım mı?
mikeserv

DirectMapping'i googled ve tmpfs vb. Bahsettim. 2.6 şubesindeki tüm çekirdekler THS'yi destekler. Bir yığın tho olarak, yukarıdaki yeni yorumuma bakın.
eyoung100

Evet ben de çok az geldim. HP, THP ile ilgili bazı okumalar yaptım. Yorumunuz beni oldukça şaşırttı. Bu gerçekten şekilleniyor, adamım. Bu son bölüm - yalnızca HP - bunu , büyük bir sayfa bağının üzerine bir okuma / yazma dosya sistemi bağlayabileceğim anlamına gelecek şekilde mi yorumlamalıyım? Örneğin, büyük bir sayfa bağından döngüye monte edilmiş bir görüntü dosyası mı? Yazılabilir?
mikeserv

Evet ve düzgün bir şekilde monte edildiğinde yazılabilir, ancak unutmayın: 1. Monte ettiğinizden, temizlikten siz sorumlusunuz 2. Atıktır: Örneğinizi kullanarak, döngünüzün yalnızca bir metin dosyası içerdiğini varsayalım Karakterler: Merhaba, benim adım Mike. Her karakterin 1k olduğunu varsayarsak, bu dosya 23k olarak kaydedilir. Hugepage size 2 MB verdiğinden 2025 bin harcadınız. Bu savurgan davranış, bellek yönetiminin çekirdeğe yerleştirilmesinin nedenidir. Aynı zamanda kernel32 gibi bir sarıcı
DLL'e

ve son olarak 3. Yeniden başlatma veya çökme sırasında bağlantınızı kaybedersiniz.
eyoung100

4

"DirectMap" sorununu gidermek için: çekirdek, her kullanıcı işlemine ayrılan sanal eşlemelerden ayrı olarak fiziksel belleğin doğrusal ("doğrudan") eşlenmesine sahiptir .

Çekirdek, bu eşleme için TLB basıncını düşürmek amacıyla mümkün olan en büyük sayfaları kullanır.

CPU'nuz 1 Gb sayfaları destekliyorsa (Barselona'dan sonra bazı sanal ortamlar bunları devre dışı bırakırsa) ve çekirdekte etkinleştirilirse DirectMap1G görünür - varsayılan değer 2.6.29+ için açıktır.


3

Orada arasında hiçbir fark shmve tmpfs(aslında tmpfseski yalnızca yeni adıdır shmfs). hugetlbfs, tmpfsalanını büyük çekirdek sayfalarından ayıran ve bazı ek yapılandırmalara ihtiyaç duyan (bunun nasıl kullanılacağı Documentation / vm / hugetlbpage.txt içinde açıklanmaktadır) tabanlı bir dosya sistemidir .


Bu iyi bir denemeydi ve elbette bu belgeleri okumuştum. Ya da belki değil tabii - ama ben bir 100rep lütuf bu söndürmek için gidiyorum düşünüyorum, ama önce bu genişletmek eğer, ben onu sana sunacak. Şimdiye kadar anlayışımı zenginleştirmediniz - bunların çoğunu zaten biliyordum, ancak ikisi sadece eşanlamlıydı. Her halükarda, bunu yarın sabah daha iyi bir cevap yapabilirseniz, 100rep ödülü sizindir. Benim için özellikle ilginç olan DirectMap, procfs mansayfada hiç bahsetmiyorum . Nasıl olur?
mikeserv

1
@Mikeserv - DirectMaps'in hangi fonksiyondan hesaplandığını gösteren bu farkı buldum: lkml.org/lkml/2008/11/6/163
slm
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.