Nfs yerine yerel çalışan rm -rf kullanmak daha iyi?


10

Dizin rm -rfüzerinde bir dizin yapmadan önce dizini içeren makinede oturum açmak çok zaman fark eder mi , yoksa sadece rm -rfNFS üzerinden dizin mi?

Yanıtlar:


11

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:

  1. senin rmkomut verir unlink()syscall
  2. nfs sürücüsü bir sunrpc isteğine dönüştürür, nfs sunucusuna gönderir
  3. nfs sunucunun bir bu sunrpc isteği geri çevirir unlink()çağrısı
  4. bu unlink()çağrıyı uzak tarafta yapar
  5. başarılı olduktan sonra, istemciye "tamam, bitti" eşdeğer rpc yanıt iletisi verir
  6. istemci tarafındaki çekirdek sürücüsü bunu unlink()orijinalinizin çağrısının çıkış koduna 0 dönüştürürrm
  7. rm sonraki dosyaya yineliyor, git 1

Şimdi önemli olan şey 2-7 arasında rmbeklemek 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:

  1. İlk önce dizini farklı bir isme taşıyın ( mv -vf oldfilms oldfilms-)
  2. Arka planda sil ( 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 :

  • bunun bir dosya veya dizin ( lstat()syscall ile) olup olmadığını belirlemek için ,
  • sonra buna göre yapın. Sıradan dosyalar 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().
  • Son olarak, bir readdir()çağrı ile bir sonraki dizin girdisine yineleyin .

Bu, dosyalar için 3 nfs RPC komutu ve dizinler için ek 3 gerektirir.


2
Nfs durumu daha da kötü. Soru -rişaret ettikçe , rmönce dosyanın bir dizin olup olmadığını kontrol etmek ( lstatnfs aracılığıyla), açmak ( opendirnfs aracılığıyla), içeriğini okumak ( readdirnfs 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 ( closedirnfs aracılığıyla) ve sonra bulunan her dizin için yineleyin.
el.pescado

5

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
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.