Udostępnij za pośrednictwem


Dostrajanie wydajności przekazywania i pobierania za pomocą języka JavaScript

Gdy aplikacja przesyła dane przy użyciu biblioteki klienta usługi Azure Storage dla języka JavaScript, istnieje kilka czynników, które mogą mieć wpływ na szybkość, użycie pamięci, a nawet powodzenie lub niepowodzenie żądania. Aby zmaksymalizować wydajność i niezawodność transferów danych, ważne jest, aby aktywnie konfigurować opcje transferu biblioteki klienta w oparciu o środowisko, w których działa aplikacja.

W tym artykule przedstawiono kilka zagadnień dotyczących dostrajania opcji transferu danych. Odpowiednio dostrojona biblioteka klienta może efektywnie dystrybuować dane między wieloma żądaniami, co może spowodować zwiększenie szybkości działania, użycia pamięci i stabilności sieci.

Dostrajanie wydajności przekazywania

Prawidłowe dostrajanie opcji transferu danych jest kluczem do niezawodnej wydajności przekazywania. Transfery magazynu są podzielone na kilka podtransferów na podstawie wartości tych argumentów. Maksymalny obsługiwany rozmiar transferu różni się w zależności od wersji operacji i usługi, dlatego zapoznaj się z dokumentacją, aby określić limity. Aby uzyskać więcej informacji na temat limitów rozmiaru transferu dla usługi Blob Storage, zobacz Skalowanie obiektów docelowych dla usługi Blob Storage.

Ustawianie opcji transferu dla przekazywania

Właściwości można skonfigurować w bloku BlockBlobParallelUploadOptions , aby zwiększyć wydajność operacji transferu danych. W poniższej tabeli wymieniono właściwości, które można skonfigurować, wraz z opisem:

Właściwości opis
blockSize Maksymalny rozmiar bloku do przeniesienia dla każdego żądania w ramach operacji przekazywania. Aby dowiedzieć się więcej, zobacz blockSize.
maxSingleShotSize Jeśli rozmiar danych jest mniejszy lub równy tej wartości, zostanie przekazany w jednym miejscu, a nie podzielony na fragmenty. Jeśli dane są przekazywane w jednym zdjęciu, rozmiar bloku jest ignorowany. Wartość domyślna to 256 MB. Jeśli dostosujesz tę właściwość, musisz użyć wartości mniejszej lub równej 256 MB. Aby dowiedzieć się więcej, zobacz maxSingleShotSize.
concurrency Maksymalna liczba żądań równoległych, które są wydawane w danym momencie w ramach pojedynczego transferu równoległego.

Uwaga

Biblioteki klienckie będą używać wartości domyślnych dla każdej opcji transferu danych, jeśli nie zostanie podana. Te wartości domyślne są zwykle wykonywane w środowisku centrum danych, ale prawdopodobnie nie będą odpowiednie dla środowisk użytkownika domowego. Źle dostrojone opcje transferu danych mogą spowodować zbyt długie operacje, a nawet przekroczenia limitu czasu żądania. Najlepiej proaktywnie testować te wartości i dostrajać je w zależności od potrzeb aplikacji i środowiska.

maxSingleShotSize

Wartość maxSingleShotSize to maksymalny rozmiar obiektu blob w bajtach dla przekazywania pojedynczego żądania.

Jeśli rozmiar danych jest mniejszy lub równy maxSingleShotSize, obiekt blob jest przekazywany za pomocą pojedynczego żądania Put Blob . Jeśli rozmiar obiektu blob jest większy niż maxSingleShotSize, lub jeśli rozmiar obiektu blob jest nieznany, obiekt blob jest przekazywany we fragmentach przy użyciu serii wywołań Put Block , a następnie Put Block List.

Należy pamiętać, że określona blockSize wartość nie ogranicza wartości zdefiniowanej dla elementu maxSingleShotSize. Argument maxSingleShotSize definiuje oddzielne ograniczenie rozmiaru dla żądania do wykonania całej operacji jednocześnie bez podtransferów. Często zdarza się, że chcesz maxSingleShotSize być co najmniej tak duża, jak wartość zdefiniowana dla blockSizeparametru , jeśli nie jest większa. W zależności od rozmiaru transferu danych takie podejście może być bardziej wydajne, ponieważ transfer jest wykonywany przy użyciu jednego żądania i pozwala uniknąć narzutów na wiele żądań.

Jeśli nie masz pewności, jaka wartość jest najlepsza dla twojej sytuacji, bezpieczna opcja to ustawienie maxSingleShotSize tej samej wartości używanej dla elementu blockSize.

blockSize

Wartość blockSize jest maksymalną długością transferu w bajtach podczas przekazywania blokowego obiektu blob we fragmentach.

Jak wspomniano wcześniej, ta wartość nie ogranicza maxSingleShotSizewartości , która może być większa niż blockSize.

Aby wydajnie przenosić dane, biblioteki klienckie mogą nie zawsze osiągać blockSize wartość dla każdego transferu. W zależności od operacji maksymalna obsługiwana wartość rozmiaru transferu może się różnić. Aby uzyskać więcej informacji na temat limitów rozmiaru transferu dla usługi Blob Storage, zobacz wykres w temacie Skalowanie obiektów docelowych dla usługi Blob Storage.

Przykład kodu

Poniższy przykład kodu przedstawia sposób ustawiania wartości dla metody BlockBlobParallelUploadOptions i dołączania opcji w ramach wywołania metody przekazywania. Wartości podane w przykładach nie są przeznaczone do zalecenia. Aby prawidłowo dostosować te wartości, należy wziąć pod uwagę konkretne potrzeby aplikacji.

// Specify data transfer options
const uploadOptions = {
  blockSize: 4 * 1024 * 1024, // 4 MiB max block size
  concurrency: 2, // maximum number of parallel transfer workers
  maxSingleShotSize: 8 * 1024 * 1024, // 8 MiB initial transfer size
} 

// Create blob client from container client
const blockBlobClient = containerClient.getBlockBlobClient(blobName);

// Upload blob with transfer options
await blockBlobClient.uploadFile(localFilePath, uploadOptions);

W tym przykładzie ustawiliśmy maksymalną liczbę równoległych procesów transferowych na 2 przy użyciu concurrency właściwości . Ustawiliśmy również wartość maxSingleShotSize 8 MiB. Jeśli rozmiar obiektu blob jest mniejszy niż 8 MiB, tylko jedno żądanie jest niezbędne do ukończenia operacji przekazywania. Jeśli rozmiar obiektu blob jest większy niż 8 MiB, obiekt blob jest przekazywany we fragmentach z maksymalnym rozmiarem fragmentu wynoszącym 4 MiB, który definiujemy we blockSize właściwości .

Zagadnienia dotyczące wydajności przekazywania

Podczas przekazywania biblioteki klienta usługi Storage dzielą dany strumień przekazywania na wiele podciążeń na podstawie opcji konfiguracji zdefiniowanych przez BlockBlobParallelUploadOptionsprogram . Każdy podładunek ma własne dedykowane wywołanie operacji REST. W tym przykładzie operacja to Put Block. Biblioteka klienta usługi Storage zarządza tymi operacjami REST równolegle (w zależności od opcji transferu), aby ukończyć pełne przekazywanie.

Uwaga

Blokowe obiekty blob mają maksymalną liczbę bloków wynoszącą 50 000 bloków. Maksymalny rozmiar blokowego obiektu blob to 50 000 razy block_size.

Buforowanie podczas przekazywania

Warstwa REST magazynu nie obsługuje wybierania operacji przekazywania REST, w której została przerwana; indywidualne transfery są ukończone lub utracone. Aby zapewnić odporność na przekazywanie strumienia, biblioteki klienckie usługi Storage buforują dane dla każdego wywołania REST przed rozpoczęciem przekazywania. Oprócz ograniczeń szybkości sieci zachowanie buforowania jest powodem, dla którego należy wziąć pod uwagę mniejszą wartość blockSize, nawet w przypadku przekazywania w sekwencji. Zmniejszenie wartości blockSize zmniejsza maksymalną ilość danych buforowanych dla każdego żądania i ponawianie próby żądania, które zakończyło się niepowodzeniem. Jeśli występują częste przekroczenia limitu czasu podczas transferów danych o określonym rozmiarze, zmniejszenie wartości blockSize skrócenia czasu buforowania i może spowodować lepszą wydajność.

Dostrajanie wydajności pobierania

Dostrajanie opcji transferu danych do pobrania jest dostępne tylko w przypadku korzystania z metody downloadToBuffer . Ta metoda pobiera obiekt blob równolegle do buforu na podstawie wartości zdefiniowanych w obiekcie BlobDownloadToBufferOptions. Inne metody pobierania nie obsługują opcji dostrajania transferu danych.

Ustawianie opcji transferu dla pobierania

Podczas korzystania z downloadToBuffer metody można dostroić następujące wartości do pobrania:

  • blockSize: maksymalny rozmiar bloku do przeniesienia dla każdego żądania.
  • współbieżność: maksymalna liczba żądań równoległych wystawionych w danym momencie w ramach pojedynczego transferu równoległego.

Zagadnienia dotyczące wydajności pobierania

Podczas pobierania przy użyciu programu downloadToBufferbiblioteki klienckie usługi Storage dzielą dane żądanie pobierania na wiele podpobierze na podstawie opcji konfiguracji zdefiniowanych przez BlobDownloadToBufferOptionsprogram . Każde podpobierz ma własne dedykowane wywołanie operacji REST. W zależności od opcji transferu biblioteki klienckie zarządzają tymi operacjami REST równolegle w celu ukończenia pełnego pobierania.

Przykład kodu

Poniższy przykład kodu pokazuje, jak ustawić wartości dla obiektu BlobDownloadToBufferOptions i uwzględnić opcje w ramach wywołania metody downloadToBuffer . Wartości podane w przykładach nie są przeznaczone do zalecenia. Aby prawidłowo dostosować te wartości, należy wziąć pod uwagę konkretne potrzeby aplikacji.

// Specify data transfer options
const downloadToBufferOptions = {
    blockSize: 4 * 1024 * 1024, // 4 MiB max block size
    concurrency: 2, // maximum number of parallel transfer workers
}

// Download data to buffer
const result = await client.downloadToBuffer(offset, count, downloadToBufferOptions);