Linux'taki dosyaları RAM'e önbelleğe almak / önceden yüklemek


74

4GB RAM'e sahip oldukça eski bir sunucum var ve gün boyu aynı dosyalara hizmet veriyor, ancak 3GB RAM "ücretsiz" iken bunu sabit diskten yapıyor.

Bir ram sürücüsü çalıştırmayı hiç denemiş olan herkes , sürat açısından müthiş olduğuna şahit olabilir . Bu sistemin hafıza kullanımı genellikle asla 1GB / 4GB'tan daha yüksek değildir, bu yüzden bu ekstra belleği iyi bir şey için kullanmanın bir yolu olup olmadığını bilmek istiyorum.

  • Dosya sistemine her zaman RAM'den belirli dosyaları sunmasını söylemek mümkün müdür?
  • RAM kullanarak dosya okuma yeteneklerini geliştirmek için kullanabileceğim başka yöntemler var mı?

Daha spesifik olarak, burada bir 'kesmek' aramıyorum. Bir ram-sürücü oluşturmaya gerek kalmadan dosyaları manuel olarak kopyalamak zorunda kalmadan dosya sistemi aramalarını RAM'den dosyalara sunmak için arama yapmak istiyorum. Ya da en azından benim için bunu yapan bir senaryo.

Buradaki olası uygulamalar:

  • Çok okuyan statik dosyalara sahip web sunucuları
  • Büyük kütüphanelere sahip uygulama sunucuları
  • Çok fazla RAM'e sahip masaüstü bilgisayarlar

Herhangi bir fikir?

Düzenle:

  • Bu çok bilgilendirici bulundu: Linux Sayfa Önbelleği ve pdflush
  • Zan'in belirttiği gibi, hafıza aslında özgür değil. Demek istediğim, uygulamalar tarafından kullanılmadığı ve bellekte neyin önbelleğe alınması gerektiğini kontrol etmek istediğimdir.

1
Ben de bu çizgiler boyunca bir şey arıyorum. Genel dosya sistemi disk bloğu önbelleğe almanın cevap olduğunu sanmıyorum. X disk diskinin her zaman önbelleğe alınmasını istediğimi varsayalım. Bir şey ona erişir ve çekirdek onu önbelleğe alır. Şimdiye kadar çok iyi, ama bir sonraki işlem Y bloğunu istiyor, yani çekirdek X bloğumu atar ve bunun yerine Y'yi önbelleğe alır. X'i isteyen bir sonraki işlemin diskten çıkmasını beklemek zorunda kalacak; Bundan kaçınmak istediğim de bu. Hep dosyaları garanti edecek bir dosya sistemi üzerine aracılığıyla yazma önbelleğini bindirmek için olan I istiyoruz (ve ne özgün afiş de sonra olduğunu düşünüyorum) Ne

1
Mutabakatın Linux'un sizin için zaten sık kullanılan dosyaları önbelleğe alması gerektiği gözüktüğü için, burada bulunan önerileri kullanarak herhangi bir iyileştirme yapmayı gerçekten başardığınızı merak ediyorum. Bana göre önbelleğe almayı denetlemeye çalışmak önbelleği ısıtmak için faydalı olabilir, ancak tanımladığınız kullanım şekliyle ("tüm gün aynı dosyaları sunarak"), önceden ısıtılmış bir sunucuya yardımcı olmaz hiç değilse.
Nate CK,

Kesmek istemediğini söylüyorsun, ama Linux zaten yapmak istediğini varsayılan olarak yapıyor. Aşağıdaki denklem: "tüm gün aynı dosyaları sunmak" + "dosya sistemine her zaman RAM’de belirli dosyaları sunmasını" tanımla "Hack" e eşittir. Performansta herhangi bir gelişme olduğunu fark ettin mi? Tecrübelerime göre, Linux önbellek dosya sisteminizden çıkan bejeezus.
Mike S,

2
Açıklama için, linux dosyaları önbelleğe alır, ancak meta verileri her istek için her dosya için doğrulanır. Dönen pasta, çok sayıda küçük dosya içeren yoğun bir web sunucusunda, bu hala IO çekişmesine ve erken yıpranan disklere neden olabilir. Statik içerik ve komut dosyaları / dev / shm içine rsync veya uygulama başlangıcında özel bir tmpfs bağlantısı olabilir. Bunu birkaç on yıl boyunca yaptım ve sürücülerim erken yıpranmıyor. Ayrıca sitelerim ağır patlama yüklerine bu şekilde daha iyi dayanabiliyor. Bu, en pahalı kurumsal donanımdan emtia donanımına kadar her konuda yardımcı olur.
Aaron,

Yanıtlar:


57

vmtouch iş için iyi bir araç gibi görünüyor.

Özellikleri:

  • bir dizinin ne kadarının önbelleğe alındığını sorgula
  • Bir dosyanın ne kadarının önbelleğe alındığını sorgulamak (ayrıca hangi sayfalarda, grafiksel gösterimlerde)
  • önbelleğe dosya yükle
  • önbellekten dosya kaldır
  • dosyaları önbellekte kilitle
  • daemon olarak koşmak

vmtouch manual

DÜZENLEME: Soruda sorulan kullanım vmtouch Ana Sayfasındaki örnek 5'te listelenmiştir.

Example 5

Daemonise and lock all files in a directory into physical memory:

vmtouch -dl /var/www/htdocs/critical/

EDIT2: Yorumlarda belirtildiği gibi , artık mevcut bir git deposu var.


5
Gelecekte izleyiciler için, link sayfadaki talimatları uygulamak yerine vmtouch git deposunu kullanmaya çalışın . Bu sayede bir makefile elde edip güncellemeler alabilirsiniz.
rastgele

Dosya boyutu (4GB) için bir sınır varmış gibi görünüyor. Başka bir alternatif var mı?
Alix Axel

Tamam, işte asıl kullanım durumum: Eski bir SD kartlı bir RPI1, orada bir yerde Şeyler yapıyor. Oraya bir yolculuk yapmadan ve kartı (ve muhtemelen güç kaynağını) değiştirmeden önce, işletim sisteminin karta az miktarda, tercihen asla dokunmamasını istiyorum. FS önbelleği iyi ancak kontrolüm dışında; / bin ve / sbin zaten tmpf'lerde, / home / user öğesinin elde edilmesinin başka sakıncaları da var. vmtouchbu nişe iyi uyuyor.
Piskvor,

vmtouch tmpfs'den farklı olarak nasıl çalışır?
Edward Torvalds

26

Bu, vmtouch Sanal Bellek Toucher yardımcı programını kullanarak da mümkündür .

Araç, Linux sistemindeki dosya sistemi önbelleğini kontrol etmenizi sağlar. VM önbellek alt sisteminde belirli bir dosyayı veya dizini zorlayabilir veya kilitleyebilir veya VM'de bir dosyanın / dizinin hangi bölümlerinin bulunduğunu kontrol etmek için kullanabilirsiniz.

How much of the /bin/ directory is currently in cache?

$ vmtouch /bin/
           Files: 92
     Directories: 1
  Resident Pages: 348/1307  1M/5M  26.6%
         Elapsed: 0.003426 seconds

Veya...

Let's bring the rest of big-dataset.txt into memory...

$ vmtouch -vt big-dataset.txt
big-dataset.txt
[OOo                                                 oOOOOOOO] 6887/42116
[OOOOOOOOo                                           oOOOOOOO] 10631/42116
[OOOOOOOOOOOOOOo                                     oOOOOOOO] 15351/42116
[OOOOOOOOOOOOOOOOOOOOOo                              oOOOOOOO] 19719/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOo                        oOOOOOOO] 24183/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo                  oOOOOOOO] 28615/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo              oOOOOOOO] 31415/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo      oOOOOOOO] 36775/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo  oOOOOOOO] 39431/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO] 42116/42116

           Files: 1
     Directories: 0
   Touched Pages: 42116 (164M)
         Elapsed: 12.107 seconds

3
Bu harika bir yardımcı programdır ve OP'nin istediği şeyi yapar. Keşke bunu bir cevap olarak kabul edecekti.
laebshade,

Bunun ZFS ile çalışıp çalışmadığını biliyor musunuz?
CMCDragonkai 16:15

1
@ CMCDragonkai ZFS ile gerekli olduğunu sanmıyorum ... Düşün: ARC ve L2ARC .
ewwhite,

22

Fakir bir adamın dosya sistemi önbelleğine bir şeyler sokma hilesi, basitçe onu yakalamak ve / dev / null'a yönlendirmektir.


1
Anlaşmak. Ve belirli dosyaların önbelleğe alındığından emin olmak istiyorsanız, catperiyodik olarak / dev / null dosyasının bulunduğu bir cron işi yapın
Josh,

18

Linux, bellekte olabildiğince fazla disk G / Ç'si önbelleğe alır. Bu, önbellek ve arabellek istatistiğidir. Muhtemelen doğru şeyleri saklamaktan daha iyi bir iş çıkarır.

Ancak, verilerinizi bellekte saklamakta ısrar ederseniz, ya tmpfs veya ramfs kullanarak bir ram sürücüsü oluşturabilirsiniz. Aradaki fark, rampaların istediğiniz tüm belleği tahsis edeceği, tmpfs’in sadece blok cihazınızın kullandığı belleği kullanmasıydı. Hafızam biraz paslanmış ama yapabilecekleriniz:

 # mount -t ramfs ram /mnt/ram 

veya

 # mount -t tmpfs tmp /mnt/tmp

ve sonra verilerinizi dizine kopyalayın. Açıkçası, makineyi kapattığınızda veya bu bölümü çıkardığınızda, verileriniz kaybolur.


1
Cevabınız için teşekkürler, ama açıkçası kaçınmak istediğim bu. Aksi halde, sadece ramdrive oluşturmak, dosyaları kopyalamak ve sembolik olarak ramdrive'a bağlanmak için bilgisayarın komut dosyasını yazdım. Ama sonra verilerim tutarsız. Bellekte önbelleğe alınacak belirli dosyaları 'etiketleyebileceğim' bir dosya sistemi umuyordum. Ama belki biraz fazla iyimserim.
Andrioid

3
Önbelleğe alınacak dosyaları erişerek "etiketlersiniz".
womble

9
Keşke en çok kullanılan dosyaları otomatik olarak etiketlemenin bir yolu olsaydı.
David Pashley

4
Blimey, alaycı iyi yolculuk etmiyor :)
David Pashley

2
Evet teşekkür ederim. IO önbelleğe alma kavramını anlıyorum. Cevabımda bile açıkladım. Görünüşe göre bu incelik alaycı olduğu.
David Pashley

18

2.6 çekirdek takas ve sayfa önbelleğe alma özellikleri bazı kapsamlı bir okuma sonra 'fcoretools' bulundu. Hangi iki araçtan oluşur;

  • fincore: Uygulamanın çekirdek hafızada kaç sayfa sakladığını ortaya çıkaracak
  • fadvise: Çekirdek belleği değiştirmenize izin verir (sayfa önbelleği).

(Başka birinin bunu ilginç bulması durumunda, bunu buraya gönderiyorum)


1
Bunu bir yerlerde yapacak bir program olduğunu düşündüm. +1
Brad Gilbert

7

Diğer araçları kullanmadan bile önemli ölçüde yardımcı olabilecek iki çekirdek ayarı vardır:

swappiness

linux çekirdeğine swap'ı ne kadar agresif kullanması gerektiğini söyler. Wikipedia makalesinden alıntı:

Değişkenlik, Linux çekirdeği için, sayfaların sistem sayfası önbelleğinden düşmesi yerine, çalışma zamanı belleğinin değiştirilmesi arasındaki dengeyi değiştiren bir özelliktir. Değişkenlik, 0 ile 100 arasında dahil olan değerlere ayarlanabilir. Düşük bir değer, çekirdeğin mümkün olduğunca yüksek bir değerin yerine geçmesini önlemeye çalışacağı anlamına gelir; bunun yerine çekirdeğin agresif bir şekilde takas alanı kullanmaya çalışmasını sağlar. Varsayılan değer 60'tır ve çoğu masaüstü sistemi için 100'e ayarlamak genel performansı etkileyebilir, oysa daha düşük (0 bile) ayarlamak etkileşimi iyileştirebilir (yanıt gecikmesini azaltır).

vfs_cache_pressure

Vm.txt dosyasından alıntı :

Çekirdeğin, dizin ve inode nesnelerinin önbelleğe alınması için kullanılan belleği geri alma eğilimini kontrol eder.

Vfs_cache_pressure = 100'ün varsayılan değerinde çekirdek, pagecache ve swapcache geri kazanımı ile ilgili olarak, dişçi ve inodeları "adil" bir oranda geri almaya çalışacaktır. Vfs_cache_pressure değerini azaltmak, çekirdeğin dentry ve inode önbelleklerini tutmayı tercih etmesine neden olur. ...


swappinessYüksek (100 gibi) ayarlayarak , çekirdek, dosyaları önbelleğe almak için RAM'i serbest bırakmak için takas etmesi gerekmeyen her şeyi taşır. Ve vfs_cache_pressuredaha düşük bir değere ayarlayarak (diyelim ki, 0'a 50 değil diyelim), uygulama verilerini RAM'de tutmak yerine dosyaları önbelleğe almayı tercih eder.

(Büyük bir Java projesi üzerinde çalışıyorum ve her çalıştırdığımda çok fazla RAM aldı ve disk önbelleğini temizledi, böylece projeyi bir daha derlediğimde her şey tekrar diskten okundu. Bu iki ayarı değiştirerek yönetiyorum. Kaynakları ve derlenmiş çıktıları RAM'de önbelleğe almak, bu süreci önemli ölçüde hızlandırır.)


3

Aslında 3 GB RAM ücretsiz diskteki dosyaları sunmakta olduğundan şüpheliyim. Linux dosya önbelleği çok iyidir.

Disk IO görüyorsanız, günlük yapılandırmalarınıza bakardım. Bir kaza durumunda en son günlük bilgisinin mevcut olduğundan emin olmak için birçok günlük arabelleksiz olarak ayarlanır. Ne olursa olsun hızlı olması gereken sistemlerde, tamponlanmış log IO kullanın veya uzak bir log server kullanın.


Haklısın, sadece önbellekte ne olduğunu kontrol etmek istiyorum.
Andrioid

3

Çok fazla belleğiniz varsa, kedi veya benzeri bir şeyle önbelleğe almak istediğiniz dosyaları okuyabilirsiniz. Linux daha sonra etrafta kalabilmek için iyi bir iş çıkarır.


3

Sadece mmapdosyalarınızı çalıştıran bir program olabilir .


3
Bana söyleyebileceğim kadarıyla 'fadvise' (fcoretools) ne yaparsa o kadar.
Andrioid

0

Kullanabileceğiniz çeşitli ramfs sistemleri vardır (örneğin, ramfs, tmpfs), ancak genel olarak dosyalar gerçekten okunuyorsa, dosya sistemi önbelleğinize otururlar. Eğer çalışma dosyalarınız serbest ramınızdan daha büyükse, o zaman dosyalar silinir - ancak çalışma kümeniz serbest ramınızdan daha büyükse, hepsini bir ramdisk içine sığdırmanız mümkün değildir.

Bir kabuktaki "free" komutunun çıktısını kontrol edin - son sütundaki "Cached" altındaki değer, serbest ramınızın dosya sistemi önbelleği için ne kadarının kullanıldığını gösterir.


0

İkinci sorunuza gelince, RAM'ınızın farklı bellek kanallarında oturduğundan emin olun, böylece işlemci verileri paralel olarak alabilir.


0

Bunun uygulama düzeyinde daha iyi çözülebileceğini düşünüyorum. Örneğin, muhtemelen bunun için özel web sunucuları var veya Apache ile mod_cache düşünebilirsiniz . Web içeriğini daha hızlı sunma gibi belirli bir hedefiniz varsa, düşündüğüm türden geliştirmeler alabilirsiniz.

Ancak sorunuz genel olarak geneldir, Linux bellek alt sistemi RAM'in en iyi şekilde kullanılmasını sağlamak için tasarlanmıştır. Belirli performans türlerini hedeflemek istiyorsanız, / proc / sys / vm içindeki her şeyi aramayı düşünün.

Fcoretools paketi ilginç, uygulaması hakkında herhangi bir makaleyle ilgileniyorum ... Bu bağlantı , bir uygulamada kullanılan gerçek sistem çağrıları hakkında konuşuyor.


1
find / var / lib / mysql | xargs fadvise -willneed (kirli, ancak veritabanı dosyalarına daha hızlı erişim sağlamalı; örnek olarak)
Andrioid

Çok iyi kesmek, ancak böyle bir kesmek mysql'den çok fazla beklemekte olan fsyncs'i devre dışı bırakmıyor :( fsyncs, ACID (Atomicity, Tutarlılık, İzolasyon, Dayanıklılık) sağlamak için gereklidir
osgx

0

Masaüstü bilgisayarlar (örn. Ubuntu) zaten önyükleme sırasında belleğe yüklemek için önceden yüklenmiş dosyaları (en azından popüler paylaşılan kütüphaneleri) kullanır. FF, OO, KDE ve GNOME gibi farklı yazılım programlarının önyükleme ve başlatma zamanını hızlandırmak için kullanılır (evrimsel bloat-posta ile).

Aracın adı readahead http://packages.ubuntu.com/dapper/admin/readahead

Buna karşılık gelen bir çağrı var : readahead (2) http://linux.die.net/man/2/readahead

Ayrıca önyükleme arka planında da bir proje var: http://linux.die.net/man/8/preload



0

= dd eğer = / dev / yourrootpartition = / dev / null \ bs = 1Mcount = howmuchmemoryyouwanttofill

bana arzuladığın bir kontrolü sağlamaz ama en azından boş hafıza kullanmaya çalışır.


0

Ben bul / -name stringofrandomcharacter çok yardımcı olur kullanın


0

Tam olarak ne istendi, ama kullanıyorum

BASE_DIRECTORY -tipi f -exec kedisini bulun {}> / dev / null \;

Bir anlık görüntüden oluşturulan bir AWS birimindeki dosyaların başlatılmasını tetiklemek için. Sadece bazı dosyaları okumak istiyorsanız, gd kullanmanızın resmi önerisinden daha çok odaklanmıştır.


-1

Bazen dosyaları belirli bir klasörde ve alt klasörlerinde önbelleğe almak isteyebilirim. Ben sadece bu klasöre gidiyorum ve aşağıdakileri yürütüyorum:

Bul -exec cp {} / dev / null \;

Ve bu dosyalar önbelleğe alınır

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.