Penyetelan performa untuk unggahan dan unduhan dengan Python

Saat aplikasi mentransfer data menggunakan pustaka klien Azure Storage untuk Python, ada beberapa faktor yang dapat memengaruhi kecepatan, penggunaan memori, dan bahkan keberhasilan atau kegagalan permintaan. Untuk memaksimalkan performa dan keandalan transfer data, penting untuk proaktif dalam mengonfigurasi opsi transfer pustaka klien berdasarkan lingkungan tempat aplikasi Anda berjalan.

Artikel ini membahas beberapa pertimbangan untuk menyetel opsi transfer data. Ketika disetel dengan benar, pustaka klien dapat mendistribusikan data secara efisien di beberapa permintaan, yang dapat mengakibatkan peningkatan kecepatan operasi, penggunaan memori, dan stabilitas jaringan.

Penyetelan performa untuk unggahan

Menyetel opsi transfer data dengan benar adalah kunci untuk performa yang dapat diandalkan untuk unggahan. Transfer penyimpanan dipartisi ke dalam beberapa subtransfer berdasarkan nilai argumen ini. Ukuran transfer maksimum yang didukung bervariasi menurut operasi dan versi layanan, jadi pastikan untuk memeriksa dokumentasi untuk menentukan batas. Untuk informasi selengkapnya tentang batas ukuran transfer untuk penyimpanan Blob, lihat Menskalakan target untuk penyimpanan Blob.

Mengatur opsi transfer untuk unggahan

Argumen berikut dapat disetel berdasarkan kebutuhan aplikasi Anda:

  • max_single_put_size: Ukuran maksimum blob yang akan diunggah dengan satu permintaan. Default ke 64 MiB.
  • max_block_size: Panjang maksimum transfer dalam byte saat mengunggah blob blok dalam gugus. Default ke 4 MiB.
  • max_concurrency: Jumlah maksimum subtransfer yang dapat digunakan secara paralel.

Catatan

Pustaka klien akan menggunakan default untuk setiap opsi transfer data, jika tidak disediakan. Default ini biasanya dilakukan di lingkungan pusat data, tetapi tidak mungkin cocok untuk lingkungan konsumen rumahan. Opsi transfer data yang disetel dengan buruk dapat mengakibatkan operasi yang terlalu panjang dan bahkan meminta batas waktu. Yang terbaik adalah proaktif dalam menguji nilai-nilai ini, dan menyetelnya berdasarkan kebutuhan aplikasi dan lingkungan Anda.

max_single_put_size

Argumen max_single_put_size adalah ukuran blob maksimum dalam byte untuk satu unggahan permintaan. Jika ukuran blob kurang dari atau sama dengan max_single_put_size, blob diunggah dengan satu permintaan Put Blob . Jika ukuran blob lebih besar dari max_single_put_size, atau jika ukuran blob tidak diketahui, blob diunggah dalam gugus menggunakan serangkaian panggilan Put Block diikuti oleh Put Block List.

Penting untuk dicatat bahwa nilai yang Anda tentukan max_block_sizetidak membatasi nilai yang Anda tentukan untuk max_single_put_size. Argumen max_single_put_size menentukan batasan ukuran terpisah untuk permintaan untuk melakukan seluruh operasi sekaligus, tanpa subtransfer. Sering kali kasus yang Anda inginkan max_single_put_sizesetidaknya sebesar nilai yang Anda tentukan untuk max_block_size, jika tidak lebih besar. Tergantung pada ukuran transfer data, pendekatan ini bisa lebih berkinerja, karena transfer selesai dengan satu permintaan dan menghindari overhead beberapa permintaan.

Jika Anda tidak yakin nilai apa yang terbaik untuk situasi Anda, opsi yang aman adalah mengatur max_single_put_size ke nilai yang sama yang digunakan untuk max_block_size.

max_block_size

Argumen max_block_size adalah panjang maksimum transfer dalam byte saat mengunggah blob blok dalam gugus. Seperti disebutkan sebelumnya, nilai ini tidak membatasi max_single_put_size, yang bisa lebih besar dari max_block_size.

Agar data tetap bergerak secara efisien, pustaka klien mungkin tidak selalu mencapai max_block_size nilai untuk setiap transfer. Tergantung pada operasi, nilai maksimum yang didukung untuk ukuran transfer dapat bervariasi. Untuk informasi selengkapnya tentang batas ukuran transfer untuk penyimpanan Blob, lihat bagan di Target skala untuk penyimpanan Blob.

Contoh kode

Contoh kode berikut menunjukkan cara menentukan opsi transfer data saat membuat BlobClient objek, dan cara mengunggah data menggunakan objek klien tersebut. Nilai yang disediakan dalam sampel ini tidak dimaksudkan untuk menjadi rekomendasi. Untuk menyetel nilai-nilai ini dengan benar, Anda perlu mempertimbangkan kebutuhan spesifik aplikasi Anda.

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)

Dalam contoh ini, kami mengatur jumlah pekerja transfer paralel ke 2, menggunakan max_concurrency argumen pada panggilan metode. Konfigurasi ini membuka hingga dua koneksi secara bersamaan, memungkinkan unggahan terjadi secara paralel. Selama instansiasi klien, kami mengatur argumen ke max_single_put_size 8 MiB. Jika ukuran blob lebih kecil dari 8 MiB, hanya satu permintaan yang diperlukan untuk menyelesaikan operasi unggahan. Jika ukuran blob lebih besar dari 8 MiB, blob diunggah dalam gugus dengan ukuran gugus maksimum 4 MiB, sebagaimana diatur oleh max_block_size argumen.

Pertimbangan performa untuk unggahan

Selama pengunggahan, pustaka klien Storage membagi aliran unggahan tertentu menjadi beberapa subupload berdasarkan opsi konfigurasi yang ditentukan selama konstruksi klien. Setiap subupload memiliki panggilan khususnya sendiri ke operasi REST. Untuk objek BlobClient , operasi ini adalah Put Block. Pustaka klien Storage mengelola operasi REST ini secara paralel (tergantung opsi transfer) untuk menyelesaikan unggahan lengkap.

Anda dapat mempelajari bagaimana pustaka klien menangani buffering di bagian berikut.

Catatan

Blob blok memiliki jumlah blok maksimum 50.000 blok. Ukuran maksimum blob blok Anda, kemudian, adalah 50.000 kali max_block_size.

Buffering selama pengunggahan

Lapisan Storage REST tidak mendukung pengambilan operasi pengunggahan REST tempat Anda meninggalkan; transfer individu selesai atau hilang. Untuk memastikan ketahanan untuk unggahan streaming, klien Storage pustaka data buffer untuk setiap panggilan REST individu sebelum memulai unggahan. Selain batasan kecepatan jaringan, perilaku buffering ini adalah alasan untuk mempertimbangkan nilai yang lebih kecil untuk max_block_size, bahkan ketika mengunggah secara berurutan. Mengurangi nilai max_block_size mengurangi jumlah maksimum data yang di-buffer pada setiap permintaan dan setiap percobaan ulang permintaan yang gagal. Jika Anda sering mengalami batas waktu selama transfer data dengan ukuran tertentu, mengurangi nilai max_block_size mengurangi waktu buffering, dan dapat mengakibatkan performa yang lebih baik.

Secara default, buffer SDK data max_block_size byte per permintaan subupload bersamaan, tetapi penggunaan memori dapat dibatasi hingga 4 MiB per permintaan jika kondisi berikut terpenuhi:

  • Argumen max_block_size harus lebih besar dari min_large_block_upload_threshold. Argumen min_large_block_upload_threshold dapat didefinisikan selama instansiasi klien, dan merupakan ukuran potongan minimum dalam byte yang diperlukan untuk menggunakan algoritma efisien memori. Argumen min_large_block_upload_threshold default ke 4*1024*1024 + 1.
  • Aliran yang disediakan harus dapat dicari. Aliran yang dapat dicari adalah aliran yang mendukung kueri dan memodifikasi posisi saat ini dalam aliran.
  • Blob harus berupa blob blok.

Meskipun strategi ini berlaku untuk sebagian besar situasi, masih mungkin untuk lebih banyak buffering terjadi jika kode Anda menggunakan fitur pustaka klien lain yang memerlukan buffering.

Penyetelan performa untuk unduhan

Menyetel opsi transfer data dengan benar adalah kunci untuk performa yang dapat diandalkan untuk unduhan. Transfer penyimpanan dipartisi ke dalam beberapa subtransfer berdasarkan nilai argumen ini.

Mengatur opsi transfer untuk unduhan

Argumen berikut dapat disetel berdasarkan kebutuhan aplikasi Anda:

  • max_chunk_get_size: Ukuran gugus maksimum yang digunakan untuk mengunduh blob. Default ke 4 MiB.
  • max_concurrency: Jumlah maksimum subtransfer yang dapat digunakan secara paralel.
  • max_single_get_size: Ukuran maksimum untuk blob yang akan diunduh dalam satu panggilan. Jika ukuran blob total melebihi max_single_get_size, sisa data blob diunduh dalam gugus. Default ke 32 MiB.

Contoh kode

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
    )

    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())

Pertimbangan performa untuk unduhan

Selama pengunduhan, pustaka klien Storage membagi permintaan unduhan tertentu menjadi beberapa subdownload berdasarkan opsi konfigurasi yang ditentukan selama konstruksi klien. Setiap subdownload memiliki panggilan khususnya sendiri ke operasi REST. Bergantung pada opsi transfer, pustaka klien mengelola operasi REST ini secara paralel untuk menyelesaikan unduhan lengkap.

max_single_get_size untuk unduhan

Selama pengunduhan, pustaka klien Storage membuat satu permintaan rentang unduhan menggunakan max_single_get_size sebelum melakukan hal lain. Selama permintaan unduhan awal ini, pustaka klien mengetahui ukuran total sumber daya. Jika permintaan awal berhasil mengunduh semua konten, operasi selesai. Jika tidak, pustaka klien terus membuat permintaan rentang hingga max_chunk_get_size unduhan lengkap selesai.

Langkah berikutnya