Freigeben über


Leistungsoptimierung für Uploads und Downloads mit Go

Wenn eine Anwendung Daten unter Verwendung der Azure Storage-Clientbibliothek für Go überträgt, gibt es mehrere Faktoren, die sich auf die Geschwindigkeit, die Arbeitsspeicherauslastung und sogar auf den Erfolg der Anforderung auswirken können. Um die Leistung und Zuverlässigkeit bei Datenübertragungen zu maximieren, ist es wichtig, proaktiv die Übertragungsoptionen für Clientbibliotheken basierend auf der Umgebung zu konfigurieren, in der Ihre App ausgeführt wird.

In diesem Artikel werden mehrere Überlegungen zum Optimieren von Datenübertragungsoptionen erläutert. Bei ordnungsgemäßer Optimierung kann die Clientbibliothek Daten effizient auf mehrere Anforderungen verteilen, um die Betriebsgeschwindigkeit, Arbeitsspeicherauslastung und Netzwerkstabilität zu verbessern.

Leistungsoptimierung für Uploads

Die richtige Optimierung von Datenübertragungsoptionen ist der Schlüssel für eine zuverlässige Leistung bei Uploads. Speicherübertragungen werden basierend auf den Werten dieser Eigenschaften in mehrere Teilübertragungen unterteilt. Die maximale unterstützte Übertragungsgröße variiert je nach Vorgang und Dienstversion. Überprüfen Sie daher unbedingt die Dokumentation, um die Grenzwerte zu ermitteln. Weitere Informationen zu Grenzwerten im Zusammenhang mit Übertragungsgröße für Blob Storage finden Sie unter Skalierbarkeitsziele für Blob Storage.

Festlegen von Übertragungsoptionen für Uploads

Wenn die Gesamtgröße des Blobs kleiner oder gleich 256 MB ist, werden die Daten mit einer einzelnen Put Blob-Anforderung hochgeladen. Wenn die Blobgröße größer als 256 MB oder unbekannt ist, wird das Blob mithilfe einer Reihe von Put Block-Aufrufen, gefolgt von Put Block List, in Blöcken hochgeladen.

Die folgenden Eigenschaften können basierend auf den Anforderungen Ihrer App konfiguriert und optimiert werden:

  • BlockSize: Die maximale Länge einer Übertragung in Bytes, wenn ein Blockblob in Blöcken hochgeladen wird. Der Standardwert ist 4 MB.
  • Concurrency: Die maximale Anzahl von Teilübertragungen, die parallel verwendet werden können. Der Standardwert ist 5.

Diese Konfigurationsoptionen stehen beim Hochladen mit den folgenden Methoden zur Verfügung:

Die Upload-Methode unterstützt diese Optionen nicht und lädt Daten in einer einzigen Anforderung hoch.

Hinweis

Sofern nicht angegeben, verwenden die Clientbibliotheken für jede Datenübertragungsoption Standardwerte. Mit diesen Standardwerten lässt sich zwar in der Regel in einer Rechenzentrumsumgebung eine hohe Leistung erzielen, für Umgebungen von Privatanwendern sind sie jedoch eher nicht geeignet. Unzureichend optimierte Datenübertragungsoptionen können zu übermäßig langen Vorgängen und sogar zu Anforderungstimeouts führen. Es empfiehlt sich, diese Werte proaktiv zu testen und dann basierend auf den Anforderungen Ihrer Anwendung und Umgebung zu optimieren.

BlockSize

Das Argument BlockSize ist die maximale Länge einer Übertragung in Bytes beim Hochladen eines Blockblobs in Blöcken.

Zur Gewährleistung eines effizienten Datenflusses erreichen die Clientbibliotheken möglicherweise nicht bei jeder Übertragung den Wert von BlockSize. Je nach Vorgang kann der unterstützte Maximalwert für die Übertragungsgröße variieren. Weitere Informationen zu Grenzwerten im Zusammenhang mit der Übertragungsgröße für Blob Storage finden Sie im Diagramm unter Skalierbarkeitsziele für Blob Storage.

Codebeispiel

Das folgende Codebeispiel zeigt, wie Sie Werte für eine UploadFileOptions-Instanz definieren und diese Konfigurationsoptionen als Parameter an UploadFile übergeben.

Die in diesem Beispiel angegebenen Werte sind nicht als Empfehlungen zu verstehen. Zur ordnungsgemäßen Optimierung dieser Werte müssen die spezifischen Anforderungen Ihrer App berücksichtigt werden.

func uploadBlobWithTransferOptions(client *azblob.Client, containerName string, blobName string) {
    // Open the file for reading
    file, err := os.OpenFile("path/to/sample/file", os.O_RDONLY, 0)
    handleError(err)

    defer file.Close()

    // Upload the data to a block blob with transfer options
    _, err = client.UploadFile(context.TODO(), containerName, blobName, file,
        &azblob.UploadFileOptions{
            BlockSize:   int64(8 * 1024 * 1024), // 8 MiB
            Concurrency: uint16(2),
        })
    handleError(err)
}

In diesem Beispiel wird die Anzahl von Workern für die parallele Übertragung mithilfe des Felds Concurrency auf „2“ festgelegt. Bei dieser Konfiguration werden bis zu zwei Verbindungen gleichzeitig geöffnet, um einen parallelen Uploadvorgang zu ermöglichen. Wenn die Blobgröße größer als 256 MiB ist, wird das Blob in Blöcken mit einer maximalen Blockgröße von 8 MiB hochgeladen, wie durch das Feld Block_Size festgelegt wurde.

Überlegungen zur Leistung bei Uploads

Während eines Uploads teilen die Storage-Clientbibliotheken einen bestimmten Uploaddatenstrom in mehrere Teiluploads auf, die auf den während der Clientkonstruktion definierten Konfigurationsoptionen basieren. Jeder Teilupload verfügt über einen eigenen dedizierten Aufruf des REST-Vorgangs. Die Storage-Clientbibliothek verwaltet diese REST-Vorgänge parallel (abhängig von den Übertragungsoptionen), um den gesamten Upload abzuschließen.

In den folgenden Abschnitten erfahren Sie, wie die Clientbibliothek die Pufferung durchführt.

Hinweis

Blockblobs haben eine maximale Blockanzahl von 50.000 Blöcken. Die maximale Größe Ihres Blockblobs entspricht also 50.000 mal Block_Size.

Puffern bei Uploads

Das Fortsetzen angehaltener REST-Uploadvorgänge wird von der Storage-REST-Ebene nicht unterstützt. Einzelne Übertragungen werden entweder abgeschlossen oder gehen verloren. Um bei Datenstromuploads Resilienz sicherzustellen, puffern die Storage-Clientbibliotheken Daten für jeden einzelnen REST-Aufruf, bevor der Upload gestartet wird. Neben den Einschränkungen durch die Netzwerkgeschwindigkeit ist dieses Pufferverhalten ein Grund dafür, einen kleineren Wert für BlockSize in Betracht zu ziehen, auch wenn Uploadvorgänge nacheinander ausgeführt werden. Durch Verringern des Werts von BlockSize verringert sich die maximale Datenmenge, die für die einzelnen Anforderungen bzw. für Wiederholungsversuche bei fehlerhaften Anforderungen gepuffert wird. Falls bei Datenübertragungen mit einer bestimmten Größe häufig Timeouts auftreten, verringert die Senkung des Werts von BlockSize die Pufferzeit, was wiederum die Leistung verbessern kann.

Leistungsoptimierung für Downloads

Die richtige Optimierung von Datenübertragungsoptionen ist der Schlüssel für eine zuverlässige Leistung bei Downloads. Speicherübertragungen werden basierend auf den Werten dieser Eigenschaften in mehrere Teilübertragungen unterteilt.

Festlegen von Übertragungsoptionen für Downloads

Die folgenden Eigenschaften können basierend auf den Anforderungen Ihrer App optimiert werden:

  • BlockSize: Die maximale Blockgröße, die zum Herunterladen eines Blobs verwendet wird. Der Standardwert ist 4 MB.
  • Concurrency: Die maximale Anzahl von Teilübertragungen, die parallel verwendet werden können. Der Standardwert ist 5.

Diese Optionen stehen beim Herunterladen mit den folgenden Methoden zur Verfügung:

Die DownloadStream-Methode unterstützt diese Optionen nicht und lädt Daten in einer einzigen Anforderung herunter.

Codebeispiel

Das folgende Codebeispiel zeigt, wie Sie Werte für eine DownloadFileOptions-Instanz definieren und diese Konfigurationsoptionen als Parameter an DownloadFile übergeben.

Die in diesem Beispiel angegebenen Werte sind nicht als Empfehlungen zu verstehen. Zur ordnungsgemäßen Optimierung dieser Werte müssen die spezifischen Anforderungen Ihrer App berücksichtigt werden.

func downloadBlobTransferOptions(client *azblob.Client, containerName string, blobName string) {
    // Create or open a local file where we can download the blob
	file, err := os.Create("path/to/sample/file")
	handleError(err)

	// Download the blob to the local file
	_, err = client.DownloadFile(context.TODO(), containerName, blobName, file,
		&azblob.DownloadFileOptions{
			BlockSize:   int64(4 * 1024 * 1024), // 4 MiB
			Concurrency: uint16(2),
		})
	handleError(err)
}

Überlegungen zur Leistung bei Downloads

Während eines Downloads teilen die Storage-Clientbibliotheken eine bestimmte Downloadanforderung in mehrere Teildownloads auf, die auf den während der Clientkonstruktion definierten Konfigurationsoptionen basieren. Jeder Teildownload verfügt über einen eigenen dedizierten Aufruf des REST-Vorgangs. Abhängig von den Übertragungsoptionen verwalten die Clientbibliotheken die REST-Vorgänge parallel, um den gesamten Download abzuschließen.