Hızlı çoklu iş parçacıklı parsyncfp ile dosya kopyalama
Giriş
parsyncfp, aynı anda birden fazla rsync işlemi çalıştırarak büyük dosya koleksiyonlarının aktarımını hızlandıran, rsync etrafında paralel bir sarmalayıcıdır. Her işlem kendi dosya parçasını senkronize eder, böylece mevcut bant genişliği ve CPU, tek bir rsync akışına göre daha verimli kullanılır.
Bu kılavuz, parsyncfp'nin ne zaman yararlı olduğunu, nasıl kurulacağını ve iki sunucu arasında temel bir aktarımın nasıl çalıştırılacağını anlatır.
Paralel kopyalama yalnızca hızlı disklerde ve kararlı bir ağda aktarımları hızlandırır. Yavaş disklerde veya ağ üzerinden bağlanan dosya sistemlerinde (NFS, SMB, FUSE) paralel işlem sayısını artırmak çoğu zaman hız kazancı sağlamaz ve bunun yerine kaynağa, hedefe veya aralarındaki bağlantıya ek yük bindirebilir. Az sayıda işlemle başlayın, sonucu ölçün ve sayıyı yalnızca diskler ve ağ ayak uydurabiliyorsa artırın.
parsyncfp nasıl çalışır
parsyncfp, kaynak dosya ağacını yaklaşık olarak eşit boyutta parçalara bölmek için fpart yardımcı programını kullanır, ardından her parça için bir tane olmak üzere birden fazla rsync işlemini paralel olarak başlatır. fpart ağacı kademeli olarak böldüğünden, parsyncfp kaynak ağacın tam taraması tamamlanmadan önce dosyaları aktarmaya başlayabilir; bu da çok büyük dizin ağaçları için önemlidir.
Aracın yalnızca kaynak sunucuya kurulması gerekir. rsync alıcı tarafı her zamanki gibi yönetir.
Aynı yazar, parsyncfp'ye göre hata düzeltmeleri ve iyileştirmeler içeren ve ayrıca birden fazla kaynak ana bilgisayardan aynı anda göndermeyi destekleyen parsyncfp2 (pfp2) adlı bir halefi sürdürmektedir. Yeni dağıtımlar için parsyncfp2 önerilen seçimdir. Bu kılavuz klasik parsyncfp'yi kapsar; pfp2 komut sözdizimi büyük ölçüde uyumludur.
parsyncfp ne zaman yararlıdır
parsyncfp en büyük kazancı şu durumlarda sağlar:
- kaynak, rsync'in zamanının çoğunu gerçek veri aktarımı yerine meta veri işlemlerine harcadığı milyonlarca küçük dosya içeriyorsa;
- hem kaynak hem de hedef hızlı depolama (NVMe, SSD veya iyi yapılandırılmış bir RAID) ile destekleniyorsa;
- kaynak ve hedef arasındaki ağ hızlı ve kararlıysa (1 Gbps veya daha fazla, düşük paket kaybı);
- tek bir rsync işlemi disk veya bağlantı tarafından değil, CPU veya akış başına verimle sınırlıysa.
Küçük dizinler, yavaş döner diskler veya doygun bir ağ için genellikle düz rsync yeterlidir.
~/.parsyncfp dizini
parsyncfp, kaynak sunucuda ~/.parsyncfp adlı bir önbellek dizini oluşturur. İçinde, fpart günlüğünü, çalışan rsync işlemlerinin PID dosyalarını ve her rsync'in hangi yolları kopyalayacağını listeleyen parça dosyalarını içeren fpcache alt dizinini bulacaksınız. Günlük dosyaları tarih damgalıdır ve çalıştırmalar arasında üzerine yazılmaz, böylece önceki çalıştırmalar daha sonra incelenebilir.
Aynı anda birden fazla parsyncfp örneği çalıştırmak isterseniz, --altcache seçeneğiyle her birine ayrı bir önbellek konumu belirtin. parsyncfp, başlangıçta çalışan diğer örnekleri algılar ve onlar hakkında uyarır, böylece kazara çakışan çalıştırmalar erken görünür hale gelir.
Bağımlılıkların kurulumu
parsyncfp'nin kendisi rsync (taşıma) ve fpart'a (kaynak ağacını parçalara bölmek için) dayanır. Her ikisini de kaynak sunucuya kurun.
Debian ve Ubuntu'da:
apt-get install rsync fpart
RHEL, CentOS Stream, AlmaLinux ve Rocky Linux'ta fpart temel depolarda bulunmaz. Önce EPEL deposunu etkinleştirin, ardından her iki paketi de kurun:
dnf install epel-release dnf install rsync fpart
Bazı EPEL paketleri, varsayılan olarak devre dışı bırakılan PowerTools veya CRB deposundaki paketlere bağlıdır. Sürümünüz için doğru olanı etkinleştirin:
# RHEL/AlmaLinux/Rocky Linux 9 ve daha yenisi dnf config-manager --set-enabled crb # RHEL/AlmaLinux/Rocky Linux 8 dnf config-manager --set-enabled powertools
Dağıtımınız fpart'ı hiç sağlamıyorsa (örneğin, bu yazının yazıldığı sırada RHEL 10 veya yeniden derlemeleri) veya EPEL kullanmamayı tercih ediyorsanız, fpart'ı kaynaktan derleyin. Resmi depo GitHub'daki fpart deposudur; README, küçük bir derleme bağımlılığı kümesini listeler (bir C derleyicisi, make ve standart C kitaplık başlıkları).
parsyncfp kurulumu
parsyncfp, GitHub'da barındırılan tek bir Perl betiğidir. İndirin, çalıştırılabilir hale getirin ve tam yol yazmadan çağırabilmek için PATH'inizdeki bir dizine taşıyın:
wget https://raw.githubusercontent.com/hjmangalam/parsyncfp/master/parsyncfp chmod +x parsyncfp sudo mv parsyncfp /usr/local/bin/
Betiğin çalıştığını doğrulayın:
parsyncfp --help
Yardım ekranı görünürse, parsyncfp kullanıma hazırdır.
Hedefe SSH erişiminin ayarlanması
parsyncfp, rsync'i SSH üzerinden çalıştırır, bu nedenle kaynak sunucunun hedefe parolasız giriş yapabilmesi gerekir. Kaynakta bir anahtar çifti oluşturun (henüz yoksa) ve genel anahtarı hedefe kopyalayın:
ssh-keygen ssh-copy-id user@target_host
user@target_host'u kullanıcı adı ve hedef sunucunuzun IP'si veya ana bilgisayar adıyla değiştirin. Bu adımdan sonra, aşağıdaki komut parola istemeden bağlanmalıdır:
ssh user@target_host
Bir aktarımın çalıştırılması
Tipik bir parsyncfp komutu şöyle görünür:
parsyncfp --NP=8 --altcache=/dir/local/tmp --startdir=/dir/local/ www/ [email protected]:/var/dir/
Bu komut 8 rsync işlemi başlatır, /dir/local/tmp'yi önbellek dizini olarak kullanır ve /dir/local/www içeriğini hedef ana bilgisayar 192.168.67.1 üzerindeki /var/dir/'e kopyalar.
Kaynak argümanındaki sondaki eğik çizgiye dikkat edin: www/ www dizininin içeriğini hedefe kopyalar (yukarıdaki örnekteki gibi), www (eğik çizgi olmadan) ise www dizininin kendisini kopyalar ve hedefte /var/dir/www/ oluşturur. Bu, düz rsync ile aynı davranıştır.
Temel komut parametreleri
- --NP paralel rsync işlemlerinin sayısını ayarlar. Makul bir başlangıç noktası 4 ila 8'dir; sayıyı kademeli olarak ve yalnızca diskler ve ağ henüz doygun değilse artırın. --NP'yi CPU çekirdeği sayısına eşitlemek tek başına nadiren doğru seçimdir.
- --altcache alternatif bir önbellek dizini belirtir. Aynı anda birden fazla parsyncfp örneği çalıştırdığınızda veya varsayılan konum yavaş depolamada olduğunda yararlıdır. Çok büyük kaynak ağaçları için parça listeleri büyüyebileceğinden ve bunların RAM'i tüketmesini istemeyeceğinizden, tmpfs tabanlı bir konuma (birçok dağıtımdaki /tmp gibi) işaret etmekten kaçının.
- --startdir kendisinden sonra gelen kaynak yolları için temel olarak kullanılan çalışma dizinini ayarlar.
--startdir'den sonraki argümanlar kopyalanacak kaynak dizinlerdir (bir veya birkaç, boşlukla ayrılmış), ardından user@host:/path/ biçiminde rsync tarzı hedef gelir.
Seçeneklerin tam listesi için parsyncfp --help çalıştırın veya upstream belgelerine bakın.
Yararlı ek seçenekler
Temel aktarım çalıştıktan sonra, üretim çalıştırmaları için bilinmeye değer birkaç seçenek vardır:
- --maxbw=500000 tüm rsync işlemleri tarafından kullanılan toplam bant genişliğini KB/s cinsinden sınırlar. Bağlantı diğer hizmetlerle paylaşıldığında yararlıdır.
- --maxload=12 sistem yük ortalaması verilen değerin üzerine çıktığında yeni rsync işlemlerinin başlatılmasını duraklatır. Yoğun kaynak sunucularında yararlıdır, ancak kullanmadan önce aşağıdaki uyarıyı okuyun.
- --chunksize=5G her fpart parçasının ne kadar büyük olacağını kontrol eder. Daha büyük parçalar, çok sayıda küçük dosya içeren aktarımlarda parça başına ek yükü azaltır; daha küçük parçalar, birkaç çok büyük dosya içeren aktarımlarda paralelliği artırır.
- --rsyncopts="-a -s -x" ek bayrakları doğrudan alttaki rsync işlemlerine geçirmenize olanak tanır. Sıkıştırmayı (-z) etkinleştirmek, özel bir blok boyutu ayarlamak veya diğer rsync ayarlamalarını uygulamak için kullanın. --delete'i --rsyncopts aracılığıyla geçirmeyin; bunun neden güvenli olmadığı için aşağıdaki "Sınırlamalar" bölümüne bakın.
- --verbose=2 günlük ayrıntı düzeyini artırır, bu da ilk çalıştırmalarda sorun gidermeyi kolaylaştırır.
Upstream yazar, --maxload ile bilinen bir sorunu belgeledi: parsyncfp tekrarlayan askıya alma ve devam ettirme döngülerinden geçtiğinde, bazı kaynak dosyalar hedefe aktarılmayabilir. --maxload kullanıyorsanız, eşiği askıya almaların asla tetiklenmeyeceği kadar yüksek ayarlayın veya aktarım tamamlandıktan sonra sonucu ayrı bir tutarlılık kontrolüyle doğrulayın.
Sınırlamalar
Uygun donanımda bile, parsyncfp'nin işlem sayısını artırmadan önce bilinmeye değer ödünleşimleri vardır:
- parsyncfp, rsync'in --delete seçeneğini güvenli bir şekilde desteklemez. Her paralel rsync işlemi yalnızca kaynağın kendi parçasını görür, bu nedenle --delete geçirilirse, her işlem hedefte kendi parçasında olmayan dosyaları, yani meşru olarak diğer parçalara ait dosyaları silmeye çalışır. Bu, hedefin büyük kısımlarını silebilir. --delete anlamına ihtiyacınız olduğunda düz rsync (veya ayrı bir temizleme geçişi) kullanın.
- parsyncfp, paralel rsync işlemleri arasında dosyaların genel sıralamasını korumaz, bu nedenle dosyaların hedefte göründüğü sıra öngörülebilir değildir. Bu yalnızca, kopyalama sırasında dosya zaman damgalarına veya dizin listeleme sırasına bağlı iş akışları için önemlidir.
- HDD dizilerinde, çok sayıda paralel rsync işlemi, sıralı bir okuma deseni olacak şeyi neredeyse rastgele bir desene dönüştürür ki bu, tek bir rsync'ten daha yavaş olabilir. SSD ve NVMe sürücüleri çok daha az etkilenir.
- Çok sayıda küçük dosya içeren dosya sistemlerinde, dosya başına meta veri ek yükü aktarım süresine hakim olabilir. Paralellik bir noktaya kadar yardımcı olur, sonra platoya ulaşır.
- Her rsync işlemi hedefe kendi SSH bağlantısını açar, bu nedenle yüksek --NP değerleri bağlantı kurulum ek yükünü çoğaltır. Paket kaybı veya yüksek gecikme olan WAN bağlantılarında, bu durum tıkanıklığı iyileştirmek yerine kötüleştirebilir. Bu durumda, ayarlanmış bir rsync ile daha az işlem (sıkıştırma, daha büyük blok boyutu) genellikle çok sayıda paralel işlemden daha iyi performans gösterir.
Ayrıca bakınız
parsyncfp ihtiyacınızdan daha ağır geliyorsa, fpart paketi aynı yazardan daha basit bir paralel rsync sarmalayıcısı olan fpsync'i de içerir. Aynı parçalama fikrini kullanır ancak daha az seçenekle ve tek seferlik aktarımlar için genellikle yeterlidir.