Dostrajanie wydajności przekazywania i pobierania za pomocą języka Java
Gdy aplikacja przesyła dane przy użyciu biblioteki klienta usługi Azure Storage dla języka Java, 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
Możesz skonfigurować wartości w elem . ParallelTransferOptions w celu zwiększenia wydajności operacji transferu danych. Następujące wartości można dostroić do przekazywania na podstawie potrzeb aplikacji:
- maxSingleUploadSize: maksymalny rozmiar obiektu blob w bajtach dla przekazywania pojedynczego żądania.
- blockSize: maksymalny rozmiar bloku do przeniesienia dla każdego żądania.
- maxConcurrency: maksymalna liczba żądań równoległych wystawionych 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.
maxSingleUploadSize
Wartość maxSingleUploadSize
to maksymalny rozmiar obiektu blob w bajtach dla przekazywania pojedynczego żądania. Tę wartość można ustawić przy użyciu następującej metody:
Jeśli rozmiar danych jest mniejszy lub równy maxSingleUploadSize
, obiekt blob jest przekazywany za pomocą pojedynczego żądania Put Blob . Jeśli rozmiar obiektu blob jest większy niż maxSingleUploadSize
, 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 umieść listę bloków.
Należy pamiętać, że określona blockSize
wartość nie ogranicza wartości zdefiniowanej dla elementu maxSingleUploadSize
. Argument maxSingleUploadSize
definiuje oddzielne ograniczenie rozmiaru dla żądania do wykonania całej operacji jednocześnie bez podtransferów. Często zdarza się, że chcesz maxSingleUploadSize
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 maxSingleUploadSize
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. Tę wartość można ustawić przy użyciu następującej metody:
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 maxSingleUploadSize
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.
maxConcurrency
Wartość maxConcurrency
jest maksymalną liczbą żądań równoległych wydanych w danym momencie w ramach pojedynczego transferu równoległego. Tę wartość można ustawić przy użyciu następującej metody:
Przykład kodu
Upewnij się, że masz następującą import
dyrektywę do użycia ParallelTransferOptions
na potrzeby przekazywania:
import com.azure.storage.blob.models.*;
Poniższy przykład kodu pokazuje, jak ustawić wartości dla parallelTransferOptions i uwzględnić opcje w ramach wystąpienia BlobUploadFromFileOptions . Jeśli nie przekazujesz z pliku, możesz ustawić podobne opcje przy użyciu polecenia BlobParallelUploadOptions. Wartości podane w tym przykładzie nie są przeznaczone do zalecenia. Aby prawidłowo dostosować te wartości, należy wziąć pod uwagę konkretne potrzeby aplikacji.
ParallelTransferOptions parallelTransferOptions = new ParallelTransferOptions()
.setBlockSizeLong((long) (4 * 1024 * 1024)) // 4 MiB block size
.setMaxConcurrency(2)
.setMaxSingleUploadSizeLong((long) 8 * 1024 * 1024); // 8 MiB max size for single request upload
BlobUploadFromFileOptions options = new BlobUploadFromFileOptions("<localFilePath>");
options.setParallelTransferOptions(parallelTransferOptions);
Response<BlockBlobItem> blockBlob = blobClient.uploadFromFileWithResponse(options, null, null);
W tym przykładzie ustawiliśmy maksymalną liczbę procesów roboczych transferu równoległego na 2 przy użyciu setMaxConcurrency
metody . Ustawiliśmy maxSingleUploadSize
również wartość 8 MiB przy użyciu setMaxSingleUploadSizeLong
metody . 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 ustawiliśmy przy użyciu setBlockSizeLong
metody .
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 ParallelTransferOptions
program . Każdy podładunek ma własne dedykowane wywołanie operacji REST. BlobClient
W przypadku obiektu ta 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
skraca czas buforowania i może spowodować lepszą wydajność.
Dostrajanie wydajności pobierania
Prawidłowe dostrajanie opcji transferu danych jest kluczem do niezawodnej wydajności pobierania. Transfery magazynu są podzielone na kilka podtransferów na podstawie wartości zdefiniowanych w pliku ParallelTransferOptions
.
Ustawianie opcji transferu dla pobierania
W zależności od potrzeb aplikacji można dostroić następujące wartości do pobrania:
blockSize
: maksymalny rozmiar bloku do przeniesienia dla każdego żądania. Tę wartość można ustawić przy użyciu metody setBlockSizeLong .maxConcurrency
: maksymalna liczba żądań równoległych wydanych w danym momencie w ramach pojedynczego transferu równoległego. Tę wartość można ustawić przy użyciu metody setMaxConcurrency .
Przykład kodu
Upewnij się, że masz następującą import
dyrektywę, która ma być używana ParallelTransferOptions
do pobrania:
import com.azure.storage.common.*;
W poniższym przykładzie kodu pokazano, jak ustawić wartości dla parametru ParallelTransferOptions i uwzględnić opcje w ramach wystąpienia obiektu BlobDownloadToFileOptions .
ParallelTransferOptions parallelTransferOptions = new ParallelTransferOptions()
.setBlockSizeLong((long) (4 * 1024 * 1024)) // 4 MiB block size
.setMaxConcurrency(2);
BlobDownloadToFileOptions options = new BlobDownloadToFileOptions("<localFilePath>");
options.setParallelTransferOptions(parallelTransferOptions);
blobClient.downloadToFileWithResponse(options, null, null);
Zagadnienia dotyczące wydajności pobierania
Podczas pobierania biblioteki klienckie usługi Storage dzielą dane żądanie pobierania na wiele podpobierze na podstawie opcji konfiguracji zdefiniowanych przez ParallelTransferOptions
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.
Następne kroki
- Ten artykuł jest częścią przewodnika dla deweloperów usługi Blob Storage dla języka Java. Zobacz pełną listę artykułów z przewodnika dla deweloperów na stronie Tworzenie aplikacji.
- 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.