Penyetelan performa untuk unggahan dan unduhan dengan .NET

Saat aplikasi mentransfer data menggunakan pustaka klien Azure Storage untuk .NET, 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, dan panduan berlaku untuk API apa pun yang menerima StorageTransferOptions sebagai parameter. 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 dengan StorageTransferOptions

Menyetel nilai dalam StorageTransferOptions dengan benar adalah kunci untuk performa yang andal untuk operasi transfer data. Transfer penyimpanan dipartisi ke dalam beberapa subtransfer berdasarkan nilai properti yang ditentukan dalam instans struktur 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.

Properti StorageTransferOptions berikut dapat disetel berdasarkan kebutuhan aplikasi Anda:

Catatan

StorageTransferOptions Meskipun struct berisi nilai nullable, pustaka klien akan menggunakan default untuk setiap nilai individual, jika tidak disediakan. Default ini biasanya dilakukan di lingkungan pusat data, tetapi tidak mungkin cocok untuk lingkungan konsumen rumahan. Penyetelan yang buruk dapat mengakibatkan StorageTransferOptions operasi yang terlalu lama dan bahkan meminta batas waktu. Yang terbaik adalah proaktif dalam menguji nilai di StorageTransferOptions, dan menyetelnya berdasarkan kebutuhan aplikasi dan lingkungan Anda.

InitialTransferSize

InitialTransferSize adalah ukuran permintaan rentang pertama dalam byte. Permintaan rentang HTTP adalah permintaan parsial, dengan ukuran yang ditentukan oleh InitialTransferSize dalam kasus ini. Blob yang lebih kecil dari ukuran ini ditransfer dalam satu permintaan. Blob yang lebih besar dari ukuran ini terus ditransfer dalam potongan ukuran MaximumTransferSize.

Penting untuk dicatat bahwa nilai yang Anda tentukan MaximumTransferSizetidak membatasi nilai yang Anda tentukan untuk InitialTransferSize. InitialTransferSize menentukan batasan ukuran terpisah untuk permintaan awal untuk melakukan seluruh operasi sekaligus, tanpa subtransfer. Sering kali kasus yang Anda inginkan InitialTransferSizesetidaknya sebesar nilai yang Anda tentukan untuk MaximumTransferSize, 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 InitialTransferSize ke nilai yang sama yang digunakan untuk MaximumTransferSize.

Catatan

Saat menggunakan BlobClient objek, mengunggah blob yang lebih kecil dari yang InitialTransferSize akan dilakukan menggunakan Put Blob, bukan Put Block.

MaximumConcurrency

MaximumConcurrency adalah jumlah maksimum pekerja yang dapat digunakan dalam transfer paralel. Saat ini, hanya operasi asinkron yang dapat menyejajarkan transfer. Operasi sinkron mengabaikan nilai ini dan bekerja secara berurutan.

Efektivitas nilai ini tunduk pada batas kumpulan koneksi di .NET, yang dapat membatasi performa secara default dalam skenario tertentu. Untuk mempelajari selengkapnya tentang batas kumpulan koneksi di .NET, lihat .NET Framework Koneksi ion Pool Limits dan Azure SDK baru untuk .NET.

MaximumTransferSize

MaximumTransferSize adalah panjang maksimum transfer dalam byte. Seperti disebutkan sebelumnya, nilai ini tidak membatasi InitialTransferSize, yang bisa lebih besar dari MaximumTransferSize.

Agar data tetap bergerak secara efisien, pustaka klien mungkin tidak selalu mencapai MaximumTransferSize nilai untuk setiap transfer. Tergantung pada operasi, nilai maksimum yang didukung untuk ukuran transfer dapat bervariasi. Misalnya, blob blok yang memanggil operasi Put Block dengan versi layanan 2019-12-12 atau yang lebih baru memiliki ukuran blok maksimum 4000 MiB. Untuk informasi selengkapnya tentang batas ukuran transfer untuk penyimpanan Blob, lihat bagan di Target skala untuk penyimpanan Blob.

Contoh kode

Pustaka klien mencakup kelebihan beban untuk Upload metode dan UploadAsync , yang menerima instans StorageTransferOptions sebagai bagian dari parameter BlobUploadOptions . Kelebihan beban serupa juga ada untuk DownloadTo metode dan DownloadToAsync , menggunakan parameter BlobDownloadToOptions .

Contoh kode berikut menunjukkan cara menentukan nilai untuk StorageTransferOptions instans dan meneruskan opsi konfigurasi ini sebagai parameter ke UploadAsync. 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.

// Specify the StorageTransferOptions
BlobUploadOptions options = new BlobUploadOptions
{
    TransferOptions = new StorageTransferOptions
    {
        // Set the maximum number of parallel transfer workers
        MaximumConcurrency = 2,

        // Set the initial transfer length to 8 MiB
        InitialTransferSize = 8 * 1024 * 1024,

        // Set the maximum length of a transfer to 4 MiB
        MaximumTransferSize = 4 * 1024 * 1024
    }
};

// Upload data from a stream
await blobClient.UploadAsync(stream, options);

Dalam contoh ini, kami mengatur jumlah pekerja transfer paralel ke 2, menggunakan MaximumConcurrency properti . Konfigurasi ini membuka hingga dua koneksi secara bersamaan, memungkinkan unggahan terjadi secara paralel. Permintaan rentang HTTP awal mencoba mengunggah hingga 8 MiB data, seperti yang InitialTransferSize didefinisikan oleh properti . Perhatikan bahwa InitialTransferSize hanya berlaku untuk unggahan saat menggunakan aliran yang dapat dicari. Jika ukuran blob lebih kecil dari 8 MiB, hanya satu permintaan yang diperlukan untuk menyelesaikan operasi. Jika ukuran blob lebih besar dari 8 MiB, semua permintaan transfer berikutnya memiliki ukuran maksimum 4 MiB, yang kami tetapkan dengan MaximumTransferSize properti .

Pertimbangan performa untuk unggahan

Selama pengunggahan, pustaka klien Storage membagi aliran unggahan tertentu menjadi beberapa subupload berdasarkan nilai yang ditentukan dalam StorageTransferOptions instans. Setiap subupload memiliki panggilan khususnya sendiri ke operasi REST. BlobClient Untuk objek atau BlockBlobClient objek, operasi ini adalah Put Block. DataLakeFileClient Untuk objek, operasi ini adalah Tambahkan Data. Pustaka klien Storage mengelola operasi REST ini secara paralel (tergantung opsi transfer) untuk menyelesaikan unggahan lengkap.

Bergantung pada apakah aliran unggahan dapat dicari atau tidak dapat dicari, pustaka klien menangani buffering dan InitialTransferSize berbeda, seperti yang dijelaskan di bagian berikut. Aliran yang dapat dicari adalah aliran yang mendukung kueri dan memodifikasi posisi saat ini dalam aliran. Untuk mempelajari selengkapnya tentang aliran di .NET, lihat referensi kelas Stream.

Catatan

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

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 aliran yang tidak dapat dicari, klien Storage meminta 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 MaximumTransferSize, bahkan ketika mengunggah secara berurutan. Mengurangi nilai MaximumTransferSize 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 MaximumTransferSize mengurangi waktu buffering, dan dapat mengakibatkan performa yang lebih baik.

Skenario lain di mana buffering terjadi adalah ketika Anda mengunggah data dengan panggilan REST paralel untuk memaksimalkan throughput jaringan. Pustaka klien memerlukan sumber yang dapat mereka baca secara paralel, dan karena aliran berurutan, klien Storage menyangga data untuk setiap panggilan REST individu sebelum memulai unggahan. Perilaku buffering ini terjadi bahkan jika aliran yang disediakan dapat dicari.

Untuk menghindari buffering selama panggilan pengunggahan asinkron, Anda harus menyediakan aliran yang dapat dicari dan diatur MaximumConcurrency ke 1. Meskipun strategi ini harus berfungsi dalam sebagian besar situasi, masih mungkin untuk buffering terjadi jika kode Anda menggunakan fitur pustaka klien lain yang memerlukan buffering.

InitialTransferSize saat diunggah

Ketika aliran yang dapat dicari disediakan untuk diunggah, panjang streaming diperiksa terhadap nilai InitialTransferSize. Jika panjang aliran kurang dari nilai ini, seluruh aliran diunggah sebagai satu panggilan REST, terlepas dari nilai lain StorageTransferOptions . Jika tidak, unggahan dilakukan di beberapa bagian seperti yang dijelaskan sebelumnya. InitialTransferSize tidak berpengaruh pada aliran yang tidak dapat dicari dan diabaikan.

Pertimbangan performa untuk unduhan

Selama pengunduhan, pustaka klien Storage membagi permintaan unduhan tertentu menjadi beberapa subdownload berdasarkan nilai yang ditentukan dalam StorageTransferOptions instans. 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.

Buffering selama pengunduhan

Menerima beberapa respons HTTP secara bersamaan dengan konten isi memiliki implikasi untuk penggunaan memori. Namun, pustaka klien Storage tidak secara eksplisit menambahkan langkah buffer untuk konten yang diunduh. Respons masuk diproses secara berurutan. Pustaka klien mengonfigurasi buffer 16 kilobyte untuk menyalin aliran dari aliran respons HTTP ke aliran tujuan atau jalur file yang disediakan pemanggil.

InitialTransferSize saat diunduh

Selama pengunduhan, pustaka klien Storage membuat satu permintaan rentang unduhan menggunakan InitialTransferSize 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 MaximumTransferSize unduhan lengkap selesai.

Langkah berikutnya