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 blockSize
parametru , 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 maxSingleShotSize
wartoś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 BlockBlobParallelUploadOptions
program . 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 downloadToBuffer
biblioteki klienckie usługi Storage dzielą dane żądanie pobierania na wiele podpobierze na podstawie opcji konfiguracji zdefiniowanych przez BlobDownloadToBufferOptions
program . 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);
Powiązana zawartość
- Aby dowiedzieć się więcej na temat czynników, które mogą mieć wpływ na wydajność operacji usługi Azure Storage, zobacz Opóźnienie w usłudze Blob Storage.
- Aby zapoznać się z listą zagadnień projektowych dotyczących optymalizacji wydajności aplikacji korzystających z usługi Blob Storage, zobacz Lista kontrolna wydajności i skalowalności dla usługi Blob Storage.