10M + dosyalarını ZFS'den etkili bir şekilde silin


30

Yanlışlıkla / tmp altında 30M dosyaları hakkında oluşturulan bir buggy programı yazdım. (Hata birkaç hafta önce tanıtıldı ve saniyede birkaç alt dizin oluşturuyordu.) / Tmp / / tmp2 adını değiştirebilirim ve şimdi dosyaları silmem gerekiyor. Sistem FreeBSD 10, kök dosya sistemi zfs.

Bu sırada aynadaki sürücülerden biri yanlış gitti ve ben de değiştirdim. Sürücüde iki adet 120GB SSD disk var.

İşte soru: sabit sürücüyü değiştirmek ve tüm diziyi geri döndürmek bir saatten az sürdü. Dosyaları silmek / tmp2 başka bir hikaye. Dosyaları kaldırmak için başka bir program yazdım ve yalnızca saniyede 30-70 alt dizini silebilir. Tüm dosyaları silmek 2-4 gün sürer.

Dizinin tamamını geri çağırmanın bir saat sürmesi, ancak diskten silinmesinin 4 gün sürmesi nasıl mümkün olabilir? Neden bu kadar kötü performans gösteriyorum? 70 silme / saniye çok kötü bir performans gösteriyor.

/ Tmp2 için inode komutunu manuel olarak silebilirim, ancak bu alanı boşaltamaz, değil mi?

Bu, zfs veya sabit disklerle ilgili bir sorun olabilir mi?


1
Ben bir zfs uzmanı değilim, bu nedenle performans ayarlarınızla veya bunu geliştirmek için neler yapabileceğinizle ilgili konuşamıyorum (bu aynı zamanda çok fazla bilgi alır ve muhtemelen doğrudan bir uzman tarafından yapılabilir). Ancak, silme işleminiz dosya sistemi düzeyinde gerçekleşirken kurtarma işleminin blok düzeyinde olduğunu söyleyebilirim. Böyle bir bagillion inode tamponunu silerken dosya sistemi çoğunlukla ek yüke sahip olacaktır.
Biriktirici

Lütfen mesajınızı gönderin df -hve zpool listve zfs list.
ewwhite

5
Başka bir program yazıldı: rm -rf /tmp2işi yapmaz mı?
Thorbjørn Ravn Andersen

2
Sadece yeniden başlatılamaz mısın? /tmpBir tmpfsdosya sistemi olmalı ve bellekte saklanmalıdır.
Blender

Yanıtlar:


31

ZFS'deki silmeler pahalıdır. Daha da ötesi, dosya sisteminde etkin veri tekilleştirme etkinse (veri tekilleştirme işleminin pahalı olması nedeniyle). Anlık görüntüler de sorunları karmaşıklaştırabilir.

İçinde /tmpbulunan veriler yerine dizini silmekten daha iyi olabilirsiniz .

Eğer /tmpbir ZFS dosya sistemi ise, silin ve tekrar oluşturun.


1
@ nagylzs Bu durumda, ayrı bir ZFS dosya sistemi olmasını öneririm. Ardından akım / tmp'yi yoldan çıkarabilir, yeni / tmp'yi yerine taşıyabilir ve dosyaları sistemin boş zamanlarında silebilirsiniz. Sonuç: en az aksama süresi ve hafif bir performans bozulması (Silme işlemi devam ioniceederken FreeBSD'nin var olduğunu varsayarsak).
bir CVn

9
Ben hatalıydım. Ayrı bir dosya sistemiydi. İşte ne işe yaradı: tek kullanıcı moduna yeniden başlatın, sonra "zfs delete zroot / tmp; zfs create zroot / tmp; chmod 41777 / tmp" yapın
nagylzs

6
Toplam kesinti 5 dakika oldu. Fantastik! :-)
nagylzs

1
Bu da benim endişemden bahseder, fikirleri silmenin anlık görüntüler yüzünden hiç yer boşaltmaması. Ancak, tmp otomatik periyodik anlık görüntüler oluşturmayacak şekilde ayarlanacaktır, değil mi?
JDługosz

1
Aslında bu şuydu: zfs create -o kompresyon = on -o exec = on -o setuid = kapalı zroot / tmp; chmod 1777 / zroot / tmp; zfs mountpoint = / tmp ayarla zroot / tmp; Yine de otomatik fotoğrafların nasıl kapatılacağından emin değilim. "Zfs set com.sun: auto-snapshot = false" var ama bu sadece solarislerde çalışıyor.
nagylzs,

27

Dizinin tamamını geri çağırmanın bir saat sürmesi, ancak diskten silinmesinin 4 gün sürmesi nasıl mümkün olabilir?

Bir ofis binası düşünün.

Tüm bilgisayarların ve mobilyaların ve tüm döşemelerdeki tüm ofislerin donanımlarının çıkarılması uzun zaman alıyor ancak ofisleri başka bir müşteri tarafından hemen kullanılabilir durumda bırakıyor.

Tüm binayı RDX ile yıkmak çok daha hızlı, ancak bir sonraki müşterinin mekanın ne kadar kaba olduğu konusunda şikayet etmesi oldukça muhtemel.


5
ZFS bir ofis binası değil :)
developerbmw

9
@developerbmw aslında orada bir dosya veya klasör de yoktur, ancak neler olduğunu anlamak için metaforik kavramlara ihtiyacımız vardır.
JamesRyan

2
@JamesRyan evet aslında güzel bir benzetme ... Ben sadece aptallık yapıyordum
developerbmw

5

Burada bir şeyler oluyor.

İlk olarak, tüm modern disk teknolojileri toplu aktarımlar için optimize edilmiştir. 100 MB'lık veriyi taşımanız gerekirse, her yere dağılmış yerine tek bir bitişik bloktalarsa, çok daha hızlı bir şekilde yapacaktır. SSD'ler burada çok yardımcı oluyorlar, ancak bitişik bloklardaki verileri bile tercih ediyorlar.

İkincisi, yeniden başlatma, disk işlemleri yapıldığında oldukça uygundur. Bir diskten devasa bitişik bir veri yığını okudunuz, bazı hızlı CPU işlemleri yapıyorsunuz, sonra başka bir büyük bitişik öbek içine başka bir diske yeniden yazıyorsunuz. Eğer güç yarı yolda kalırsa, önemli bir şey olmaz - sadece kötü sağlama toplamı olan verileri görmezden gelirsiniz ve normal başına devam edersiniz.

Üçüncüsü, bir dosyayı silmek gerçekten yavaştır . ZFS özellikle kötü, ancak pratik olarak tüm dosya sistemlerini silmek yavaş. Diskteki çok sayıda farklı veri topluluğunu değiştirmeleri ve doğru bir şekilde zamanlamaları gerekir (yani bekleyin), böylece güç kesilirse dosya sistemi zarar görmez.

Dizinin tamamını geri çağırmanın bir saat sürmesi, ancak diskten silinmesinin 4 gün sürmesi nasıl mümkün olabilir?

Resilvering, disklerin gerçekten hızlı olduğu ve silme işleminin yavaş olduğu bir şeydir. Diskin megabayt başına sadece biraz resilvering yapmak zorunda. Bu alanda silinmesi gereken binlerce dosya olabilir.

70 silme / saniye çok kötü performans gösteriyor

Değişir. Buna şaşırmam. Ne tür bir SSD kullandığınızı söylemediniz. Modern Intel ve Samsung SSD'ler bu tür işlemlerde oldukça iyidir (okuma-değiştirme-yazma) ve daha iyi performans gösterirler. Daha ucuz / daha eski SSD'ler (örneğin Corsair) yavaş olacaktır. Saniyedeki G / Ç işlemlerinin sayısı (IOPS) burada belirleyici faktördür.

ZFS bir şeyleri silmek için özellikle yavaştır. Normalde, arka planda silme işlemi gerçekleştirir, böylece gecikmeyi görmezsiniz. Çok sayıda yapıyorsanız, gizleyemez ve sizi geciktirmek zorundadır.


Ek: neden silmeler yavaş?

  • Bir dosyayı silmek birkaç adım gerektirir. Dosya meta verileri 'silindi' olarak işaretlenmeli ve sonunda yeniden kullanılıp yeniden kullanılması gerekir, böylece alan yeniden kullanılabilir. ZFS, yalnızca bir şey oluşturduğunuzda, hiçbir zaman silmemeniz durumunda en iyi performansı gösteren bir "günlük yapılı dosya sistemidir". Günlük yapısı, bir şeyi silerseniz, günlükte bir boşluk olduğu ve bu nedenle boşluğu doldurmak için diğer verilerin yeniden düzenlenmesi (birleştirilmesi) anlamına gelir. Bu kullanıcı için görünmez ancak genel olarak yavaştır.
  • Değişiklikler, güç yarı yolda başarısız olursa, dosya sistemi tutarlı kalacak şekilde yapılmalıdır. Genellikle, bu, diskin gerçekten medyanın üzerinde olduğunu onaylayana kadar beklemek anlamına gelir; Bir SSD için bu uzun zaman alabilir (yüzlerce milisaniye). Bunun net etkisi, çok daha fazla defter tutma (disk g / Ç işlemleri) olmasıdır.
  • Tüm değişiklikler küçük. Tüm flaş bloklarını (veya manyetik disk için silindirleri) okumak, yazmak ve silmek yerine, bir tanesini biraz değiştirmeniz gerekir. Bunu yapmak için, donanım bir blok veya silindirde okumalı, bellekte değiştirmeli, sonra tekrar medyaya yazmalıdır. Bu uzun zaman alıyor.

ZFS'yi bilmiyorum, ancak bazı dosya sistemleri bir dizinin içeriğiyle bağlantısını kaldırmanıza izin veriyor, ancak bu içeriğin daha sonra bir çöp toplama / defrag / temizleme aşaması sırasında kaldırılmasını sağlar. ZFS'nin belki de böyle tembel bir silme yapmak için herhangi bir aracı var mı? Aslında OP'nin silmesini hızlandırmayacak, ancak temizlik sırasında dolaylı olarak gerçekleşmesi durumunda büyük olasılıkla daha az sorun yaratacaktır.
Vality,

2

Dizinin tamamını geri çağırmanın bir saat sürmesi, ancak diskten silinmesinin 4 gün sürmesi nasıl mümkün olabilir?

İki işlem dosya sistemi yığınının farklı katmanlarında çalıştığı için mümkündür. Resilvering düşük seviyede çalışabilir ve bir seferde büyük miktarda veriyi kopyalayarak tek tek dosyalara bakmak zorunda kalmaz.

Neden bu kadar kötü performans gösteriyorum? 70 silme / saniye çok kötü bir performans gösteriyor.

Çok fazla defter tutma yapmak zorunda ...

/ Tmp2 için inode komutunu manuel olarak silebilirim, ancak bu alanı boşaltamaz, değil mi?

ZFS'yi bilmiyorum, ancak bu durumdan otomatik olarak kurtulabilseydi, muhtemelen arka planda zaten yaptığınız işlemleri yapardı.

Bu, zfs veya sabit disklerle ilgili bir sorun olabilir mi?

Bir zfs scrubşey söyledi mi?


2

Çok sayıda dosyayı silmek hiçbir zaman gerçekten hızlı bir işlem değildir.

Bir dosyayı silmek için herhangi dosya sistemi, dosya dizini, kaldır (veya silinmiş olarak işareti) endeksinde dosya girişi okuması gerekmektedir, dosya olarak tahsis alanı dosya ile ilişkili diğer meta verileri kaldırmak ve işaretlemek kullanılmayan. Bu, silinecek her dosya için ayrı ayrı yapılmalıdır, bu da çok sayıda dosyayı silmek için çok sayıda küçük G / Ç gerektirir. Bunu, elektrik kesintisi durumunda veri bütünlüğünü sağlayacak şekilde yapmak daha da ek yük sağlar.

ZFS'nin getirdiği özellikler olmadan bile, 30 milyon dosyayı silmek, genellikle yüz milyondan fazla ayrı G / Ç işlemi anlamına gelir. Bu olacak hatta hızlı SSD ile uzun zaman alabilir. Diğerlerinin de belirttiği gibi, ZFS'nin tasarımı bu konuyu daha da güçlendirir.


2

Ian Howson neden yavaş olduğu konusunda iyi bir cevap veriyor.

Paralel olarak dosyaları silerseniz, silme aynı blokları kullanabileceği için hızda bir artış görebilirsiniz ve böylece aynı bloğu tekrar yazmaktan tasarruf edebilirsiniz.

O zaman dene:

find /tmp -print0 | parallel -j100 -0 -n100 rm

ve saniyede 70 silme işleminden daha iyi performans gösterip göstermediğine bakın.


0

Düşüncenizi tersine çevirirseniz çok basit.

  1. İkinci bir sürüş al (zaten buna sahipsin)

  2. / Tmp dizini hariç olmak üzere A sürücüsündeki B sürücüsüne rsync ile her şeyi kopyalayın. Rsync, blok kopyadan daha yavaş olacaktır.

  3. B sürücüsünü yeni önyükleme birimi olarak kullanarak yeniden başlatın

  4. A sürücüsünü yeniden biçimlendirin.

Bu aynı zamanda sürücünüzü birleştirecek ve size yeni bir dizin verecektir (para cezası, birleştirme bir SSD ile çok önemli değildir ancak dosyalarınızı doğrusallaştırmak hiçbir zaman zarar vermez)


Öncelikle / tmp dışındaki her şeyi kopyala. Yani / dev ve / proc dahil mi? İkincisi, özellikle bir prodüksiyon sunucusunda bana biraz ağır geliyor.
Hennes,

Birçoğunun burada tahmin edilemeyeceği, dosyaları olmayan dosyaları, takılmış birimleri ve sanal bellek klasörünü dışlayacak kadar zeki olduğunu varsayıyorum. Ya da bunların hiçbirinin önemli olmadığı bir bakım botundan yapın.
Peter,

Ayrıca zfs send/recv, kök dosya sistemi (bu durumda / tmp bulunduğu yerde) dışındaki diğer tüm dosya sistemlerini de (blok düzeyinde kopyalayabilir) ve kök dosya sistemi üzerinde kalan verileri manuel olarak (elbette / tmp hariç) kopyalayabileceğinizi düşünüyorum.
user121391 5:16

2
Bu, anlık görüntüleri kaybedecek ve bazı güvenilirlik özelliklerini atlayacaktır. Zfs kullanma noktasını özlüyor.
JDługosz

2
@ JDługosz geçerli noktaları, ancak yalnızca kullanıcının umurunda olması durumunda geçerlidir. "Yedeklemelerim bozuk, nasıl onarılır?" -> "Herhangi bir yedekleme dosyasına ihtiyacınız var mı?" -> "Hayır" -> "Reformat".
peter,

-1

Sıralanmamış bir listede 30 milyon giriş var. Listeyi kaldırmak istediğiniz giriş için tarayın ve kaldırın. Şimdi sıralanmamış listenizde yalnızca 29,999,999 giriş var. Hepsi / tmp’deyse, neden yeniden başlatılmıyorsunuz?


Yorumlardaki bilgileri yansıtacak şekilde düzenlendi: Sorun bildirimi: 30M + 'nın yanlış oluşturulan dosyalarının çoğunu, hepsini değil , çoğunu kaldırmak uzun zaman alıyor.
Sorun 1) Çok sayıda istenmeyen dosyayı / tmp'den kaldırmanın en iyi yolu.
Problem 2) Dosyaları silmenin neden bu kadar yavaş olduğunu anlamak.

Çözüm 1) - / tmp çoğu * nix dağılımında önyüklemede boşalır FreeBSD, ancak onlardan biri değil.
Adım 1 - ilginç dosyaları başka bir yere kopyalayın.
Adım 2 - Kök olarak

 $ grep -i tmp /etc/rc.conf  
 clear_tmp_enable="YES" # Clear /tmp at startup.  

Adım 3 - yeniden başlatın.
Adım 4 - clear_tmp_enable işlevini "No" olarak değiştirin.
İstenmeyen dosyalar artık FreeBSD'de ZFS olarak bırakıldı . "Bir veri kümesini yok etmek, tüm dosyaları taramak ve karşılık gelen tüm meta verileri güncellemek içermediğinden, veri kümesinde bulunan tüm dosyaları silmektan çok daha hızlıdır. " bu nedenle önyükleme sırasında tek yapması gereken / tmp veri kümesi için meta verileri sıfırlamaktır. Bu çok hızlı.

Çözüm 2) Neden bu kadar yavaş? ZFS, sabit zamanlı dizin erişimi gibi özellikleri içeren harika bir dosya sistemidir. Ne yaptığınızı biliyorsanız bu işe yarar, ancak kanıtlar OP'nin bir ZFS uzmanı olmadığını gösteriyor. OP, dosyaları nasıl kaldırmaya çalıştıklarını göstermedi, ancak tahminime göre "find regex -exec rm {} \;" üzerinde bir değişiklik kullandıklarını söyleyebilirim. Bu, küçük sayılarla iyi çalışır ancak ölçeklenmez çünkü devam eden üç seri işlem vardır 1) mevcut dosyaların listesini alır (karma sırayla 30 milyon dosya döndürür), 2) silinecek bir sonraki dosyayı seçmek için regex kullanın, 3 ) İşletim Sistemine bu dosyayı bulmasını ve 30 milyon listeden çıkarmasını söyleyin. Hatta eğer ZFS bellekten ve bir liste döndürür eğer 'bul' önbelleğe alırsa, regex'in hala listeden işlenecek bir sonraki dosyayı tanımlaması ve ardından OS'ye bu değişikliği yansıtacak şekilde meta verilerini güncellemesini ve ardından listeyi tekrar işlenmemesi için güncellemesini söylemesi gerekir.


1
Sanırım soruyu yanlış anladın. Dosyaların çoğunu kaldırmam gerekiyordu. Yani, 30M + dosya.
nagylzs

@nagylzs / tmp yeniden başlatıldığında temizlendi. Çoğu silmek istiyorsanız , o zaman sadece bazılarını , yani yarısından daha azını tutmak istiyorsanız, saklamak istediklerinizi kopyalayın ve geri kalanından kurtulmak için yeniden başlatın. Silme işleminizin bu kadar yavaş olmasının nedeni, bir dizinde çok sayıda dosyanın bulunmasının, üzerinde işlem yapması gereken ve bu işlemin zaman alacağı dosyayı bulmak için işlenmesi gereken büyük bir sıralanmamış liste oluşturmasıdır. Buradaki tek sorun PEBCAK.
Paul Smith

Zfs dizinleri sıralanmamış ? ZFS'nin özellikle büyük dizinleri iyi idare ettiğini düşündüm.
JDługosz

Eh, / tmp silinmedi, sadece X ile ilgili dosyalar var. En azından FreeBSD'de. Önyüklemede yine de silinemez, çünkü rc betiğinin normal şekilde silmesi günler alacaktır.
nagylzs

@JDlugosz - ZFS çoğu zaman daha iyidir, ancak inode listeleri (tüm dizinler) sıralanmamış.
Paul Smith
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.