Aracılığıyla paylaş


Python ile yükleme ve indirmeler için performans optimizasyonu

Bir uygulama Python için Azure Depolama istemci kitaplığını kullanarak veri aktardığında hızı, bellek kullanımını ve hatta isteğin başarısını veya başarısızlığını etkileyebilecek çeşitli faktörler vardır. Veri aktarımlarında performansı ve güvenilirliği en üst düzeye çıkarmak için, uygulamanızın çalıştığı ortama göre istemci kitaplığı aktarım seçeneklerini yapılandırma konusunda proaktif olmak önemlidir.

Bu makalede, veri aktarımı seçeneklerini ayarlamayla ilgili dikkat edilmesi gereken bazı noktalar açıklanır. düzgün ayarlandığında, istemci kitaplığı verileri birden çok istek arasında verimli bir şekilde dağıtabilir ve bu da gelişmiş işlem hızı, bellek kullanımı ve ağ kararlılığı ile sonuçlanabilir.

Karşıya yüklemeler için performans ayarlama

Veri aktarımı seçeneklerinin düzgün ayarlanması, karşıya yüklemeler için güvenilir performansın anahtarıdır. Depolama aktarımları, bu bağımsız değişkenlerin değerlerine göre birkaç alt iletide bölümlenir. Desteklenen maksimum aktarım boyutu işleme ve hizmet sürümüne göre değişir, bu nedenle sınırları belirlemek için belgeleri gözden geçirin. Blob depolama için aktarım boyutu sınırları hakkında daha fazla bilgi için bkz. Blob depolama için hedefleri ölçeklendirme.

Karşıya yüklemeler için aktarım ayarlarını ayarlayın

Aşağıdaki bağımsız değişkenler uygulamanızın gereksinimlerine göre ayarlanabilir:

  • max_single_put_size: Tek bir istekle yüklenecek bütün için maksimum boyut. Varsayılan değer 64 MiB'dir.
  • max_block_size: Blok blobu öbekler halinde karşıya yüklenirken bayt cinsinden aktarım uzunluğu üst sınırı. Varsayılan değer 4 MiB'dir.
  • max_concurrency: Paralel olarak kullanılabilecek en fazla alt iletim sayısı.

Note

İstemci kitaplıkları, sağlanmadıysa her veri aktarımı seçeneği için varsayılan değerleri kullanır. Bu varsayılanlar genellikle bir veri merkezi ortamında yüksek performanslıdır, ancak ev tüketicisi ortamları için uygun olmayabilir. Kötü ayarlanmış veri aktarımı seçenekleri aşırı uzun işlemlere ve hatta istek zaman aşımlarına neden olabilir. Bu değerleri test etmek ve uygulamanızın ve ortamınızın ihtiyaçlarına göre ayarlamak için proaktif olmak en iyisidir.

max_single_put_size

max_single_put_size Bağımsız değişken, tek bir istekle karşıya yükleme için bayt cinsinden en büyük blob boyutudur. Blob boyutu max_single_put_size değerine eşit veya daha küçükse, blob tek bir Put Blob isteğiyle karşıya yüklenir. Blob boyutu max_single_put_size değerinden büyükse veya blob boyutu bilinmiyorsa, blob, bir dizi Put Block çağrısı ve ardından Put Block List kullanılarak parçalara ayrılarak karşıya yüklenir.

Belirttiğiniz değerin için max_block_sizetanımladığınız değeri max_single_put_size unutmayın. max_single_put_size bağımsız değişkeni, bir isteğin alt iletim olmadan tüm işlemi aynı anda gerçekleştirmesi için ayrı bir boyut sınırlaması tanımlar. Genellikle, tanımladığınız max_single_put_size değerine en azından eşit, hatta daha büyük olmasını istersiniz max_block_size. Veri aktarımının boyutuna bağlı olarak, aktarım tek bir istekle tamamlandığından ve birden çok isteğin ek yükünü önlediği için bu yaklaşım daha yüksek performanslı olabilir.

Durumunuz için en uygun değerin hangisi olduğundan emin değilseniz, güvenli bir seçenek olarak max_single_put_size, max_block_size için kullanılan değere ayarlamaktır.

max_block_size

Argüman max_block_size, bir blok blobunu parçalar halinde karşıya yüklerken bayt cinsinden aktarımın maksimum uzunluğudur. Daha önce belirtildiği gibi, bu değer, max_single_put_size değerinden büyük olabilecek max_block_size.

Verilerin verimli bir şekilde ilerlemesini sağlamak için istemci kütüphaneleri, her aktarımda max_block_size değerine her zaman ulaşamayabilir. İşleme bağlı olarak aktarım boyutu için desteklenen maksimum değer farklılık gösterebilir. Blob depolama için aktarım boyutu sınırları hakkında daha fazla bilgi için bkz. Blob depolama için ölçeklendirme hedefleri.

Kod örneği

Aşağıdaki kod örneği, nesne BlobClient oluştururken veri aktarımı seçeneklerini belirtmeyi ve bu istemci nesnesini kullanarak verileri karşıya yüklemeyi gösterir. Bu örnekte sağlanan değerler bir öneri olarak tasarlanmamıştır. Bu değerleri düzgün ayarlamak için uygulamanızın belirli gereksinimlerini dikkate almanız gerekir.

def upload_blob_transfer_options(self, account_url: str, container_name: str, blob_name: str):
    # Create a BlobClient object with data transfer options for upload
    blob_client = BlobClient(
        account_url=account_url, 
        container_name=container_name, 
        blob_name=blob_name,
        credential=DefaultAzureCredential(),
        max_block_size=1024*1024*4, # 4 MiB
        max_single_put_size=1024*1024*8 # 8 MiB
    )
    
    with open(file=os.path.join(r'file_path', blob_name), mode="rb") as data:
        blob_client = blob_client.upload_blob(data=data, overwrite=True, max_concurrency=2)

Bu örnekte, yöntem çağrısındaki bağımsız değişkenini max_concurrency kullanarak paralel aktarım çalışanlarının sayısını 2 olarak ayarlayacağız. Bu yapılandırma aynı anda en fazla iki bağlantı açarak karşıya yüklemenin paralel olarak gerçekleşmesini sağlar. İstemci örneği oluşturma sırasında max_single_put_size bağımsız değişkenini 8 MiB olarak ayarladık. Blob boyutu 8 MiB'den küçükse, karşıya yükleme işlemini tamamlamak için yalnızca tek bir istek gerekir. Blob boyutu 8 MiB'den büyükse, blob max_block_size tarafından ayarlandığı şekilde en fazla 4 MiB boyutunda öbekler halinde karşıya yüklenir.

Karşıya yüklemeler için performansla ilgili dikkat edilmesi gerekenler

Karşıya yükleme sırasında Depolama istemci kitaplıkları, istemci oluşturma sırasında tanımlanan yapılandırma seçeneklerine göre belirli bir karşıya yükleme akışını birden çok alt yüke böler. Her bir alt yüklemenin REST işlemi için kendine ait özel bir çağrısı vardır. Bir BlobClient nesne için bu işlem Put Block işlemidir. Depolama istemci kitaplığı, yüklemenin tamamını tamamlamak için bu REST işlemlerini paralel olarak yönetir (aktarım seçeneklerine bağlı olarak).

İstemci kitaplığının arabellekleme işlemini nasıl işlediğini aşağıdaki bölümlerde öğrenebilirsiniz.

Note

Blok blobları en fazla 50.000 blok blok sayısına sahiptir. Blok blobunuzun maksimum boyutu max_block_size'yi 50.000 kez aşar.

Karşıya yükleme sırasında arabelleğe alma

Depolama REST katmanı, kaldığınız yerden bir REST yükleme işlemini sürdürmeyi desteklemez; her bir aktarım ya tamamlanır ya da kaybolur. Akış yüklemelerinde dayanıklılık sağlamak için depolama istemcisi kitaplıkları, yüklemeyi başlatmadan önce her bir REST çağrısı için verileri arabelleğe alır. Ağ hızı sınırlamalarına ek olarak, bu arabelleğe alma davranışı, sırayla karşıya yükleme yapılırken bile daha küçük bir max_block_size değeri düşünmek için bir nedendir. değerinin max_block_size azaltılması, her istekte arabelleğe alınan maksimum veri miktarını ve başarısız bir isteğin her yeniden denemesini azaltır. Belirli bir boyuttaki veri aktarımları sırasında sık sık zaman aşımlarıyla karşılaşıyorsanız, max_block_size değerini azaltmak arabelleğe alma süresini kısaltır ve daha iyi performans sağlayabilir.

Varsayılan olarak, SDK her bir eşzamanlı alt yükleme isteği için max_block_size bayt veriyi arabelleğe alır, ancak aşağıdaki koşullar karşılandığında bellek kullanımı istek başına 4 MiB ile sınırlanabilir.

  • max_block_size bağımsız değişkeni min_large_block_upload_threshold değerinden büyük olmalıdır. min_large_block_upload_threshold bağımsız değişkeni, istemci örneklemesi sırasında tanımlanabilir ve bellek açısından verimli algoritmayı kullanmak için gereken bayt cinsinden en düşük birim boyutudur. min_large_block_upload_threshold bağımsız değişken varsayılan olarak 4*1024*1024 + 1 değerine ayarlanır.
  • Sağlanan akış aranabilir olmalıdır. Aranabilir akış, bir akış içindeki geçerli konumu sorgulamayı ve değiştirmeyi destekleyen bir akıştır.
  • Blob bir blok blobu olmalıdır.

Bu strateji çoğu durumda geçerli olsa da, kodunuz arabelleğe alma gerektiren diğer istemci kitaplığı özelliklerini kullanıyorsa daha fazla arabelleğe alma gerçekleşebilir.

İndirmeler için performans ayarlama

Veri aktarımı seçeneklerinin düzgün ayarlanması, indirmeler için güvenilir performansın anahtarıdır. Depolama aktarımları, bu bağımsız değişkenlerin değerlerine göre birkaç alt iletide bölümlenir.

İndirmeler için aktarım seçeneklerini ayarlama

Aşağıdaki bağımsız değişkenler uygulamanızın gereksinimlerine göre ayarlanabilir:

  • max_chunk_get_size: Blobu indirmek için kullanılan en büyük öbek boyutu. Varsayılan değer 4 MiB'dir.
  • max_concurrency: Paralel olarak kullanılabilecek en fazla alt iletim sayısı.
  • max_single_get_size: Tek bir çağrıda indirilecek blob için maksimum boyut. Toplam blob boyutu değerini aşarsa max_single_get_sizeblob verilerinin geri kalanı öbekler halinde indirilir. Varsayılan değer 32 MiB'dir.
  • connection_data_block_size: Ağ akışından okunan veri bloklarının boyutunu belirtir. Varsayılan değer 4 KiB'dir.

Kod örneği

def download_blob_transfer_options(self, account_url: str, container_name: str, blob_name: str):
    # Create a BlobClient object with data transfer options for download
    blob_client = BlobClient(
        account_url=account_url, 
        container_name=container_name, 
        blob_name=blob_name,
        credential=DefaultAzureCredential(),
        max_single_get_size=1024*1024*32, # 32 MiB
        max_chunk_get_size=1024*1024*4, # 4 MiB
        connection_data_block_size=1024*4, # 4 KiB
    )

    with open(file=os.path.join(r'file_path', 'file_name'), mode="wb") as sample_blob:
        download_stream = blob_client.download_blob(max_concurrency=2)
        sample_blob.write(download_stream.readall())

İndirmeler için performansla ilgili dikkat edilmesi gerekenler

İndirme sırasında Depolama istemci kitaplıkları, istemci oluşturma sırasında tanımlanan yapılandırma seçeneklerine göre belirli bir indirme isteğini birden çok alt yüke böler. Her alt indirmenin REST işlemine kendi ayrılmış çağrısı vardır. Aktarım seçeneklerine bağlı olarak, istemci kitaplıkları tam indirmeyi tamamlamak için bu REST işlemlerini paralel olarak yönetir.

max_single_get_size indirme boyutu sınırı

İndirme sırasında, Depolama istemci kitaplıkları önce max_single_get_size kullanarak bir indirme aralığı isteğinde bulunur, ardından başka bir şey yapar. bu ilk indirme isteği sırasında istemci kitaplıkları kaynağın toplam boyutunu bilir. İlk istek tüm içeriği başarıyla indirdiyse işlem tamamlanır. Aksi takdirde, istemci kütüphaneleri tam indirme tamamlanana kadar max_chunk_get_size aralık taleplerinde bulunmaya devam eder.

İndirmeler için bağlantı_veri_blok_boyutu

İndirme sırasında bu ayar indirme connection_data_block_size performansını önemli ölçüde etkileyebilir. Bunun etkisi, ortamınıza ve donanım yapılandırmanıza büyük ölçüde bağlıdır. 64 Kb gibi bir değerle başlayıp performansı ve kaynak kullanımını izlerken en uygun dengeyi bulmak için bunu aşamalı olarak ayarlamayı deneyin.

Sonraki Adımlar