Genel olarak disk önbellek performansının iyileştirilmesi, tüm sisteminiz RAM'e sığmadığı sürece sadece sistem önbellek boyutunu artırmaktan daha fazlasıdır (bu durumda RAM sürücüyü kullanmanız gerekir ( tmpfs
bazı durumlarda RAM'e ihtiyacınız olursa diske düşmenize izin verir çünkü) çalışma zamanı saklama için (ve başlangıçta sistemi depolama biriminden RAM sürücüye kopyalamak için bir initrd komut dosyası olabilir).
Depolama cihazınızın SSD veya HDD olup olmadığını söylemediniz. İşte benim için çalışırken bulduğum şey (benim durumumda sda
bir HDD /home
ve sdb
SSD de monte edilmiş /
).
Öncelikle, depolama alanından ön belleğe yüklenen bölümü optimize et:
İşte benim HDD kurulumum: (geçiş yaparsanız, BIOS'ta AHCI + NCQ'nun etkinleştirildiğinden emin olun):
echo cfq > /sys/block/sda/queue/scheduler
echo 10000 > /sys/block/sda/queue/iosched/fifo_expire_async
echo 250 > /sys/block/sda/queue/iosched/fifo_expire_sync
echo 80 > /sys/block/sda/queue/iosched/slice_async
echo 1 > /sys/block/sda/queue/iosched/low_latency
echo 6 > /sys/block/sda/queue/iosched/quantum
echo 5 > /sys/block/sda/queue/iosched/slice_async_rq
echo 3 > /sys/block/sda/queue/iosched/slice_idle
echo 100 > /sys/block/sda/queue/iosched/slice_sync
hdparm -q -M 254 /dev/sda
HDD kutusu için kayda değer, yüksek fifo_expire_async
(genellikle yazma) ve slice_sync
tek bir işlemin yüksek verimlilik elde etmesini sağlamak için uzun süredir ( slice_sync
birden fazla işlemin diskten paralel olarak bazı veriler için beklediği durumlarda vurursanız düşük sayıya ayarlayın ). slice_idle
Hep HDD'ler için bir uzlaşmadır ama aralığında 3-20 yerde ayarlayarak disk kullanımı ve disk firmware bağlı tamam olmalıdır. Düşük değerleri hedeflemeyi tercih ederim, ancak çok düşük bir değere ayarlamanız veriminizi bozacaktır. quantum
Ayar throughput çok etkileyen ancak mantıklı düzeyde gecikme tutmak bunu mümkün olduğunca düşük tutmaya çalışın görünüyor. quantum
Çok düşük ayar yapmak verimi tahrip eder. 3-8 aralığındaki değerler HDD’lerle iyi çalışıyor gibi görünüyor. Bir okuma için en kötü durum gecikmesi ( quantum
* slice_sync
) + ( slice_async_rq
*slice_async
) Eğer çekirdek davranışını doğru anladıysam, ms. Zaman uyumsuz çoğunlukla yazma kullandığı ve diske yazma geciktirmek için istekli beri, hem ayarlanır slice_async_rq
ve slice_async
çok düşük sayılar. Bununla birlikte, slice_async_rq
çok düşük bir değerin ayarlanması okumaları durdurabilir, çünkü okumalar daha fazla okunduktan sonra geciktirilemez. Ayrıca set güç kaybı üzerinde veri kaybına tahammül beri Benim yapılandırma veri çekirdek geçildikten sonra 10 saniye sonra en fazla diske veri yazmak için çalışıyorum ama olacak fifo_expire_async
kadar 3600000
1 saat diske gecikme için tamam olduğunu anlatmak için. Sadece slice_async
düşük tutun , çünkü aksi halde yüksek okuma gecikmesi elde edebilirsiniz.
hdparm
Komut AHCI ve NCQ verir performansın çok öldürmekten AAM önlemek için gereklidir. Diskiniz çok fazla gürültü yapıyorsa, bunu atlayın.
İşte SSD için kurulumum (Intel 320 series):
echo cfq > /sys/block/sdb/queue/scheduler
echo 1 > /sys/block/sdb/queue/iosched/back_seek_penalty
echo 10000 > /sys/block/sdb/queue/iosched/fifo_expire_async
echo 20 > /sys/block/sdb/queue/iosched/fifo_expire_sync
echo 1 > /sys/block/sdb/queue/iosched/low_latency
echo 6 > /sys/block/sdb/queue/iosched/quantum
echo 2 > /sys/block/sdb/queue/iosched/slice_async
echo 10 > /sys/block/sdb/queue/iosched/slice_async_rq
echo 1 > /sys/block/sdb/queue/iosched/slice_idle
echo 20 > /sys/block/sdb/queue/iosched/slice_sync
Burada farklı dilim ayarları için düşük değerleri belirtmekte fayda var. Bir SSD için en önemli ayar slice_idle
0-1 olarak ayarlanmalıdır. Sıfıra ayarlanması, tüm sipariş kararlarını yerel NCQ'ya götürürken, 1'e ayarlamak çekirdeğin istek talep etmesine izin verir (ancak NCQ etkinse, donanım çekirdek siparişini kısmen geçersiz kılabilir). Farkı görüp göremediğinizi görmek için her iki değeri de test edin. Intel 320 serisi slide_idle
için 0
, en iyi verimi sağlayacak şekilde ayarlanması , ancak 1
en iyi (en düşük) genel gecikmeyle ayarlanması gibi görünüyor .
Bu ayarlar hakkında daha fazla bilgi için, bkz. Http://www.linux-mag.com/id/7572/ .
Şimdi çekirdeği diskten önbelleğe makul bir performansla yükleyecek şekilde yapılandırdığımıza göre, önbellek davranışını ayarlama zamanı:
Yaptığım kıyaslamalara göre, ileriye dönük okuma ayarını hiç rahatsız etmem blockdev
. Çekirdek varsayılan ayarları iyi.
Sistemi dosya verilerini uygulama koduyla değiştirmeyi tercih edecek şekilde ayarlayın (bu, tüm dosya sistemini ve tüm uygulama kodunu ve RAM'deki uygulamalar tarafından tahsis edilen tüm sanal belleği saklamak için yeterli RAM'iniz olup olmadığı önemli değildir ). Bu, büyük dosyalara tek bir uygulamadan erişmek için, gecikme yerine farklı uygulamalar arasında geçiş yapma gecikmesini azaltır:
echo 15 > /proc/sys/vm/swappiness
Uygulamaları neredeyse her zaman RAM’de tutmayı tercih ederseniz, bunu 1 olarak ayarlayabilirsiniz. Bunu sıfır olarak ayarlarsanız, OOM’dan kaçınmak için kesinlikle gerekmedikçe çekirdek hiç değişmez. Hafızanız sınırlıysa ve büyük dosyalar (örneğin HD video düzenleme) ile çalışıyorsanız, bunu 100'e yakın ayarlamak mantıklı olabilir.
Bugünlerde (2017), yeterli RAM’iniz varsa, hiçbir takas yapmamayı tercih ediyorum. Takas yapmamak, uzun süre çalışan masaüstü makinede genellikle 200-1000 MB RAM kaybeder. En kötü senaryo gecikmesini önlemek için bu kadarını feda etmeye razıyım (RAM dolduğunda uygulama kodunu değiştirerek). Uygulamada bu, OOM Katilinin değişmesini tercih ettiğim anlamına geliyor. Değişime izin verirseniz / ihtiyaç duyarsanız, /proc/sys/vm/watermark_scale_factor
biraz gecikmeyi önlemek için siz de artırmak isteyebilirsiniz . 100 ve 500 arasında değerler öneririm. Bu ayarı daha düşük takas gecikmesi için alım satım CPU kullanımı olarak düşünebilirsiniz. Varsayılan değer 10 ve mümkün olan maksimum değer 1000'dir. Daha yüksek değer ( çekirdek belgelerine göre ) kswapd
işlemler için daha yüksek CPU kullanımı ve daha düşük toplam takas gecikme süresi ile sonuçlanmalıdır .
Daha sonra, çekirdeğe, bazı RAM'lerin serbest bırakılması gerektiğine ilişkin olarak dizin hiyerarşisini bellekte dosya içeriği üzerinde tutmayı tercih etmesini söyleyin (yine de her şey RAM'e uyarsa bu ayar hiçbir şey yapmaz):
echo 10 > /proc/sys/vm/vfs_cache_pressure
Ayar vfs_cache_pressure
Düşük değer mantıklıdır, çünkü çoğu durumda çekirdeğin, dizin içeriğini önbellekten gelen dosya içeriğini kullanabilmesi için önce dizin yapısını bilmesi gerekir ve dizin önbelleğini çok kısa sürede temizler, dosya önbelleğini değersiz hale getirir. Çok sayıda küçük dosyanız varsa (sistemimde yaklaşık 150K 10 megapiksel fotoğraf vardır ve "çok sayıda küçük dosya" sistemi olarak sayılır) bu ayarda 1'e kadar inmeyi düşünün. Asla sıfıra ayarlamayın ya da sistem belleği yetersiz olsa bile, dizin yapısı daima bellekte tutulur. Bunu büyük bir değere ayarlamak, yalnızca sürekli olarak yeniden okunmakta olan birkaç büyük dosyanız varsa (yine de yeterli RAM olmadan HD video düzenlemesi örnek bir durum olacaktır). Resmi çekirdek belgelerine göre "
İstisna: gerçekten büyük miktarda dosya ve dizininiz varsa ve vfs_cache_pressure
100'den daha yüksek ayarlara sahip tüm dosyalara nadiren dokunuyorsanız / okuyorsanız / listeliyorsanız akıllıca olabilir. Bu, yalnızca yeterli RAM’iniz yoksa ve tüm dizin yapısını RAM’de tutamıyorsa ve normal dosya önbelleği ve işlemleri için hala yeterli RAM’e sahip değilse geçerlidir (örneğin, çok sayıda arşiv içeriğine sahip şirket genelinde dosya sunucusu). vfs_cache_pressure
100'ün üstüne çıkmanız gerektiğini düşünüyorsanız, yeterli RAM olmadan çalışıyorsunuz. Artırmak vfs_cache_pressure
yardımcı olabilir, ancak tek düzeltici daha fazla RAM elde etmektir. Sonra vfs_cache_pressure
yüksek sayıya ayarlayın (yani, gerçekten kötü kötü durum davranıştan kaçınmak ama kötü genel performansı ile uğraşmak zorunda olabilir olduğu) genel daha kararlı bir performansa sahip ortalama performansını feda eder.
Nihayet (için varsayılan yazıyor sürecini yavaşlatan önce RAM% 50'ye varan kullanmak çekirdek yazma için önbellek olarak RAM% 99 kadar kullanabilirsiniz ve talimat çekirdek anlatmak dirty_background_ratio
olduğunu 10
). Uyarı: Bunu şahsen yapmazdım ama yeterli RAM'e sahip olduğunuzu iddia ettiniz ve veriyi kaybetmeye hazırsınız.
echo 99 > /proc/sys/vm/dirty_ratio
echo 50 > /proc/sys/vm/dirty_background_ratio
Ve 1 saat yazma gecikmesinin bile diske bir şeyler yazmaya başlayabildiğini söyle (yine bunu yapmazdım):
echo 360000 > /proc/sys/vm/dirty_expire_centisecs
echo 360000 > /proc/sys/vm/dirty_writeback_centisecs
Hepsini koyarsanız /etc/rc.local
ve sonunda aşağıdakileri eklerseniz , her şey önyüklemeden sonra en kısa sürede önbellekte olur (yalnızca dosya sisteminiz RAM'e gerçekten uyuyorsa bunu yapın):
(nice find / -type f -and -not -path '/sys/*' -and -not -path '/proc/*' -print0 2>/dev/null | nice ionice -c 3 wc -l --files0-from - > /dev/null)&
Ya biraz daha basit bir alternatif olan daha iyi (cache sadece işe yarayabilecek /home
ve /usr
, eğer sadece bunu sizin /home
ve /usr
RAM içinde gerçekten fit):
(nice find /home /usr -type f -print0 | nice ionice -c 3 wc -l --files0-from - > /dev/null)&