Linux'ta bir ram disk oluşturma


70

62GB RAM'e sahip bir makinem ve sadece 7GB'lık bir gövdem var, bu yüzden bir RAM diski oluşturup orada derleyeceğimi düşündüm. Ben bir Linux uzmanı değilim. RAM diskini oluşturmak için internette talimatlar buldum:

mkfs -q /dev/ram1 8192

ancak 16GB RAM disk tahsis etmek amacıyla 8192'den 16777216'ya değiştirdim.

Aşağıdaki hatayı aldım:

mkfs.ext2: Filesystem larger than apparent device size.
Proceed anyway? (y,n) 

Bu noktada korktum ve kurtarıldım.

sudo dmidecode --type 17 | grep Size

gösterileri

8x8192MB + 2048MB = 67584 MB

ama duüzerinde /devverir 804K.

Sorun bu mu Bu /devboyutun üstesinden gelebilir miyim ?


15
Tmpfs denedin mi? RAM'deki bir dosya sistemidir, ext2'ye gerek yoktur. mount -o size=16G -t tmpfs none /mnt/tmpfs
t-8ch

İşe yaradı! Teşekkürler! Ancak, şu ana kadar fazla hızlanmadı: İnşa etmek için kullandığım araçlar hala normal disk kullanıyor. RAM diskine daha fazla şey koyacağım.
Frank,

3
Araçları kendilerini ramdisk üzerine koymak, çekirdek onları ram içinde önbelleğe alacağı için fazla fark yaratmamalıdır.
t-8ch

1
@goldilocks Bu feci bir delil, ancak Java projelerimizi Maven ile derlerken, ramdisk kullanırken önemli bir hızlanma var . Sanırım bunun okuma zamanından çok zaman aramaktan daha fazlası olduğunu düşünüyorum.
SpellingD

1
/ dev / shm, aslında / / shm çalıştırmak , olabilir kullanılabilir; Neredeyse her zaman orada.
Camille Goudeseune

Yanıtlar:


78

Linux üzerinde bir ram diski oluşturmanın en iyi yolu tmpfs. Ram içinde yaşayan bir dosya sistemi, bu yüzden ext2'ye gerek yok. 16 GB boyutunda bir tmpfs oluşturabilirsin:

mount -o size=16G -t tmpfs none /mnt/tmpfs

2
benim sistemimde, hiçbir şey / mnt ile hiçbir şey yazmıyor, şöyle yazıyor: ls: erişemiyor / mnt / tmpfs: Böyle bir dosya veya dizin yok: mount point / mnt / tmpfs yok. Endişelenecek bir şey mi var? Eğer basitçe mkdir / mnt / tmpfs, bu amaçtan vazgeçerse (normal diskte tmpfs oluşturarak - lütfen alev yok, burada acemiyim).
Frank,

9
Hedef olarak bir mountpoint'e (dizin) ihtiyacınız vardır, bu yüzden bu dizini oluşturduktan sonra (herhangi bir dizini kullanabilirsiniz, mevcut içerikler gölgelidir) cevabından komutla ekleyebilirsiniz.
t-8ch

1
tmpfsmuhtemelen saf bir RAM diskinde istemediğiniz takas özelliğini kullanabilir.
palswim

2
@RomanSusi tmpfs dosya tipidir (-t sonrası geçer). "none", tmpfs için bulunmayan yedekleme aygıtıdır ("disk")
t-8ch 21

1
Boyut belirtmenin isteğe bağlı olduğunu belirtmekte fayda olabilir. Varsayılan olarak RAM'in yarısı kadardır. Daha yüksek bir boyut belirtmenin ek yükü yoktur, tek yaptığı, tüm RAM'inizi yanlışlıkla kullanmaktan ve sistemi öldürmekten korunmak için bir sınırdır.
sourcejedi

20

Linux RAM kullanımında çok verimlidir. Hızlanırsa çok az şey gördüğünüzde çok az sürpriz var tmpfs. Belleğe okunacak en büyük parçalar (ve böylece işlemi yavaşlatabilen) araçlar (derleyici, montajcı, bağlayıcı) ve uzunca bir makesürede başlangıçta belleğe yüklenecekler ve asla bırakmayacaklar. Geriye kalan, kaynak olarak okumaktır (sonuçların yazılması, hafızayı kısıtlamadıkça yavaşlatmaz). Yine, comon başlık dosyaları etrafta kalacaktır, sadece kullanıcının kaynağı okuma gerektirecektir. Ve bu birkaç megabayttan fazla olması pek mümkün değildir. Büyük bir ramdisk'in (veya hatta çok kullanmak oluşturma tmpfskısıtlı inşa bellek yaparak (çok iyi yavaştan) aşağı olabilir, üzerinde ramdisk üzerinde dosya veya tmpfs olamaz doğrudan oradan kullanılmalıdır).


1
Ne! Doğrudan oradan nasıl kullanılamazlar?
Kazark

RAM'dedirler, ancak doğrudan kullanılabilir bir biçimde değildirler.
vonbrand

2
Gerçekten mi! Nasıl yani? (Pardon yavaşlığım.)
Kazark

8
@Kazark, bellekteki yürütülebilir dosyaları işlemek için özel veri yapıları kullanılmaktadır. RAM diskleri ve tmpfsçalıştırılabilir dosyaları depolamak için yaygın bir şekilde kullanılmadıkları için (RAM diskleri, eski ve zorlu bir şekilde yavaş çalışan disketlerin eski günlerinden kalan bir şeydir, ve böyle, tmpfsgeçici geçici veriler içindir), hiç kimse gerekli çirkin saldırıları eklemenin yeterince önemli olduğunu düşünmemiştir.
vonbrand

7
Rails kodumu bir tmpfs (RAM) dosya sisteminden çalıştırmayı denedim ve hiçbir fark görmedim. Gerçekten gözle görülür bir fark olacağını umuyordum ama linux'un ne kadar harika olduğunu hayal kırıklığına uğrattım.
Hacı Minhajuddin

6

Sorun, bir ramdiskin en büyük boyutunun, daha özel olarak ramdisk sürücüsü aracılığıyla erişilebilen bellek boyutunun derleme zamanında yapılandırılmış olmasına rağmen, boottime'da yazılabilir fakat çekirdek belleğe yüklendikten sonra sabit kalmasıdır. Varsayılan değer muhtemelen Megabayt cinsinden ölçülür. Doğru hatırlıyorsam, sürücü yüklendiğinde bir ramdisk hafızasının hakkı saklıdır, tüm ramdisks aynı boyuttadır ve varsayılan olarak 16 ramdiski vardır. Öyleyse, 16G büyüklüğünde bir ramdisk boyutu bile istemezsiniz :-)

Diğer cevapta belirtildiği gibi, kullanmak istediğiniz tmpfs. Ayrıca, tüm işletim sisteminizi bir ramdisk / tmpfs içerisinde bulundurarak çok fazla kazanamayacaksınız. Sadece builddir'inizi bir tmpfs dosyasına kopyalayın ve derlemeyi yapın. Tüm geçici sonuçların, tmpfs içindeki bir yere de yazılmasını sağlamanız gerekebilir.


Onlara bir şeyler yazana kadar aslında herhangi bir hafıza kullanmazlar. Önyükleme zaman sınırı sadece sınırdır. Birini doldurduktan sonra bile belleği tekrar açabilirsiniz blockdev --flushbufs.
psusi

@ psusi: Bize bu konuda daha fazla bilgi verebilir misiniz? Sadece bir kez ramdisk hafızası tarafından iddia edilen, örneğin Documentation/blockdev/ramdisk.txtçekirdek kaynaklarında talep edilmediğini söyleyen ifadeler bulabilirim . Ve benim cevabım üzerine: bu dosya aynı zamanda ramdisk'in bellek tüketildikçe büyüdüğünü ve böylece bir kerede tahsis edilmediğini söylüyor.
Bananguin

Ne tür bilgiler? Komutu çalıştırıyorsunuz ve hala bir şekilde monte etmediğinizi varsayarak, tokmağı serbest bırakıyor.
psusi

Komutun söylediğini yaptığını nereden biliyorsun? Kılavuz sayfası bunun doğru olmadığını ve çekirdek kaynak ağacındaki belgelerin bilgilerinizi çelişmek için anlaşılabileceğini doğrulamaz.
Bananguin

6
Kaynak kodu okudum ve deneyerek doğruladım.
psusi

3

Önyüklemeden sonra çekirdek parametreleriyle uğraşmadan büyük bir ram diski yapmak için, bu işe yaramış gibi görünüyor. Tmpfs kullanın, bir dosya oluşturun, onu döngü yoluyla bağlayın ve bir dosya sistemi ile bağlayın:

mount -t tmpfs -o size=200M tmpfs temp/
cd temp/
dd if=/dev/zero of=disk.img bs=1M count=199
losetup /dev/loop0 disk.img
mkfs.ext4 /dev/loop0
mount /dev/loop0 temp2/

Muhtemelen biraz farklı katmanlardan geçen bir miktar performans cezası ... ama en azından işe yarıyor.


3

Ayrıca tmpfsve ramfsdiğer bir seçenek de /dev/ram0blok cihazdır. Son Ubuntu sürümlerinde, bu cihaz varsayılan olarak mevcut değildir, ancak üzerinden oluşturulabilir modprobe brd.

Bu yaklaşım gerçek bir ext4dosya sistemi yarattığı ve belirlediğiniz sınırı aşmadığı için daha öngörülebilirdir . Ancak kurulum için daha fazla adım alır ve RAM'i daha az verimli kullanır.

Brd çekirdek modülünü kullanma (/ dev / ram0)

4GB RAM disk oluşturmak ve başlatmak için:

mkdir /ramdisk

modprobe brd rd_nr=1 rd_size=$((4 * 1048576))
mkfs.ext4 /dev/ram0
mount /dev/ram0 /ramdisk

rd_nrParametre birçok RAM diskleri nasıl oluşturulacağını belirten (varsayılan olarak, bu yani 16 yaratır /dev/ram0yoluyla /dev/ram15). rd_sizeParametresi olarak boyutudur kilobayt . $(( ... ))Sözdizimi kabuğunda aritmetik yapalım.

RAM diskini serbest bırakmak için, sökün ve brdçekirdek modülünü çıkarın :

umount /ramdisk
modprobe -r brd

İçinde bir blok aygıtı oluşturma ramfs

Alternatif olarak, içinde bir blok cihaz oluşturabilirsiniz ramfs:

mkdir /ramdisk-storage /ramdisk
mount -t ramfs ramfs /ramdisk-storage

truncate -s 4G /ramdisk-storage/ramdisk.img
mkfs.ext4 /ramdisk-storage/ramdisk.img
mount /ramdisk-storage/ramdisk.img /ramdisk

truncateKomut on-demand o başlatılır şekilde belirli bir boyutta boş bir dosya (yani tükettiğini bellek) oluşturur.

RAM diskini serbest bırakmak için, diski çıkarın ve disk görüntüsünü silin:

umount /ramdisk
rm /ramdisk-storage/ramdisk.img

İle karşılaştırılması tmpfsveramfs

Her ne kadar tmpfsve ramfsbir blok cihaz kullanmaktan daha verimli olsalar da , aşağıda bazı olumsuz yanları bulunmaktadır.

tmpfsdiske değişebilir. Bu daha verimlidir, ancak saf bir RAM diski istediğiniz zamanlar olabilir:

  • Çalıştığınız dosyalar hassastır (örneğin şifreli bir bölümdeki dosyalar).
  • Performans testi yapıyorsunuz ve disk G / Ç'nin bir faktör olmasını istemiyorsunuz (SSD yazma zamanları çok fazla değişebilir).
  • Büyük bir dosyayı açıyorsunuz ve SSD'nizi yıpratmak istemiyorsunuz.

ramfsKurulumu kolaydır, dosyaları sildikten sonra yer kazanmaz ve RAM’i daha verimli kullanır (RAM’de olduklarını bildiğinden sistem dosyaları arabelleğe almaz). Ancak kendine özgü olumsuz yönleri ve sürprizleri var:

  • Yardımcı dfprogram, alan kullanımını rapor etmiyor:

    root@cello-linux:~# df -h /ramdisk
    Filesystem      Size  Used Avail Use% Mounted on
    ramfs              0     0     0    - /ramdisk
    
  • Boyut limit parametresi yok. Eğer ramdisk'e çok fazla koyarsanız, sisteminiz kilitlenir.

  • Seyrek dosyalar, en az beklediğiniz zaman seyrekleşebilir. Bu sabah bir VM görüntüsünü (150G ama diskte 49G kullanılmış) ramfs(128G RAM'im) kopyaladım. İşe yaradı. Ben kopyalanan Ama gelenramfs hedefe, benim sistem tepkisiz hale geldi. Yardımcı cpprogram görünüşte delikleri okumaya doldurdu , ancak yazmaya başladı.

Hem tmpfsve ramfsgerçek daha farklı davranabilir ext4dosya sistemi. RAM'de bir blok aygıtı oluşturmak ve onu ilk kullanıma başlatmak bunu ext4önler.

Daha ayrıntılı bir karşılaştırma için: https://www.kernel.org/doc/Documentation/filesystems/ramfs-rootfs-initramfs.txt


1

OP RAM miktarı MB cinsinden ifade edilir. Bu yüzden girmeniz gereken tek şey 16384. Ve sonra işte olurdunuz.


1
Hayır! "Eğer fs-size bir sonek yoksa, iki kilobaytlık bir güç olarak yorumlanır." - manmkfs.ext2
sourcejedi

1

Bir ramfsdosya sistemi kurabilir , projenizi içine kopyalayabilir ve oradan çalışabilirsiniz. Bu, giriş dosyalarınızın RAM'e yüklenmesini ve daha yavaş disk sürücüsünden yeniden okunmamasını garanti eder. Bununla birlikte, keşfettiğiniz gibi, bu genellikle yararlı bir strateji değildir. Zaten tam olarak aynı avantajı elde edersiniz.

Ramfs, Linux'un disk önbelleğe alma mekanizmalarını (sayfa önbelleği ve dentry önbelleği) dinamik olarak yeniden boyutlandırılabilir RAM tabanlı bir dosya sistemi olarak dışa aktaran çok basit bir dosya sistemidir.

- https://github.com/torvalds/linux/blob/v4.18/Documentation/filesystems/ramfs-rootfs-initramfs.txt

Giriş dosyalarınızın ilk kez okunduğunda RAM’de önbellekte saklandığına zaten güvenebilirsiniz. Çıktı dosyalarınız da önbelleğe alınır, böylece diske yazılmalarını beklemezsiniz.

Ne kadar önbelleğe alabileceğiniz, ne kadar süre önbelleğe alınacağı vb. Gibi yapay bir sınır yoktur. Önbellek yalnızca RAM doldurduktan sonra bırakılabilir. Hangi önbellek ilk önce bırakılır, korkunç derecede ayrıntılı algoritmalar tarafından seçilir. İlk yaklaşım, onu Son Kullanılan En Az Olarak Tanımladığımız. Bkz . Linux çekirdeğinde OS dosya önbelleği için hangi sayfa değiştirme algoritmaları kullanılıyor?

Metin düzenleyicinizin açıkça fsync()dosyaları diske kaydedeceğini unutmayın.

İlgili bir programın sınamalarını çalıştırırsanız fsync(), ramfsbunları gibi bir dosya sisteminde çalıştırmak onları hızlandırabilir. Diğer bir strateji denemek ve devre dışı bırakmaktır fsync()ile eatmydata/ ' nosync.so.

Diğer bazı işletim sistemlerinde, bir ramdisk kullanılarak atlanabilecek belirli sınırlamalar olabilir. Bir ucunda, herhangi bir dosya önbelleğe alma eksikliği, ramdisks'in DOS'ta popüler olmasının nedenidir .

tmpfs

tmpfsramfsvarsa, takas alanını kullanabilmesi dışında aynı şekilde çalışır . Yani başka bir şey için RAM'e ihtiyacınız varsa, En Son Kullanılanlar algoritmaları, tmpfs'den veri bloklarını seçip onları diske çevirebilir.

Çoğu insan yapışır tmpfs, çünkü toplam boyutu sınırlamanıza izin verir ve örneğin dfkomutta doğru olarak kullanılan alanı gösterir . Bu farkın neden var olduğundan emin değilim. Boyut sınırı tmpfs, tüm RAM'inizi yanlışlıkla doldurmanızı ve temel olarak sisteminizi öldürmenizi önler. RAM'ınızın yarısı varsayılandır.

Yazma nedenlerinin yavaşlamasının diğer nedenleri

Yukarıdaki durum, davanıza göre uyarlanmış bir basitleştirmedir. Sizin durumunuzdaki dosyalara yazma işleminin diski beklemesi gerekmez. Ancak, bazı yazma vakaları vardır. Mükemmel blog gönderisine bakın Neden tamponlu yazılar bazen duruyor ? En şaşırtıcı örnek, Linux'ta "kararlı sayfa yazar" adlı son değişiklik.

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.