Aracılığıyla paylaş


Linux istemcilerinden büyük dizinlere erişirken dosya paylaşımı performansını iyileştirme

Bu makalede, çok sayıda dosya içeren dizinlerle çalışmaya yönelik öneriler sağlanır. Dosyaları birden çok dizine yayarak tek bir dizindeki dosya sayısını azaltmak genellikle iyi bir uygulamadır. Ancak, büyük dizinlerin önlenemeyecekleri durumlar vardır. Linux istemcilerine bağlanan Azure dosya paylaşımlarında büyük dizinlerle çalışırken aşağıdaki önerileri göz önünde bulundurun.

Şunlara uygulanır

Yönetim modeli Faturalama modeli Medya katmanı Yedeklilik KOBİ Ağ Dosya Sistemi (NFS)
Microsoft.Storage Sağlanan versiyon 2 SSD (üst düzey) Yerel (LRS) Hayır Evet
Microsoft.Storage Sağlanan versiyon 2 SSD (üst düzey) Bölge (ZRS) Hayır Evet
Microsoft.Storage Sağlanan versiyon 2 HDD (standart) Yerel (LRS) Hayır Hayır
Microsoft.Storage Sağlanan versiyon 2 HDD (standart) Bölge (ZRS) Hayır Hayır
Microsoft.Storage Sağlanan versiyon 2 HDD (standart) Coğrafi (GRS) Hayır Hayır
Microsoft.Storage Sağlanan versiyon 2 HDD (standart) GeoZone (GZRS) Hayır Hayır
Microsoft.Storage Tahsis edilen v1 SSD (üst düzey) Yerel (LRS) Hayır Evet
Microsoft.Storage Tahsis edilen v1 SSD (üst düzey) Bölge (ZRS) Hayır Evet
Microsoft.Storage Kullandıkça ödeme yap HDD (standart) Yerel (LRS) Hayır Hayır
Microsoft.Storage Kullandıkça ödeme yap HDD (standart) Bölge (ZRS) Hayır Hayır
Microsoft.Storage Kullandıkça ödeme yap HDD (standart) Coğrafi (GRS) Hayır Hayır
Microsoft.Storage Kullandıkça ödeme yap HDD (standart) GeoZone (GZRS) Hayır Hayır

Karma kova sayısını artırın

Numaralandırmayı yapan sistemde bulunan toplam RAM miktarı, NFS ve SMB gibi dosya sistemi protokollerinin iç çalışmasını etkiler. Kullanıcılar yüksek bellek kullanımıyla karşılaşmasa bile, kullanılabilir bellek miktarı sistemin sahip olduğu inode karma demetlerinin sayısını etkiler ve bu da büyük dizinler için numaralandırma performansını etkiler/geliştirir. Büyük numaralandırma iş yükleri sırasında oluşabilecek karma çakışmaları azaltmak için sistemin sahip olduğu inode karma demetlerinin sayısını değiştirebilirsiniz.

Inode hash kovalarının sayısını artırmak için önyükleme ayarlarınızı değiştirin:

  1. Metin düzenleyicisi kullanarak dosyayı düzenleyin /etc/default/grub .

    sudo vim /etc/default/grub
    
  2. Aşağıdakileri metni /etc/default/grub dosyasına ekleyin. Bu komut, inode karma tablo boyutu olarak 128 MB ayarlar ve sistem bellek tüketimini en fazla 128 MB artırır.

    GRUB_CMDLINE_LINUX="ihash_entries=16777216"
    

    Zaten GRUB_CMDLINE_LINUX varsa, şunun gibi bir boşlukla ayırarak ekleyin ihash_entries=16777216 :

    GRUB_CMDLINE_LINUX="<previous commands> ihash_entries=16777216"
    
  3. Değişiklikleri uygulamak için şunu çalıştırın:

    sudo update-grub2
    
  4. Sistemi yeniden başlatın:

    sudo reboot
    
  5. Değişikliklerin yeniden başlatmadan sonra etkili olduğunu doğrulamak için çekirdek cmdline komutlarını denetleyin:

    cat /proc/cmdline
    

    ihash_entries görünür durumdaysa, sistem ayarı uygulamıştır ve numaralandırma performansı üstel olarak artırılmalıdır.

    Ayrıca, çekirdek cmdline'sının uygulanılıp uygulanmadığını görmek için dmesg çıkışını de de kontrol edebilirsiniz:

    dmesg | grep "Inode-cache hash table"
    Inode-cache hash table entries: 16777216 (order: 15, 134217728 bytes, linear)
    

Aşağıdaki bağlama seçenekleri numaralandırmaya özeldir ve büyük dizinlerle çalışırken gecikme süresini azaltabilir.

actimeo

Bağlama actimeo seçeneği, istemcinin bir sunucudan öznitelik bilgilerini istemeden önce dosyanın veya dizinin özniteliklerini önbelleğe alma süresini (saniye olarak) belirtir. Bu süre boyunca, istemci sunucuyu yeniden denetleyene kadar sunucuda gerçekleşen değişiklikler algılanmadan kalır. SMB istemcileri için varsayılan öznitelik önbelleği zaman aşımı 1 saniye olarak ayarlanır.

NFS istemcilerinde, belirterek actimeo tüm acregmin, acregmax, acdirminve acdirmax değerlerini aynı değere ayarlar. Belirtilmezse actimeo , istemci bu seçeneklerin her biri için varsayılan değerleri kullanır.

Büyük dizinlerle çalışırken 30 ile 60 saniye arasında bir ayar actimeo yapmanızı öneririz. Bu aralıktaki bir değerin ayarlanması, özniteliklerin istemcinin öznitelik önbelleğinde daha uzun bir süre boyunca geçerli kalmasını sağlayarak işlemlerin dosya özniteliklerini kablo üzerinden getirmek yerine önbellekten almasına olanak sağlar. Bu, işlem çalışmaya devam ederken önbelleğe alınan özniteliklerin süresinin dolacağı durumlarda gecikme süresini azaltabilir.

Aşağıdaki grafik, varsayılan bağlama karşılık bir iş yükü için 1 milyon dosyanın bulunduğu tek bir dizinde actimeo değerinin 30 olarak ayarlandığı duruma kıyasla farklı işlemleri tamamlamak için gereken toplam süreyi karşılaştırır. Testlerimizde, toplam tamamlanma süresi bazı operasyonlar için %77'ye kadar azaltıldı. Tüm işlemler alias kullanılmadan ls ile yapıldı.

Varsayılan bağlama karşı, 1 milyon dosya içeren bir iş yükünde farklı işlemlerin tamamlanma süresini grafikte karşılaştıran grafik, actimeo değerini 30 olarak ayarlamayı da içeriyor.

NFS nconnect

NFS nconnect, istemci ile NFS dosya paylaşımınız arasında birden çok TCP bağlantısı kullanmanıza olanak tanıyan bir NFS dosya paylaşımları için istemci tarafı bağlama seçeneğidir. Gecikme süresini azaltmak ve performansı geliştirmek için en uygun ayarını nconnect=4 öneririz. Nconnect özelliği, birden çok iş parçacığından zaman uyumsuz veya zaman uyumlu G/Ç kullanan iş yükleri için özellikle yararlı olabilir. Daha fazla bilgi edinin.

Komutlar ve işlemler

Komutların ve işlemlerin belirtilme şekli performansı da etkileyebilir. komutunu kullanarak ls büyük bir dizindeki tüm dosyaları listelemek iyi bir örnektir.

Not Düşün

Özyinelemeli ls, finddu ve gibi bazı işlemler hem dosya adlarına hem de dosya özniteliklerine ihtiyaç duyar, bu nedenle dizin numaralandırmalarını (girdileri almak için) her girdide bir istatistikle birleştirir (öznitelikleri almak için). Bu tür komutları çalıştırma olasılığınız olan bağlama noktalarında actimeo için daha yüksek bir değer kullanmanızı öneririz.

Unaliased ls kullan

Bazı Linux dağıtımlarında, kabuk komutu lsiçin ls --color=auto gibi varsayılan seçenekleri otomatik olarak ayarlar. Bu, ls'nin ağ üzerinden çalışma biçimini değiştirir ve ls'in yürütülmesine daha fazla işlem ekler. Performans düşüşü önlemek için, unaliased ls kullanmanızı öneririz. Bunu üç yoldan birini yapabilirsiniz:

  • Geçerli oturumu yalnızca etkileyen geçici bir çözüm olarak, unalias ls komutunu kullanarak diğer adı kaldırabilirsiniz.

  • Kalıcı bir değişiklik için, kullanıcının ls dosyasındaki bashrc/bash_aliases takma adını düzenleyebilirsiniz. Ubuntu'da ~/.bashrc dosyasını düzenleyerek ls için oluşturulmuş olan takma adı kaldırın.

  • ls çağırmak yerine, doğrudan ls ikili dosyasını çağırabilirsiniz, örneğin /usr/bin/ls. Bu, takma adında olabilecek herhangi bir seçenek olmadan ls kullanmanıza olanak tanır. komutunu which lsçalıştırarak ikili dosyasının konumunu bulabilirsiniz.

ls çıktısının sıralanmasını önlemek

ls diğer komutlarla birlikte kullanıldığında, dosyaları döndürdüğü sırayı önemsemediğiniz durumlarda, çıktısını sıralamasını engelleyerek ls performansını geliştirebilirsiniz. Çıkışı sıralamak önemli ek yük getirir.

Toplam dosya sayısını almak için ls -l | wc -l komutunu çalıştırmak yerine, -f ve -U seçeneklerini ls ile kullanarak çıkışın sıralanmasını engelleyebilirsiniz. -f gizli dosyaları gösterirken, -U göstermez.

Örneğin, Ubuntu'da ls ikili dosyasını doğrudan çağırıyorsanız, /usr/bin/ls -1f | wc -l komutunu veya /usr/bin/ls -1U | wc -l komutunu çalıştırabilirsiniz.

Aşağıdaki grafik, sıralanmamış ls ile sıralanmış ls kullanarak sonuçların çıkış süresini karşılaştırır.

Sıralanmış ls işleminin tamamlanma süresini sıralanmamış olan ile saniye cinsinden karşılaştıran grafik.

Dosya kopyalama ve yedekleme işlemleri

Bir dosya paylaşımından veri kopyalarken veya dosya paylaşımlarından başka bir konuma yedeklerken, en iyi performans için etkin G/Ç ile canlı dosya paylaşımı yerine kaynak olarak bir paylaşım anlık görüntüsü kullanmanızı öneririz. Yedekleme uygulamaları komutları doğrudan anlık görüntüde çalıştırmalıdır. Daha fazla bilgi için Azure Dosyalar ile anlık görüntüleri paylaşma başlıklı makaleye bakın.

Uygulama düzeyi önerileri

Büyük dizinler kullanan uygulamalar geliştirirken bu önerileri izleyin.

  • Dosya özniteliklerini atlayın. Uygulamanın dosya türü veya son değiştirme zamanı gibi dosya özniteliklerine değil yalnızca dosya adına ihtiyacı varsa, belirtildiği dizindeki girdileri dosya türü olmadan almak için iyi bir arabellek boyutu kullanarak, getdents64 gibi sistem çağrılarına birden çok kez başvurabilirsiniz. Gereksiz ek işlemlerden kaçınarak bu işlemi hızlandırabilirsiniz.

  • Stat çağrılarını birbirine karıştır. Uygulamanın niteliklere ve dosya adına ihtiyacı varsa, stat çağrılarını getdents64 ile birleştirmenizi öneririz. Bu, getdents64 ile dosyanın sonuna kadar tüm girişleri almak ve sonra döndürülen tüm girdilerde bir statx işlemi yapmaktan daha verimlidir. durum çağrılarının araya eklenmesi, istemciye hem dosyayı hem de özniteliklerini aynı anda istemesini ve sunucuya yapılan çağrıların sayısını azaltmasını sağlar. Yüksek actimeo bir değerle birleştirildiğinde, araya ekleme durum çağrıları performansı önemli ölçüde artırabilir. Örneğin, [ getdents64, getdents64, ... , getdents64, statx (entry1), ... , statx(n) ] yerine, statx çağrılarını her getdents64'den sonra şu şekilde yerleştirin: [ getdents64, (statx, statx, ... , statx), getdents64, (statx, statx, ... , statx), ... ].

  • G/Ç derinliğini artırın. Mümkünse, nconnect'yi sıfır olmayan bir değere (1'den büyük) yapılandırmanızı ve işlemi birden çok iş parçacığı arasında dağıtmanızı ya da zaman uyumsuz G/Ç kullanmanızı öneririz. Bu, dosya paylaşımına birden çok eş zamanlı bağlantıdan yararlanmayı sağlayarak eş zamansız olabilecek işlemleri mümkün kılar.

  • Zorunlu önbellek. Uygulama, yalnızca tek bir istemcinin bağladığı bir dosya paylaşımındaki dosya özniteliklerini sorguluyorsa, AT_STATX_DONT_SYNC bayrağıyla statx sistem çağrısını kullanın. Bu bayrak, önbelleğe alınan özniteliklerin sunucuyla eşitlenmeden önbellekten alınmasını sağlar ve en son verileri almak için ek ağ gidiş dönüşlerinden kaçınır.

Ayrıca bkz.