Yerel disk okumalarıyla aynı anda Linux'un ağ dosya sistemine yazmasını sağlama


17

özet

Linux'u hem yerel disk / dosya sisteminden okuyacak hem de ağ üzerinden veri paylaşmıyorken okumak yerine, aynı zamanda bir ağ paylaşımına yazacak ve ardından yerel disk açıkken bu verileri ağ üzerinden gönderecek şekilde nasıl yapılandırabilirsiniz Boşta?

Sadece bir işlemi, sonra diğerini dönüşümlü olarak yapmak yerine, aynı anda okumak ve yazmak çok daha hızlıdır.

ayrıntılar

Bir Linux makinesindeki yerel disklerden büyük miktarda veriyi NAS cihazına taşıyorum.

rsyncTemelde /srv/dataiçine kopyalamak için kullanıyorum /mnt/nas, bu bir CIFS montaj.

İyi başladı, 100MB / sn'de okuma ve NAS'a 100MB / sn'de (gigabit ağının sınırı) yazma, hem okuma hem de yazma aynı anda gerçekleşiyor.

Ancak şimdi, birkaç saat sonra, yerel diskten okuduğunu, daha sonra NAS'a yazarken okumayı durdurduğunu görüyorum, daha sonra NAS'a yazmak için daha fazla veri olmadığında, diskten okumaya devam ediyor tekrar. Disk okunurken ağ boşta ve ağ kullanımdayken disk boşta.

Söylemeye gerek yok, 200MB okumak ve 200MB yazmak aynı anda 200MB okumak ve yazmaktan çok daha uzun sürer.

Çekirdeği, okuma ve yazma arasında geçiş yapmak yerine bir seferde yalnızca bir işlem yapmak yerine önceki okuma ve yazma davranışına yapışacak şekilde nasıl yapılandırabilirim?

Bazı gözlemler: Yerel disk 100 + MB / sn'de okuduğunda, her şey paralel olarak iyi görünüyor, ancak disk yavaşladığında (bir nedenden dolayı şimdi sadece 20 MB / sn'de gidiyor gibi görünüyor) bu okuma / yazma anahtarlama gerçekleşiyor gibi görünüyor.

Ayrıca, syncher iki saniyede bir manuel olarak çalıştırabilir , ancak okumalara paralel olarak gerçekleşmesini sağlamak için (açıkça düşük hızlarda olsa da), ancak her beş saniyede bir çalışacak şekilde syncbir whiledöngü koymak doğru çözüm gibi görünmüyor ...

Çekirdek yaklaşık 1GB veri önbelleğe alıyor ve daha sonra mümkün olduğunca hızlı bir şekilde ağ üzerinden yazıyor gibi görünüyor - bu iyi - sadece veri gönderilirken yavaş diskin okunmayı neden durdurması gerektiğini anlamıyorum. ağ.


1
Çoğu unix aracı, bu anlamda bant genişliği için kesinlikle optimize edilmemiştir, rsync değil, basit bir cp bile değildir. Bunlar, engelleme G / Ç kullanan tek iş parçacıklı uygulamalardır.
peterh - Monica

1
Tamamen sıralı iş yüklerinde modern ortak 7200 rpm dönme sabit disk sürücülerinde 100 MB / s civarında bir yerde beklediğiniz şey de budur. Aramaya başladığınızda, örneğin meta verileri güncellemek veya dosya sistemi parçalanmışsa, aşağı iner, çünkü daha sonra IOPS'a bağlı olursunuz.
CVn

NAS'a rsync kurabilir misiniz?
Jasen

Yanıtlar:


27

Biraz daha araştırma yapıldıktan sonra, bu konunun çekirdekle daha az ilişkili olduğu rsyncve CIFS'in nasıl ve nasıl etkileşimde bulunduğu hakkında daha fazla olduğu anlaşılıyor .

Yapabildiğim kadarıyla rsync, hedef dosya kapatıldığında, CIFS (ve muhtemelen herhangi bir ağ dosya sistemi), closesistem çağrısı dönmeden önce dosyanın tamamen temizlenmesini ve uzak diske yazılmasını sağlar . Bu, kapatma işlemi başarıyla tamamlandıktan sonra dosyanın tamamen kaydedildiğinden ve veri kaybına neden olabilecek başka hata riski olmadığından emin olmak içindir.

Bu yapılmadıysa, bir uygulamanın bir dosyayı kapatması, kaydetme işleminin başarılı olduğunu düşünerek çıkması daha sonra mümkün olabilir, daha sonra (belki de bir ağ sorunu nedeniyle) veriler sonuçta yazılamadı, ancak o zamana kadar uygulamanın dosya hakkında başka bir yere kaydetmek isteyip istemediğini sormak gibi bir şey yapması için çok geç.

Bu gereksinim, rsyncbir dosyayı kopyalamayı her bitirdiğinde rsync, bir sonraki dosyayı okumaya devam edebilmek için tüm disk arabelleğinin ağ üzerinden boşalması gerektiği anlamına gelir .

Çözüm, CIFS paylaşımını cache=nonebu özelliği devre dışı bırakan seçeneğe bağlamak ve tüm G / Ç'nin sunucuya doğrudan gitmesine neden olmaktır. Bu, sorunu ortadan kaldırır ve okuma ve yazma işlemlerinin paralel olarak yürütülmesine izin verir, ancak bu çözümün bir dezavantajı, performansın biraz daha düşük olmasıdır. Benim durumumda, ağ aktarım hızı 110MB / sn'den 80MB / sn'ye düşüyor.

Bu, büyük dosyaları kopyalıyorsanız, değişen okuma / yazma davranışıyla performansın daha iyi olabileceği anlamına gelebilir. Birçok küçük dosyada, önbelleğin devre dışı bırakılması, bir dosya her kapatıldığında önbelleğin daha az temizlenmesine neden olur, böylece performans artabilir.

rsyncDosya tanıtıcılarını başka bir iş parçacığında kapatmak için bir seçeneğe ihtiyaç duyduğu anlaşılıyor , böylece son dosya hala temizlenirken bir sonraki dosyayı okumaya başlayabilir.

DÜZENLEME: Çok cache=nonesayıda küçük dosyayı (10MB / saniyeden 80MB / saniyeye kadar) aktarırken kesinlikle yardımcı olduğunu onayladım, ancak büyük dosyaları (1GB +) cache=noneaktarırken aktarımı 110MB / saniyeden aynı 80MB / saniyeye düşürüyor. Bu, birçok küçük dosyadan yavaş aktarımın kaynak disk aramasıyla ilgili daha az olduğunu ve tüm küçük dosyalardan çok fazla önbellek temizlemesiyle ilgili olduğunu gösterir.


2
Bu çok ilginç bir sorun ve açıklamayı gönderdiğiniz için teşekkürler. rsyncgelmez okumak biri kopyalama onu bu kadar tasarlanmış çünkü (aslında, farklı proses) farklı bir iş parçacığı dosyayı rsyncaynı tarafta sizin durumunuzda her iki kopya olmasına rağmen, ağın her iki tarafında çalışan (ve dosya sistemi saklıyor bir ağ olduğu gerçeği). Sanırım bu yardımcı olmuyor, çünkü yazar süreci engelleme yaparken okuyucu süreci çok hızlı bir şekilde boruyu dolduruyor close(). tel üzerinde rsynckullanıyorsanız rsync, CIFS yerine daha iyi performans gösterecektir .
Celada

1
Başka bir çözüm, rsyncNAS rsyncüzerinde rsync -a files localhost:/dest/pathçalışamayacağınızı düşünürsünüz, ağ bağlantılarına bir şekilde yapay olarak büyük bir tampon (en azından çok megabayt gibi ) sunarken ağ üzerinden (gibi ) kullanmak olacaktır . Bunu yapmak için en iyi kesmek neye benzeyeceğinden emin değilim.
Celada

@Celada: Teşekkürler! Evet rsync, NAS kutusunun üzerinde çalışmanın da sorunu çözeceğini düşünüyorum. Biraz daha karmaşık olsa da (garip NAS izinleri, sembolik bağlantıları bırakmak zorunda vb.) Ama kopyalamak için biraz daha fazla verim olsaydı, bunu yapmak için zaman yatırımına değer olurdu.
Malvineous

2
Muhtemelen sizin durumunuzla ilgisiz: Birkaç yıl önce dump(8)NFS üzerine monte edilmiş bir NAS'ın çıktısını yazarken benzer bir sorun yaşadım . NFS sunucusunun ve NAS üzerinde çalışan bir güvenlik duvarının birleşik etkisi nedeniyle, sorunu NAS'ta CPU'yu en üst düzeye çıkarmak olarak teşhis ettim (kutu köklenmedi ve güvenlik duvarı tamamen devre dışı bırakılamadı) web arayüzü). NAS'ı eski bir bilgisayarla değiştirdiğimizde sorun ortadan kalktı. FWIW.
Satō Katsura

@SatoKatsura: Kesinlikle daha eski NAS cihazları için bir olasılık, ancak bu durumda böyle bir patlamadan ziyade daha yavaş bir genel transfer göreceğinizi hayal ediyorum? NAS'ım, jumbo çerçeveler olmadan bir gigabit NIC'yi maksimuma çıkarırken yaklaşık% 30 CPU kullanımında oturan çift çekirdekli bir Atom'dur (~ 2GHz).
Malvineous
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.