Dizini daima önbellekte kalmaya zorla


35

Tüm c ++ projemi derlemek için harcadığım zamanı geliştirmek için farklı yöntemler denedim. Şu anda ~ 5 dakika sürer. Distcc, ccache ve diğerlerini denedim. Son zamanlarda, tüm projemi bir RAM sürücüsüne kopyalarsam ve sonra oradan derlerseniz derleme zamanını orijinalinin% 30'una düşürdüğünü keşfettim - sadece 1,5 dakika.

Açıkçası, RAM sürücüsünden çalışmak pratik değil. Peki, işletim sistemini her zaman belirli bir dizini önbelleğe almak için zorlayabileceğimi bilen biri var mı? Dizinin hala normal gibi diske geri eşitlenmesini istiyorum, ancak her zaman bellekteki verilerin bir kopyasını da istiyorum. Mümkün mü?

EDIT: Olası bir çözüm olarak, rsyncdisk sürücüsünü bir RAM sürücüyle eşitlemek için her 10 saniyede bir çalışan bir arka plan programı başlatmayı düşündük . Sonra derlemeyi RAM sürücüsünden çalıştırıyoruz. rsyncHızlı yanan, ama bu gerçekten işe yarar? Tabi ki OS daha iyisini yapabilirdi ....


Önbellek, tmpfs ve ext3 / 4 arasındaki tek fark değildir; Örneğin, önbelleğe bakılmaksızın yazılacak günlükleri vardır.
André Paramés

1
Acaba timesizin derleme ve bizimle sonucu paylaşmak? Bazı yükseliş tartışmalarını ortadan kaldıracaktı. make clean && /usr/bin/time -v make( timeKomuta yerleşik bash kullanmayın )
kabuklu

1
@she Neden bash'ın yerleşik emri değil?
tshepang

3
@ timeBash basında bashedilen ( help time), GNU zamanından ( man time) G / Ç ile ilgili çok daha az ayrıntıya (ayrıntılı seçenek yok) sahiptir ( ), bağlam anahtarları, ...
shellholic

Yanıtlar:


18

Bir sürü dosyayı önbellekte tutmanın en açık yolu, onlara sık sık erişmektir. Linux, takas ve önbellekleme arasında hakemlik yapmakta oldukça iyidir, bu nedenle gözlemlediğiniz hız farkının aslında işletim sisteminin önbellekte bir şeyleri tutmaması değil, tmpfs kullanımınız ve diğer girişimleriniz arasındaki diğer farklardan kaynaklanmasından kaynaklandığından şüpheleniyorum.

Her durumda IO ne yapıyor gözlemlemeye çalışın. Bunun için temel araç iotop. Diğer araçlar yararlı olabilir; Linux disk IO yükleme dökümünü görmek , dosya sistemi yolu ve / veya işlemine göre? , Linux'ta hangi program zaman içinde G / Ç'yi ölçebilir? ve Server Fault'daki diğer başlıklar.

İşte neler olabileceğine dair birkaç hipotez. Ölçüm alırsanız, lütfen bu hipotezleri onaylayabilmemiz veya doğrulayamamamız için gösterin.

  • Dosya erişim zamanları açıksa, işletim sistemi bu erişim zamanlarını yazmakta zaman alabilir. Bir derleme ağacı için erişim süreleri faydasızdır, bu nedenle noatimemount seçeneğiyle kapatıldıklarından emin olun . Kişisel tmpfs + rsync çözüm asla okur ekstra zaman yazma atimes harcamak zorunda kalmaz böylece, sabit diskten.
  • Yazılar , derleyici çağırdığı için veya çekirdeğin çıkış arabelleğini sık sık temizlediği için senkronize oluyorsa, yazma sync()işleminin sabit diskte tmpfs'den daha uzun sürmesi gerekir.

Bende de bu his var. Derleme, GÇ'den ziyade, yoğun CPU'dur.
phunehehe

Hmmm, burada @ GillesC'nin, Gilles hipotezini doğrulayan veya reddeden bir yorumunu görmek istiyorum. 1.5'e karşılık 5 dakika oldukça büyük bir fark ...
Daniel Alder

8

Linux varsayılan olarak RAM'ı disk önbelleği olarak kullanır. Bir gösteri olarak, time find /some/dir/containing/a/lot/of/files > /dev/nulliki kez çalıştırmayı deneyin , ikinci kez her disk inode önbelleğe alındığında çok daha hızlıdır. Buradaki amaç, bu çekirdek özelliğini nasıl kullanabileceğiniz ve değiştirme girişiminizi nasıl durduracağınız.

Önemli olan değiştirmektir swappiness. Üç ana bellek kullanımı türü düşünelim: aktif programlar, etkin olmayan programlar ve disk önbelleği. Açıkçası, aktif programlar tarafından kullanılan hafıza değiştirilmemelidir ve diğer ikisi ile olan seçim oldukça keyfidir. Hızlı program değiştirme veya hızlı dosya erişimi ister misiniz? Bir düşük swappiness tercih bellekte tutmak programları (uzun süre kullanılmadığı bile) ve bir yüksek swappiness tercih fazla disk önbelleği tutmak (kullanılmayan programları değiştirerek). (değiş tokuş ölçeği 0 ila 100 arasındadır ve varsayılan değer 60'tır)

Probleminize çözümüm, takas alanını çok yüksek (90-95, 100 değil) olarak değiştirmek ve önbelleği yüklemek:

echo 95 | sudo tee /proc/sys/vm/swappiness > /dev/null # once after reboot
find /your/source/directory -type f -exec cat {} \; > /dev/null

Tahmin ettiğiniz gibi, tüm kaynak dosyalarınızı ve nesne dosyalarınızı, derleyiciyi, başlık dosyalarını, bağlantılı kitaplıkları, IDE'nizi ve diğer kullanılmış programları önbellekte saklamak için yeterli boş belleğe sahip olmalısınız.


Bu genel olarak kullanışlıdır, ancak asıl istediğim kaynak kodumun düşük swappiness olması, fakat diğer her şeyin normal swappiness olması. Temel olarak, arka planda devam eden bir sürü şey var, ancak bunları her zaman kaynak kod için 2 GB tutarken 6 GB ile sınırlandırmak istiyorum . Bunun değiştirilme şansını almak istemiyorum ... hiç ... çünkü bu can sıkıcı.
JaredC

Değiş tokuş sistemi geniş. Aslında başka bir şey yapıyorsanız ve dosyalarınız bellekten silinirse, ikinci satırla yeniden yüklemeniz gerekir. Eğer başka bir şey için hafızanın boşaltılması gerekiyorsa, gerçekten takas işleminden yapılması için “şansı denemek” istemezsiniz. Btw, tmpfsaynı durumda da takas olurdu.
kabuklu

2
Şahsen yüksek bir takas aldım iş istasyonlarında kesinlikle korkunç. Her ne kadar bazı işlevler daha büyük önbellekle (yani daha fazla önbelleklenmiş dosyalar) hızlandırılsa da, bunun bir bedeli var: programlar arasında geçiş yaparken, kullanıcıların bir sistemde çalışırken ilk önce fark ettiği şeydir. Tarayıcıdan ofise başka bir tarayıcıya e-postaya geçerken, her programın geri gelmesi için 1-2 saniye beklemek zorunda kalamam. Tüm linux makinelerimde genellikle 10'luk bir düşük değere geçtim.
fgysin, Monica

6

Önbelleği zorlamak bunu yapmanın doğru yolu değildir. Kaynakları sabit sürücüde tutmak ve bunları tmpfs'de derlemek daha iyidir. Qmake ve CMake gibi pek çok yapı sistemi, kaynak dışı yapıları destekler.


6

inosyncBöyle Daemon sesler bir ramdiske rsync ile gidiyoruz ne istediğinizi tam olarak yapar. Her 10 saniyede bir rsyncing yapmak yerine, bir dosya değiştiğinde rsync yapmak için Linux'un inotify özelliğini kullanır. Debian deposunda inosyncpaket olarak buldum ya da kaynağı http://bb.xnull.de/projects/inosync/ adresinde bulunabilir .


Bu oldukça kullanışlı geliyor. Bunu inceleyip tekrar rapor edeceğim. Teşekkürler!
JaredC

5

Belirli dosyaları veya tüm dosyaları belirli bir dizindeki önbellekte saklamak istersem bu iş benim için çalışıyor gibi görünüyor.

Vmtouch sadece bir şey yapıyor gibi görünüyor. Örnek 5, ihtiyacınız olan şey olabilir.

vmtouch -dl /whatever/directory/

Kök olarak çalıştırmam gerekiyordu. sudo


1
Yeni / kaldırılmış dosyalar görmüyor.
Vi.

3

Yeterli bellek verildiğinde, ramdiskten derlemeniz yapılamaz G / Ç yapmaz. Bu, dosyaları okuyan veya yazan her şeyi hızlandırabilir. G / Ç, en yavaş işlemlerden biridir. Yapımdan önce her şeyi önbelleğe almış olsanız bile, yazma için G / Ç'ye sahipsiniz, ancak minimum etkiye sahip olmaları gerekir.

Tüm dosyaları önbelleğe önceden yükleyerek biraz hız kazanabilirsiniz, ancak bunun için geçen süre toplam derleme süresine dahil edilmelidir. Bu size fazla bir avantaj sağlamayabilir.

Nesne ve ara dosyaları disk yerine RAM içine oluşturma. Artımlı yapımları yapmak, sık sık yapılan inşaatlarda önemli kazançlar elde etmenizi sağlayabilir. Projelerin çoğunda her gün temiz bir yapı yapıyorum ve arada artan artışlar yapıyorum. Entegrasyon yapıları her zaman temiz yapılarıdır, ancak bunları günde bir taneden daha azıyla sınırlamaya çalışıyorum.

Atime kapalı durumdayken bir ext2 bölümü kullanarak performans elde edebilirsiniz. Kaynağınız, ext3 / 4 gibi bir günlüklü dosya sisteminde sürüm kontrolünde olmalıdır.


2

Önceden belirtildiği gibi, bariz yol, önbelleklenmesini istediğiniz dizinin tüm yapısını ve dosya içeriğini okumaktır.

Çıktısını izlemek için bir komut dosyası yazarak bunu otomatikleştirebilirsiniz vmstat 1(işletim sisteminiz için eşdeğer herhangi bir aracı kullanın) ve yazılan ve okunan blok sayısını bir tutabilirsiniz. Toplam, seçtiğiniz bir eşiği geçtiğinde, önbelleğe almak istediğiniz tüm dosyaları okuyun, toplamı sıfırlayın ve vmstat çıktısını izlemeye devam edin. Dosyaları hızlı bir şekilde okumak için: ağacınız çok sayıda dosya içeriyorsa, kaçının find ... -exec cat, bunun yerine find ... -print0 | xargs -0 cather dosya için cat çalıştırmayacak özel bir program deneyin .

Disk IO'yu izlemek, sabit bir aralık kullanmaya tercih edilir, çünkü disk IO yüküne bağlı olarak verilerinizi daha fazla veya daha az tekrar okuduğunu gösterir.

Bu otomatik yöntemi başarıyla kullandım, bazı dizin dosyalarının her zaman hızlı olması için okumaya ihtiyacım olan sistemlerde, sabit sürücü G / Ç'lerinden kaçınıyorum. Ayrıca, oturum açtığımda erişilen her dosyanın bir listesini yapmak için strace kullandım, böylece hızlı girişler için her şeyi önbellekte sıcak tutabilirim.

Bu mümkün olan en iyi çözüm olmayabilir, ancak bana çok uygun.

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.