Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
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:
- InitialTransferSize - ukuran permintaan pertama dalam byte
- MaximumConcurrency - jumlah maksimum subtransfer yang dapat digunakan secara paralel
- MaximumTransferSize - panjang maksimum transfer dalam byte
Catatan
Meskipun struct StorageTransferOptions berisi nilai yang dapat bernilai null, perpustakaan klien akan menggunakan nilai default untuk setiap nilai individu, jika tidak disediakan. Pengaturan bawaan ini biasanya berkinerja baik di lingkungan pusat data, tetapi kemungkinan besar tidak 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 ukurannya lebih besar dari ini akan terus dipindahkan 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.
JumlahKejadianMaksimum
MaximumConcurrency adalah jumlah maksimum pekerja yang dapat digunakan dalam transfer paralel. Saat ini, hanya operasi asinkron yang dapat memperparalelkan 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. Anda dapat menggunakan kode berikut untuk meningkatkan batas koneksi default (yang biasanya dua di lingkungan klien atau sepuluh di lingkungan server) menjadi 100. Biasanya, Anda harus mengatur nilainya kira-kira sejumlah alur yang digunakan oleh aplikasi Anda. Atur batas koneksi sebelum membuka koneksi apa pun.
ServicePointManager.DefaultConnectionLimit = 100; //(Or More)
Untuk mempelajari selengkapnya tentang batas kumpulan koneksi di .NET Framework, lihat Batas Kumpulan Koneksi .NET Framework dan Azure SDK baru untuk .NET.
Untuk informasi selengkapnya, lihat metode ThreadPool.SetMinThreads.
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, perpustakaan klien mungkin tidak selalu mencapai nilai MaximumTransferSize untuk setiap transfer. Tergantung pada operasi, nilai maksimum yang didukung untuk ukuran transfer dapat bervariasi. Misalnya, untuk blob blok yang melakukan operasi Put Block dengan versi layanan 2019-12-12 atau lebih baru, ukuran blok maksimum adalah 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 overload untuk metode Upload dan UploadAsync, yang menerima instans StorageTransferOptions sebagai bagian dari parameter BlobUploadOptions. Kelebihan beban serupa juga ada untuk metode DownloadTo 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 .
Meningkatkan jumlah minimum utas pemrosesan
Jika Anda menggunakan panggilan sinkron bersama dengan tugas asinkron, Anda mungkin ingin meningkatkan jumlah utas di kumpulan utas:
ThreadPool.SetMinThreads(100,100); //(Determine the right number for your application)
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 REST dari Penyimpanan tidak mendukung melanjutkan operasi pengunggahan REST dari titik terakhir; setiap transfer individu harus diselesaikan atau akan hilang. Untuk memastikan ketahanan dalam unggahan aliran yang tidak memungkinkan akses acak, perpustakaan klien Storage melakukan buffering data 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 memiliki efek pada stream yang tidak dapat diakses 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 tersendiri 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 pada saat mengunduh
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 akan terus membuat permintaan berkisar hingga MaximumTransferSize unduhan lengkap selesai.
Langkah berikutnya
- Artikel ini adalah bagian dari panduan pengembang Blob Storage untuk .NET. Lihat daftar lengkap artikel panduan pengembang di Membangun aplikasi Anda.
- Untuk memahami lebih lanjut tentang faktor-faktor yang dapat memengaruhi performa untuk operasi Azure Storage, lihat Latensi di penyimpanan Blob.
- Untuk melihat daftar pertimbangan desain untuk mengoptimalkan performa aplikasi menggunakan penyimpanan Blob, lihat Daftar periksa performa dan skalabilitas untuk penyimpanan Blob.