Ladění výkonu pro nahrávání a stahování pomocí .NET

Když aplikace přenáší data pomocí klientské knihovny Azure Storage pro .NET, může to mít vliv na rychlost, využití paměti a dokonce i na úspěch nebo selhání požadavku. Pokud chcete maximalizovat výkon a spolehlivost přenosů dat, je důležité být proaktivní při konfiguraci možností přenosu klientské knihovny na základě prostředí, ve kterém vaše aplikace běží.

Tento článek vás provede několika aspekty ladění možností přenosu dat a pokyny se týkají všech rozhraní API, které přijímá StorageTransferOptions jako parametr. Při správném ladění může klientská knihovna efektivně distribuovat data mezi více požadavků, což může vést ke zlepšení rychlosti provozu, využití paměti a stability sítě.

Ladění výkonu s využitím StorageTransferOptions

Správné ladění hodnot v StorageTransferOptions je klíčem ke spolehlivému výkonu operací přenosu dat. Přenosy úložiště jsou rozděleny do několika dílčích přenosů na základě hodnot vlastností definovaných v instanci této struktury. Maximální podporovaná velikost přenosu se liší podle provozu a verze služby, proto nezapomeňte zkontrolovat dokumentaci a určit limity. Další informace o omezení velikosti přenosu úložiště objektů blob najdete v tématu Cíle škálování pro úložiště objektů blob.

Následující vlastnosti StorageTransferOptions je možné ladit na základě potřeb vaší aplikace:

Poznámka:

StorageTransferOptions Zatímco struktura obsahuje hodnoty nullable, klientské knihovny budou používat výchozí hodnoty pro každou jednotlivou hodnotu, pokud není zadána. Tato výchozí nastavení jsou obvykle výkonná v prostředí datacentra, ale pravděpodobně nebudou vhodná pro domácí spotřebitelská prostředí. Špatně vyladěné StorageTransferOptions můžou vést k příliš dlouhým operacím a dokonce i vypršení časových limitů požadavků. Nejlepší je být proaktivní při testování hodnot a StorageTransferOptionsjejich ladění na základě potřeb vaší aplikace a prostředí.

InitialTransferSize

InitialTransferSize je velikost prvního požadavku rozsahu v bajtech. Požadavek rozsahu HTTP je částečný požadavek s velikostí definovanou InitialTransferSize v tomto případě. Objekty blob menší, než je tato velikost, se přenesou v jednom požadavku. Objekty blob větší, než je tato velikost, se budou nadále přenášet v blocích velikosti MaximumTransferSize.

Je důležité poznamenat, že zadaná MaximumTransferSizehodnota neomezuje hodnotu, pro kterou definujete InitialTransferSize. InitialTransferSize definuje samostatné omezení velikosti pro počáteční požadavek na provedení celé operace najednou bez převodů. Často se jedná o případ, kdy chcete InitialTransferSize být alespoň tak velká jako hodnota, kterou definujete pro MaximumTransferSize, pokud ne větší. V závislosti na velikosti přenosu dat může být tento přístup výkonnější, protože se přenos dokončí jediným požadavkem a zabrání režii více požadavků.

Pokud si nejste jistí, jaká hodnota je pro vaši situaci nejvhodnější, je bezpečná možnost nastavit InitialTransferSize stejnou hodnotu, pro MaximumTransferSizekterou se používá .

Poznámka:

Pokud použijete BlobClient objekt, nahrajete objekt blob menší, než InitialTransferSize se provede pomocí put blob, a ne put Block.

MaximumConcurrency

MaximumConcurrency je maximální počet pracovních procesů, které lze použít v paralelním přenosu. V současné době mohou přenosy paralelizovat pouze asynchronní operace. Synchronní operace tuto hodnotu ignorují a pracují postupně.

Účinnost této hodnoty podléhá omezením fondu připojení v .NET, což může ve výchozím nastavení omezit výkon v určitých scénářích. Další informace o omezeních fondu připojení v rozhraní .NET najdete v tématu o omezeních fondu rozhraní .NET Framework Připojení ion a nové sadě Azure SDK pro .NET.

MaximumTransferSize

MaximumTransferSize je maximální délka přenosu v bajtech. Jak už bylo zmíněno dříve, tato hodnota neomezuje InitialTransferSize , což může být větší než MaximumTransferSize.

Kvůli efektivnímu přesunu dat nemusí klientské knihovny vždy dosáhnout MaximumTransferSize hodnoty pro každý přenos. V závislosti na operaci se maximální podporovaná hodnota velikosti přenosu může lišit. Například objekty blob bloku, které volají operaci Put Block s verzí služby 2019-12-12 nebo novější, mají maximální velikost bloku 4000 MiB. Další informace o omezení velikosti přenosu úložiště objektů blob najdete v grafu cílů škálování pro úložiště objektů blob.

Příklad kódu

Klientská knihovna obsahuje přetížení pro metody Upload a UploadAsync metody, které přijímají instanci StorageTransferOptions jako součást parametru BlobUploadOptions . Podobné přetížení existují také pro metody DownloadTo a DownloadToAsync použití blobDownloadToOptions parametru.

Následující příklad kódu ukazuje, jak definovat hodnoty pro StorageTransferOptions instanci a předat tyto možnosti konfigurace jako parametr do UploadAsync. Hodnoty uvedené v této ukázce nejsou určené jako doporučení. Pokud chcete tyto hodnoty správně vyladit, musíte zvážit konkrétní potřeby vaší aplikace.

// 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);

V tomto příkladu nastavíme počet pracovních procesů paralelního přenosu na hodnotu 2 pomocí MaximumConcurrency vlastnosti. Tato konfigurace se současně otevře až dvě připojení, což umožňuje paralelní nahrávání. Počáteční požadavek na rozsah HTTP se pokusí nahrát až 8 MiB dat, jak je definováno InitialTransferSize vlastností. Upozorňujeme, že InitialTransferSize platí jenom pro nahrávání při použití vyhledatelného datového proudu. Pokud je velikost objektu blob menší než 8 MiB, k dokončení operace je potřeba jenom jeden požadavek. Pokud je velikost objektu blob větší než 8 MiB, všechny následné žádosti o přenos mají maximální velikost 4 MiB, kterou jsme nastavili s MaximumTransferSize vlastností.

Důležité informace o výkonu pro nahrávání

Během nahrávání rozdělí klientské knihovny služby Storage daný datový proud pro nahrání do několika dílčích částí na základě hodnot definovaných v StorageTransferOptions instanci. Každá dílčí část má vlastní vyhrazené volání operace REST. U objektu nebo BlockBlobClient objektu BlobClient je tato operace put Block. DataLakeFileClient Pro objekt je tato operace připojená data. Klientská knihovna služby Storage spravuje tyto operace REST paralelně (v závislosti na možnostech přenosu) a dokončí úplné nahrávání.

V závislosti na tom, jestli je stream nahrávání vyhledatelný nebo nehledají, klientská knihovna zpracovává ukládání do vyrovnávací paměti a InitialTransferSize odlišně, jak je popsáno v následujících částech. Vyhledávatelný datový proud je datový proud, který podporuje dotazování a úpravu aktuální pozice v rámci datového proudu. Další informace o datových proudech v .NET najdete v referenčních informacích ke třídě Stream.

Poznámka:

Objekty blob bloku mají maximální počet bloků 50 000 bloků. Maximální velikost objektu blob bloku je 50 000krát MaximumTransferSize.

Ukládání do vyrovnávací paměti během nahrávání

Vrstva REST úložiště nepodporuje vyzvednutí operace nahrávání REST tam, kde jste skončili; individuální převody jsou buď dokončeny, nebo ztraceny. Aby se zajistila odolnost proti nenahrání nehledajících datových proudů, klientské knihovny služby Storage uloží data do vyrovnávací paměti pro každé jednotlivé volání REST před zahájením nahrávání. Kromě omezení rychlosti sítě je toto chování ukládání do vyrovnávací paměti důvodem, proč zvážit menší hodnotu pro MaximumTransferSize, a to i při nahrávání v posloupnosti. Snížením hodnoty MaximumTransferSize se sníží maximální množství dat, která jsou na každém požadavku uložena do vyrovnávací paměti, a každé opakování neúspěšného požadavku. Pokud dochází k častým vypršením časového limitu během přenosů dat určité velikosti, snižte hodnotu MaximumTransferSize zkrácení doby ukládání do vyrovnávací paměti a může vést k lepšímu výkonu.

Dalším scénářem, kdy dochází k ukládání do vyrovnávací paměti, je nahrávání dat s paralelními voláními REST za účelem maximalizace propustnosti sítě. Klientské knihovny potřebují zdroje, které můžou číst paralelně, a protože streamy jsou sekvenční, klientské knihovny služby Storage ukládají data do vyrovnávací paměti pro každé jednotlivé volání REST před zahájením nahrávání. K tomuto chování ukládání do vyrovnávací paměti dochází i v případě, že je zadaný datový proud vyhledatelný.

Abyste se vyhnuli ukládání do vyrovnávací paměti během asynchronního volání nahrávání, musíte zadat vyhledatelný datový proud a nastavit MaximumConcurrency hodnotu 1. I když by tato strategie měla ve většině situací fungovat, může dojít k ukládání do vyrovnávací paměti, pokud váš kód používá jiné funkce klientské knihovny, které vyžadují ukládání do vyrovnávací paměti.

InitialTransferSize při nahrávání

Pokud je pro nahrání k dispozici vyhledatelný datový proud, je délka datového InitialTransferSizeproudu kontrolována proti hodnotě . Pokud je délka datového proudu menší než tato hodnota, celý datový proud se nahraje jako jedno volání REST bez ohledu na jiné StorageTransferOptions hodnoty. V opačném případě se nahrávání provádí ve více částech, jak je popsáno výše. InitialTransferSize nemá žádný vliv na nehledající datový proud a je ignorován.

Důležité informace o výkonu při stahování

Během stahování klientské knihovny služby Storage rozdělí danou žádost o stažení na několik dílčích částí na základě hodnot definovaných v StorageTransferOptions instanci. Každá dílčí část má vlastní vyhrazené volání operace REST. V závislosti na možnostech přenosu klientské knihovny spravují tyto operace REST paralelně, aby se dokončilo úplné stahování.

Ukládání do vyrovnávací paměti během stahování

Příjem více odpovědí HTTP současně s obsahem těla má vliv na využití paměti. Klientské knihovny služby Storage ale explicitně nepřidají krok vyrovnávací paměti pro stažený obsah. Příchozí odpovědi se zpracovávají v pořadí. Klientské knihovny konfigurují vyrovnávací paměť 16 kilobajtů pro kopírování datových proudů z datového proudu odpovědi HTTP do cílového streamu nebo cesty k souboru poskytnutému volajícím.

InitialTransferSize při stahování

Během stahování klientské knihovny služby Storage před provedením čehokoli jiného vytvoří jednu žádost o InitialTransferSize rozsah stahování. Během této počáteční žádosti o stažení klientské knihovny znají celkovou velikost prostředku. Pokud se počáteční požadavek úspěšně stáhl veškerý obsah, operace se dokončí. V opačném případě klientské knihovny nadále můžou provádět žádosti o rozsah až do MaximumTransferSize dokončení úplného stahování.

Další kroky