Udostępnij za pomocą


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 przesyłania

Prawidłowe dostrajanie opcji transferu danych jest kluczem do niezawodnej wydajności przekazywania. Transfery danych 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.

Ustaw opcje transferu dla wysyłania

Możesz skonfigurować właściwości w 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 transferu dla każdego żądania w ramach operacji uploadu. 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 naraz, 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ą zazwyczaj wydajne w środowisku centrum danych, ale prawdopodobnie nie będą odpowiednie dla środowiska 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.

MaksymalnyRozmiarPojedynczegoStrzału

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, jest on przesyłany we fragmentach za pomocą serii wywołań Put Block, a następnie Put Block List.

Należy pamiętać, że określona blockSizewartość 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, aby maxSingleShotSize była co najmniej tak duża jak wartość, którą definiujesz dla blockSize, jeśli nie 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 przesyłania blokowego blobu we fragmentach.

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

Aby wydajnie przesyłać dane, biblioteki klienckie mogą nie zawsze osiągać wartości blockSize 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 BlockBlobParallelUploadOptions i dołączania tych opcji w ramach wywołania metody przesyłania. 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, korzystając z właściwości concurrency. 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 wysyłania

Podczas przesyłania biblioteki klienta Storage dzielą dany strumień przesyłania na wiele podprzesyłów na podstawie opcji konfiguracji zdefiniowanych przez BlockBlobParallelUploadOptions. Każdy częściowy przesył ma swoje 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 jest równy 50 000 razy rozmiarowi block_size.

Buforowanie podczas przekazywania

Warstwa REST magazynowania nie obsługuje kontynuowania operacji przesyłania REST od miejsca przerwania; indywidualne transfery są albo zakończone, albo 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 danym rozmiarze, zmniejszenie wartości blockSize skraca czas buforowania i może prowadzić do lepszej wydajności.

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 dotyczące pobierania.

  • 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 downloadToBuffer biblioteki klienckie Storage dzielą dane żądanie pobierania na wiele podpobrań na podstawie opcji konfiguracji zdefiniowanych przez BlobDownloadToBufferOptions. Każde pobranie podrzędne ma własne 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ć te opcje przy wywołaniu 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);