Horizontale Skalierung und Anforderungsparallelisierung für hohen Durchsatz
Amazon S3 ist ein sehr großes verteiltes System. Um diese Größe zu nutzen, sollten Sie parallele Anforderungen horizontal zu den Amazon S3-Serviceendpunkten skalieren. Zusätzlich zur Verteilung der Anforderungen in Amazon S3 hilft dieses Skalierungskonzept dabei, die Last über mehrere Pfade im Netzwerk zu verteilen.
Für Übertragungen mit hohem Durchsatz empfiehlt Amazon S3 die Verwendung von Anwendungen mit mehreren Verbindungen für die parallele Ausführung von GET- und PUT-Aktionen. Dies wird beispielsweise von Amazon S3 Transfer Manager im AWS Java SDK unterstützt, und die meisten anderen AWS SDKs bieten ähnliche Konstrukte. Für manche Anwendungen können Sie parallele Verbindungen dadurch erreichen, dass Sie Anforderungen gleichzeitig in verschiedenen Anwendungsthreads oder in verschiedenen Anwendungsinstances starten. Das beste Konzept hängt von Ihrer Anwendung und der Struktur der Objekte ab, auf die Sie zugreifen.
Sie können die AWS SDKs verwenden, um GET- und PUT-Anforderungen direkt auszugeben, anstatt die Verwaltung von Übertragungen in dem AWS SDK zu nutzen. Dieses Konzept ermöglicht die direktere Abstimmung Ihrer Workloads, bei gleichzeitiger Nutzung der SDK-Unterstützung für Wiederholungsversuche und den Umgang mit eventuell auftretenden HTTP 503-Antworten. Generell gilt: Wenn Sie in einer Region große Objekte von Amazon S3 zu Amazon EC2 herunterladen, sollten Sie gleichzeitige Anfragen für Bytebereiche eines Objekts in der Größe von 8-16 MB starten. Starten Sie eine gleichzeitige Anforderung für jeweils 85-90 MB/s des gewünschten Netzwerkdurchsatzes. Zur Ausnutzung einer Netzwerkschnittstellenkarte (NIC) mit 10 Gb/s können Sie etwa 15 gleichzeitige Anforderungen über separate Verbindungen durchführen. Sie können die gleichzeitigen Anforderungen über mehr Verbindungen hochfahren, um schnellere NICs zu nutzen, etwa 25 oder 100 Gb/s.
Die Messung der Leistung ist wichtig für die Einstellung der Anzahl der gleichzeitig auszugebenden Anforderungen. Wir empfehlen, mit jeweils einer einzigen Anforderung zu beginnen. Messen Sie die erreichte Netzwerkbandbreite und die Nutzung weiterer Ressourcen durch Ihre Anwendung bei der Verarbeitung der Daten. Sie können dann die Engpassressource (die Ressource mit der höchsten Nutzung) identifizieren und so die Anzahl der Anforderungen ermitteln, die wahrscheinlich nützlich waren. Zum Beispiel: Wenn die Verarbeitung einzelner Anforderungen zu einer CPU-Nutzung von 25 Prozent führt, zeigt dies an, dass bis zu vier gleichzeitige Anforderungen möglich sind.
Messungen sind sehr wichtig, und es lohnt sich, die Ressourcennutzung zu ermitteln, wenn die Anforderungsrate erhöht wird.
Wenn ihre Anwendung Anforderungen direkt an Amazon S3 mit der REST API ausgibt, sollten Sie einen Pool von HTTP-Verbindungen verwenden und jede Verbindung für eine Serie von Anforderungen wiederverwenden. Die Vermeidung der Einrichtung von Verbindungen für jede Anforderung macht TCP-Slow-Starts und SSL-Handshakes bei jeder Anforderung überflüssig. Informationen zur Verwendung der REST-API finden Sie in der Einführung zur Amazon-S3-REST-API.
Schließlich ist es auch sinnvoll, auf den DNS zu achten und genau zu prüfen, ob Anfragen über einen großen Pool von Amazon S3-IP-Adressen verteilt werden. DNS-Anforderungen für Amazon S3 durchlaufen eine lange Liste von IP-Endpunkten. Das Caching von Resolvern oder Anwendungscode, der eine einzelne IP-Adresse wiederverwendet, profitiert nicht von der Adressendiversität und dem daraus resultierenden Lastenausgleich. Network Utility-Tools wie das netstat-Befehlszeilentool können die IP-Adressen anzeigen, die für die Kommunikation mit Amazon S3 verwendet werden, und wir bieten Anleitungen zu den zu verwendenden DNS-Konfigurationen. Weitere Informationen zu diesen Richtlinien finden Sie unter Anfragen-Routing.