2011-07-09 14 views
6

Bir çökme durumunda tutarlılık sağlamak için Linux 2.6'daki uygulamamda msync kullanıyorum. Msync kullanımımı iyice test etmem gerekiyor ama uygulama benim için tüm ilgili sayfaları yıkıyor gibi görünüyor. Mmap'd sayfalarının otomatik olarak temizlenmesini engellemek için disk üzerinde msync hatalı kullanımını açığa çıkarmanın bir yolu var mı?Son Linux kernellerinde msync kullanımını test etmenin iyi bir yolu nedir?

cevap

7

@samold'dan özür dileriz, "swappiness" ile ilgisi yoktur. Swappiness, kernelin, bellek az olduğunda sayfa önbellek sayfalarını tahrif etmek yerine kirli anonim sayfaları değiştirmeyi nasıl etkilediğini etkiler.

Linux VM tunables controlling the pdflush task ile oynamanız gerekiyor. Yeni başlayanlar için, ben öneririm:

Varsayılan olarak
sysctl -w vm.dirty_writeback_centisecs=360000 

, vm.dirty_writeback_centisecs çekirdek "çok yaşlı" olarak 30 saniyeden daha herhangi kirli sayfa yaşlı düşünün ve diske bunu temizlemek için çalışacağız anlamına 3000'dir. En fazla 1 saat kadar çalıştırarak, en azından kısa bir test sırasında kirli sayfaları diske süpürmekten kaçınmalısınız. Varsayılan olarak

sysctl -w vm.dirty_background_ratio=80 

... hariç vm.dirty_background_ratio yüzde 10 gibi 10'dur. Bu, fiziksel belleğin yüzde 10'undan fazlasının kirli sayfalar tarafından işgal edildiği anlamına gelir; çekirdek, dirty_writeback_centisecs'dan daha küçük olsa bile, diske bir şeyler atmakla meşgul olması gerektiğini düşünecektir. Bunu 80 veya 90'a kadar kranklayın ve çekirdek, RAM'in çoğunun kirli sayfalar tarafından işgal edilmesine tahammül etmeye hazır olmalıdır. Yalnız ... Varsayılan olarak

sysctl -w vm.dirty_ratio=90 

, vm.dirty_ratio, 40 olan bir kere tertibatı 40 (Bu çok Kimseyi bahis beri yüksek olsa da, şimdiye kadar bunu yapar ve garip davranışlar tetikleyebilir. Set olmaz) RAM'in% 'si kirli sayfalar, daha kirli sayfalar oluşturmaya çalışan süreçler bir şeyler tahliye edilinceye kadar numaralı bloğu engelleyecektir. Bunu her zaman dirty_background_ratio'dan daha büyük yapın. Hm, bunu düşünmeye gel, bunu bir öncekine koy, sadece bunun her zaman daha büyük olduğundan emin olmak için.

Bu benim ilk önerim için. Çekirdeğiniz yine de sayfaları tahliye etmeye başlayabilir; Linux VM gizemli bir canavardır ve her sürümde çimdiklenmiş gibi görünüyor. Umarım bu bir başlangıç ​​noktası sağlar.VM tunel öğelerinin tam listesi için çekirdek kaynaklarda bkz Documentation/sysctl/vm.txt. (Tercihen kullandığınız çekirdek sürümü için belgelere bakın.)

Son olarak, hangi sayfaların aslında kirli olduğunu görmek için /proc/PID/pagemap interface kullanın.

+0

Bu, belirtildiği gibi soruna bir cevap gibi görünüyor, ama sanırım yanlış soruyu sordum. Gerçekten sevdiğim şey, otomatik temizleme olmadığında (en kötü durum için benim varsayımım olan), kapatıldıktan/kapatıldıktan sonra dosyanın içeriğinin nasıl olacağını görmek için bir yoldur. Ancak, sayfalar temizlenmediyse bile, anladığımdan dolayı değişiklikler diğer süreçlere yansıtılabilir. Soru şu ki, akışsız değişiklikler hariç dosyanın anlık görüntüsünü nasıl alabilirim? Mmap için sahte bir sarmalayıcı yazdığım için mutluyum, ancak bu, tekerleği yeniden icat etmek istemiyorum. – user836336

+1

O_DIRECT, sayfa önbelleğini atlayan bir dosyayı okumanıza izin verecek, ancak sayfanın önbelleğe alınmasının ne gibi bir etkisinin olacağından emin değilim ... Ve tüm bu okumaların 512 baytlık olması gerektiğini unutmayın (ya da 4096) ? Unuttum). Bu ayarlar arasında (kirli sayfaları temizlemeyi önlemek için),/proc/PID/pagemap (hangi sayfaların kirli olduğunu belirlemek için) ve O_DIRECT (dosya verilerini doğrudan diskten oku), istediğiniz şeyi elde edebilirsiniz . – Nemo

0

Birkaç tahmin:

Sen /proc/sys/vm/swappiness tunable yoluyla sistemin swappiness ile oynama işini: (.. Vay proc(5) bir yazım denetleyicisi ile çalıştırılması gerekiyor)

/proc/sys/vm/swappiness 
      The value in this file controls how aggressively the 
      kernel will swap memory pages. Higher values increase 
      agressiveness, lower values descrease aggressiveness. 
      The default value is 60. 

swappiness'un 0'a ayarlanması işlemi yapmazsanız, daha ayarlanabilir düğmeler vardır; Documentation/laptops/laptop-mode.txt dosya laptop_mode scriptin davranışlarının iyi bir açıklamasını içerir:

To increase the effectiveness of the laptop_mode strategy, the laptop_mode 
control script increases dirty_expire_centisecs and dirty_writeback_centisecs in 
/proc/sys/vm to about 10 minutes (by default), which means that pages that are 
dirtied are not forced to be written to disk as often. The control script also 
changes the dirty background ratio, so that background writeback of dirty pages 
is not done anymore. Combined with a higher commit value (also 10 minutes) for 
ext3 or ReiserFS filesystems (also done automatically by the control script), 
this results in concentration of disk activity in a small time interval which 
occurs only once every 10 minutes, or whenever the disk is forced to spin up by 
a cache miss. The disk can then be spun down in the periods of inactivity. 
Onların aşırı bu numaraları almak isteyebilirsiniz

; Uygulamanızın davranışını gerçekten merak ediyorsanız, bu değerleri oldukça yüksek bir değere ayarlamak ve hepsi bittiğinde bir sync(1) komutunun ne kadar sürdüğünü görmek mantıklı geliyor. Fakat bunlar sistem çapında akortçulardır - diğer uygulamalar çok mutlu olmayabilir.

İlgili konular