Yanıtlar:
Elbette ssh daha iyidir.
Nfs, çeşitli uzaktan yordam çağrıları ve veri senkronizasyonu bekleme süreleri ile karmaşık bir ağ protokolü kullanır. Ssh durumunda bunlar geçerli değildir.
Ayrıca, birçok kilit var. Nfs'deki dosya silme şu şekilde çalışır:
rm
komut verir unlink()
syscallunlink()
çağrısıunlink()
çağrıyı uzak tarafta yaparunlink()
orijinalinizin çağrısının çıkış koduna 0 dönüştürürrm
rm
sonraki dosyaya yineliyor, git 1Şimdi önemli olan şey 2-7 arasında rm
beklemek zorunda. Bir sonraki unlink()
çağrıyı eşzamansız olarak gönderebilir , ancak olay odaklı değil, tek iş parçacıklı bir araçtır. Olsa bile, yine de zor nfs mount bayrakları gerektirir. Sonucu elde edene kadar bekler.
Nfs - ve herhangi bir ağ dosya sistemi - her zaman çok daha yavaştır.
Çoğu durumda, bir hile ile yinelenen silme işlemlerini yarı sonsuz hızda yapabilirsiniz:
mv -vf oldfilms oldfilms-
)rm -rf oldfilms- &
)Pek çok (ama hepsi değil) yönden, bu dizin kaldırma pratikte sıfır zaman olmuş gibi görünecektir.
Uzantı: @ el.pascado mükemmel yorumunda bahsedildiği gibi, aslında 2-7'nin herhangi bir dosya için 3x çalıştırması gerekiyor :
lstat()
syscall ile) olup olmadığını belirlemek için ,unlink()
söz konusu olduğunda, dizinler söz konusu olduğunda, içindeki opendir()
tüm dosyaları / dizinleri özyinelemeli olarak silmek closedir()
, nihayetinde rmdir()
.readdir()
çağrı ile bir sonraki dizin girdisine yineleyin .Bu, dosyalar için 3 nfs RPC komutu ve dizinler için ek 3 gerektirir.
Evet. Pekala belki. Değişir. Az sayıda dosya ve dizin için çok fazla fark olmaz.
NFS bağlantılı bir dizinde toplu olarak dosya işlemi yapmak yavaştır. NFS sunucusunun kendisinde oturum açma ve bunları gerçek dizinde yapma fırsatınız varsa, bu daha hızlı olur.
CVS'den teslim aldığım ve NFS üzerinden bağladığım OpenBSD bağlantı noktaları koleksiyonunu kaldırarak test edelim:
NFS sunucusunda:
$ cd /export/shared/ports
$ du -hs .
2.6G .
$ find . | wc -l
179688
$ time rm -rf /export/shared/ports/*
0m20.87s real 0m00.12s user 0m04.62s system
İstemcide (orijinal dosyaları yedeklemeden geri yükledikten sonra):
$ time rm -rf /usr/ports/*
6m49.73s real 0m01.55s user 1m08.96s system
-r
işaret ettikçe ,rm
önce dosyanın bir dizin olup olmadığını kontrol etmek (lstat
nfs aracılığıyla), açmak (opendir
nfs aracılığıyla), içeriğini okumak (readdir
nfs aracılığıyla) ve ancak daha sonra içinde bulunan her dosyada yanıtta açıklandığı gibi gerçek silme işlemini gerçekleştirmek ve alt dizinlere yineleniyorsa, dizini kapatın (closedir
nfs aracılığıyla) ve sonra bulunan her dizin için yineleyin.