Harici depolama sürücüsünde (USB bağlantılı, fuseblk türü) 50 GB dosyayla neden yavaş?


21

Yedekleme yapmak için rsnapshot kullanmaya çalışıyorum , ama kullanılamaz buluyorum. Bir dizini (50 gb) dağıtabilir ve birkaç dakikada kopyalayabilir (her dosyayı sabitleyen) ve tüm dizini yaklaşık yarım saat içinde cp edebilirken, silinmesi bir saatten fazla sürer. Doğrudan kullanıyor rm -rfvolsam bile , tek bir dosyayı kopyalamak için yarım saniye kadar sürebilir, oysa cpve linkkomutları anında tamamlanır.

Rm neden bu kadar yavaş? Sabit bağlantıları tekrar tekrar kaldırmak için daha hızlı bir yol var mı? Bana bir dosyanın kopyalanmasının kaldırılmasından daha az zaman alması anlamsız geliyor.

Üzerinde çalıştığım dosya sistemi, usb ve type fuseblk (yani ntfs demek oluyor) ile bağlanan harici bir depolama sürücüsüdür. Bilgisayarım ubuntu linux kullanıyor.

Üstten çıkış:

Cpu(s):  3.0%us,  1.5%sy,  0.0%ni, 54.8%id, 40.6%wa,  0.0%hi,  0.1%si,  0.0%st
Mem:   8063700k total,  3602416k used,  4461284k free,   557604k buffers

1
Monte edildiğinde fuseblksürücünün NTFS olduğu anlamına gelmez, sadece bir FUSE blok cihazı olarak monte edildiği anlamına gelir. Bu neredeyse her şey olabilir.
Chris Down

1
@ChrisDown Doğru, ancak bunun NTFS veya ext3 olduğunu biliyorum ve ext3 olup olmadığına, hiçbir argüman olmadan mount olarak monte edileceğinden eminim.
Benubird

1
Dizinde kaç tane dosya bulunduğuna (ne kadarını söylemediğini söylemedi) ve özellikle NTFS dizinde sadece> 3K dosyaları ile yavaşladığına bağlı. Hemen hemen her diğer dosya sistemi çok daha başarılı. Dosya sayısının dosya sistemi performansı üzerindeki etkisi hakkında SO / SE hakkındaki diğer tüm mesajlara bakın.
smci

Yanıtlar:


28

Sonuçta, ne olursa olsun, ne yapmak rmçalıştırmak zorundadır unlink(eğer çağrı bile kaldırmak istediğinizi her tek dosyada rm -rüst dizini üzerinde). Kaldırılacak çok sayıda dosya varsa, bu uzun zaman alabilir.

Çalıştığınızda özellikle zaman alıcı iki işlem vardır rm -r:

  1. readdir, bunu takiben,
  2. bir dizi arama unlink.

Tüm dosyaları bulmak ve daha sonra bunları silmek için her bir dosyadan geçmek gerçekten çok uzun zaman alabilir.

Bunu "kullanılamaz" olarak buluyorsanız, dizini bir süre kullanılamaz duruma getirdiğinden, kaldırmadan önce ana dizini taşımayı düşünün. Bu, zamanın fazla sıkıntı yaşamadan programın tekrar kullanması için bu adı serbest bırakacaktır.

Dosya sistemi gerçekten varsayarsak olan NTFS (sizin sorudan belirsiz), NTFS dosya büyük sargılarını silme oldukça yavaş genellikle. Amaçlarınız için daha uygun bir dosya sistemi kullanmayı düşünebilirsiniz (daha yeni ext dosya sistemlerinin başka herhangi bir özel gereksiniminiz yoksa silme performansı oldukça iyidir). FUSE'in kendisi de genel olarak hızlı değildir. Bunu FUSE kullanmayan bir şekilde yapıp yapamayacağınızı görmeyi düşünebilirsiniz.


2
+1 Gerçekten birçoğu tam dosya sistemine bağlıdır - birçoğu diğerleriyle uyuşmazken bazı işlemler için gerçekten iyi performans gösterme eğilimindedir (genellikle bu, dosya oluşturma ve kaldırma ile veri erişimi içindir).
Peterph

15

Rm neden bu kadar yavaş? Hiç bir fikrim yok. Ama daha hızlı bir yol biliyorum:

mkdir blank
rsync -a --delete blank/ test/

Güncelleme: Serverfault'daki bu cevabın bazı açıklamaları var. Görünüşe göre rsync, dosyaları, dosya sistemi ağacının dengeli kalmasına ve hiç bir zaman yeniden dengelenmesine gerek kalmamasına neden olan belirli bir sırada siler. rm sadece dosyaları siler ve kaldırıldıkça çok fazla dengelemeye neden olur. Burada yeniden dengeleme hakkında bazı bilgiler var .


1
Bunu karşılaştırıp karşılaştırdın mı rm -rf? rsynchala unlink()tüm dosyalar test/içeriyor ve muhtemelen bu zaman alıyor.
MattBianco

Resmen kıyaslama yapmadım, ama başkasının kriterlerini okuduktan sonra denedim ve aradaki fark önemliydi. Bu gönderiyi daha fazla bulamıyorum, ancak serverfault'daki bu cevabın daha hızlı bir silme programı için bir açıklaması ve kaynağı var.
rjmunro

Ama en hızlı yöntem unlink(2)dizinde olmalı (ve fsckdaha sonra yapmayı hatırlamakta ) ...
MattBianco

Gerçek, gerçek. Sadece zaman aşımına uğradı ve neredeyse iki kat daha hızlı. GNU coreutils rm kodunu okuduktan sonra, merak etmemi bile sağlamaz…
Dominik George

1

Bir zamanlar seninkine benzer bir problemim vardı. "Wa" nın yüksek olduğunu buldum, kullanabilirsin

iostat -x 1

Disk kullanımınızın yüksek olup olmadığını kontrol etmek için, eğer öyleyse, diskiniz oldukça meşgul demektir. Bazı olmadığını kontrol edin , diğer süreçler sürekli diske yazıyoruz.

Basitlik için

vmstat 1

b'nin yüksek veya r < b olduğunu kontrol etmek için . Bu yanlış bir şey olduğunu gösterir. Senin durumunda, diskin orijinal nedeni olduğunu düşünüyorum.

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.