Le migliori pratiche per ottimizzare le prestazioni di S3 Express One Zone - Amazon Simple Storage Service

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Le migliori pratiche per ottimizzare le prestazioni di S3 Express One Zone

Durante la creazione di applicazioni che caricano e recuperano oggetti da Amazon S3 Express One Zone, segui le nostre linee guida sulle best practice per ottimizzare le prestazioni. Per utilizzare la classe di archiviazione S3 Express One Zone, devi creare una directory di bucket S3. La classe di archiviazione S3 Express One Zone non è supportata per l'utilizzo con bucket per uso generico S3.

Per le linee guida sulle prestazioni per tutte le altre classi di archiviazione Amazon S3 e i bucket per uso generico S3, consulta Best practice e modelli di progettazione: ottimizzazione delle prestazioni di Amazon S3.

Per prestazioni e scalabilità ottimali con la classe di storage S3 Express One Zone e i bucket di directory in carichi di lavoro su larga scala, è importante capire in che modo i bucket di directory funzionano in modo diverso dai bucket generici. Quindi, forniamo le migliori pratiche per allineare le tue applicazioni al modo in cui funzionano i bucket di directory.

Come funzionano i bucket di directory

La classe di storage Amazon S3 Express One Zone può supportare carichi di lavoro con un massimo di 2.000.000 GET e fino a 200.000 transazioni PUT al secondo (TPS) per bucket di directory. Con S3 Express One Zone, i dati vengono archiviati in bucket di directory S3 nelle zone di disponibilità. Gli oggetti nei bucket di directory sono accessibili all'interno di uno spazio dei nomi gerarchico, simile a un file system e a differenza dei bucket generici S3 che hanno uno spazio dei nomi piatto. A differenza dei bucket per uso generico, i bucket di directory organizzano le chiavi in maniera gerarchica in directory anziché prefissi. Un prefisso è una stringa di caratteri all'inizio del nome della chiave dell'oggetto. È possibile utilizzare i prefissi per organizzare i dati e gestire un'architettura di storage di oggetti piatta in bucket generici. Per ulteriori informazioni, consulta Organizzazione degli oggetti utilizzando i prefissi.

Nei bucket di directory, gli oggetti sono organizzati in uno spazio dei nomi gerarchico utilizzando forward slash () come unico delimitatore supportato. / Quando carichi un oggetto con una chiave comedir1/dir2/file1.txt, le directory dir2/ vengono create dir1/ e gestite automaticamente da Amazon S3. Le directory vengono create durante PutObject le nostre CreateMultiPartUpload operazioni e rimosse automaticamente quando si svuotano dopo DeleteObject le nostre operazioni. AbortMultiPartUpload Non esiste un limite massimo al numero di oggetti e sottodirectory in una directory.

Le directory create quando gli oggetti vengono caricati nei bucket di directory possono essere ridimensionate istantaneamente per ridurre la possibilità di errori HTTP. 503 (Slow Down) Questo dimensionamento automatico consente alle applicazioni di parallelizzare le richieste di lettura e scrittura all'interno e tra le directory in base alle esigenze. Per S3 Express One Zone, le singole directory sono progettate per supportare la frequenza massima di richieste di un bucket di directory. Non è necessario randomizzare i prefissi delle chiavi per ottenere prestazioni ottimali poiché il sistema distribuisce automaticamente gli oggetti per una distribuzione uniforme del carico, ma di conseguenza, le chiavi non vengono memorizzate lessicograficamente nei bucket di directory. Ciò è in contrasto con i bucket generici S3, in cui è più probabile che le chiavi più vicine dal punto di vista lessicograficamente siano collocate sullo stesso server.

Per ulteriori informazioni sugli esempi di operazioni con i bucket di directory e di interazioni tra directory, consulta. Esempi di funzionamento del bucket di directory e di interazione con le directory

Best practice

Segui le best practice per ottimizzare le prestazioni del tuo directory bucket e aiutare i tuoi carichi di lavoro a scalare nel tempo.

Utilizza cartelle che contengono molte voci (oggetti o sottodirectory)

I bucket di directory offrono prestazioni elevate per impostazione predefinita per tutti i carichi di lavoro. Per un'ottimizzazione ancora maggiore delle prestazioni con determinate operazioni, il consolidamento di più voci (che sono oggetti o sottodirectory) nelle directory comporterà una latenza inferiore e un tasso di richieste più elevato:

  • Le operazioni API mutanti, come, CreateMultiPartUpload and PutObject DeleteObjectAbortMultiPartUpload, ottengono prestazioni ottimali se implementate con un numero inferiore di directory più dense contenenti migliaia di voci, anziché con un gran numero di directory più piccole.

  • ListObjectsV2le operazioni funzionano meglio quando è necessario attraversare meno directory per popolare una pagina di risultati.

Non utilizzare l'entropia nei prefissi

Nelle operazioni di Amazon S3, l'entropia si riferisce alla casualità nella denominazione dei prefissi che aiuta a distribuire i carichi di lavoro in modo uniforme tra le partizioni di storage. Tuttavia, poiché i bucket di directory gestiscono internamente la distribuzione del carico, non è consigliabile utilizzare l'entropia nei prefissi per ottenere prestazioni ottimali. Questo perché per i bucket di directory, l'entropia può rallentare le richieste non riutilizzando le directory che sono già state create.

Uno schema chiave come quello che $HASH/directory/object potrebbe finire per creare molte directory intermedie. Nel seguente esempio, tutte le job-1 s sono directory diverse poiché i loro genitori sono diversi. Le directory saranno scarse e le richieste di mutazione e di lista saranno più lente. In questo esempio ci sono 12 directory intermedie che hanno tutte una singola voce.

s3://my-bucket/0cc175b9c0f1b6a831c399e269772661/job-1/file1 s3://my-bucket/92eb5ffee6ae2fec3ad71c777531578f/job-1/file2 s3://my-bucket/4a8a08f09d37b73795649038408b5f33/job-1/file3 s3://my-bucket/8277e0910d750195b448797616e091ad/job-1/file4 s3://my-bucket/e1671797c52e15f763380b45e841ec32/job-1/file5 s3://my-bucket/8fa14cdd754f91cc6554c9e71929cce7/job-1/file6

Invece, per prestazioni migliori, possiamo rimuovere il $HASH componente e consentire di job-1 diventare una singola directory, migliorando la densità di una directory. Nell'esempio seguente, la singola directory intermedia con 6 voci può portare a prestazioni migliori rispetto all'esempio precedente.

s3://my-bucket/job-1/file1 s3://my-bucket/job-1/file2 s3://my-bucket/job-1/file3 s3://my-bucket/job-1/file4 s3://my-bucket/job-1/file5 s3://my-bucket/job-1/file6

Questo vantaggio in termini di prestazioni si verifica perché quando una chiave di oggetto viene inizialmente creata e il relativo nome di chiave include una directory, la directory viene creata automaticamente per l'oggetto. I successivi caricamenti di oggetti nella stessa directory non richiedono la creazione della directory, riducendo pertanto la latenza su caricamenti di oggetti nelle directory esistenti.

Utilizzate un separatore diverso dal delimitatore/per separare le parti della chiave se non vi serve la possibilità di raggruppare logicamente gli oggetti durante le chiamate ListObjectsV2

Poiché il / delimitatore è trattato in modo speciale per i bucket di directory, dovrebbe essere usato con intenzione. Sebbene i bucket di directory non ordinino gli oggetti in modo lessicografico, gli oggetti all'interno di una directory sono comunque raggruppati in output. ListObjectsV2 Se non avete bisogno di questa funzionalità, potete sostituirla / con un altro carattere come separatore per evitare la creazione di cartelle intermedie.

Ad esempio, supponiamo che le seguenti chiavi siano in uno schema di prefisso YYYY/MM/DD/HH/

s3://my-bucket/2024/04/00/01/file1 s3://my-bucket/2024/04/00/02/file2 s3://my-bucket/2024/04/00/03/file3 s3://my-bucket/2024/04/01/01/file4 s3://my-bucket/2024/04/01/02/file5 s3://my-bucket/2024/04/01/03/file6

Se non è necessario raggruppare gli oggetti per ora o giorno nei ListObjectsV2 risultati, ma è necessario raggruppare gli oggetti per mese, il seguente schema di tasti YYYY/MM/DD-HH- consentirà di ridurre notevolmente il numero di cartelle e di migliorare le prestazioni dell'ListObjectsV2operazione.

s3://my-bucket/2024/04/00-01-file1 s3://my-bucket/2024/04/00-01-file2 s3://my-bucket/2024/04/00-01-file3 s3://my-bucket/2024/04/01-02-file4 s3://my-bucket/2024/04/01-02-file5 s3://my-bucket/2024/04/01-02-file6

Se possibile, utilizzate operazioni con elenchi delimitati

Una ListObjectsV2 richiesta senza a delimiter esegue l'attraversamento ricorsivo in base alla profondità di tutte le directory. Una ListObjectsV2 richiesta con a delimiter recupera solo le voci nella directory specificata dal prefix parametro, riducendo la latenza della richiesta e aumentando le chiavi aggregate al secondo. Per i bucket di directory, utilizzate operazioni con elenchi delimitati, ove possibile. Gli elenchi delimitati fanno sì che le directory vengano visitate meno volte, il che comporta più chiavi al secondo e una minore latenza delle richieste.

Ad esempio, per le seguenti directory e oggetti nel tuo bucket di directory:

s3://my-bucket/2024/04/12-01-file1 s3://my-bucket/2024/04/12-01-file2 ... s3://my-bucket/2024/05/12-01-file1 s3://my-bucket/2024/05/12-01-file2 ... s3://my-bucket/2024/06/12-01-file1 s3://my-bucket/2024/06/12-01-file2 ... s3://my-bucket/2024/07/12-01-file1 s3://my-bucket/2024/07/12-01-file2 ...

Per ListObjectsV2 prestazioni migliori, utilizzate un elenco delimitato per elencare le sottodirectory e gli oggetti, se la logica dell'applicazione lo consente. Ad esempio, è possibile eseguire il comando seguente per l'operazione di elenco delimitato,

aws s3api list-objects-v2 --bucket my-bucket --prefix '2024/' --delimiter '/'

L'output è l'elenco delle sottodirectory.

{ "CommonPrefixes": [ { "Prefix": "2024/04/" }, { "Prefix": "2024/05/" }, { "Prefix": "2024/06/" }, { "Prefix": "2024/07/" } ] }

Per elencare ogni sottodirectory con prestazioni migliori, puoi eseguire un comando come nell'esempio seguente:

Comando:

aws s3api list-objects-v2 --bucket my-bucket --prefix '2024/04' --delimiter '/'

Output:

{ "Contents": [ { "Key": "2024/04/12-01-file1" }, { "Key": "2024/04/12-01-file2" } ] }

Co-ubicazione dello spazio di archiviazione S3 Express One Zone con risorse di calcolo

Con S3 Express One Zone, ogni bucket di directory si trova in un'unica zona di disponibilità selezionata al momento della creazione del bucket. Puoi iniziare creando un nuovo bucket di directory in una zona di disponibilità locale nei carichi di lavoro o nelle risorse di calcolo. Quindi, puoi iniziare immediatamente letture e scritture a latenza molto bassa. I bucket di directory sono un tipo di bucket S3 in cui è possibile scegliere la zona di disponibilità in modo da ridurre la latenza tra elaborazione e Regione AWS archiviazione.

Se accedi ai bucket di directory attraverso le zone di disponibilità, potresti riscontrare un leggero aumento della latenza. Per ottimizzare le prestazioni, ti consigliamo di accedere a un bucket di directory dalle istanze di Amazon Elastic Container Service, Amazon Elastic Kubernetes Service e Amazon Elastic Compute Cloud che si trovano nella stessa zona di disponibilità, se possibile.

Utilizza connessioni simultanee per ottenere un throughput elevato con oggetti superiori a 1 MB

Puoi ottenere prestazioni ottimali inviando più richieste simultanee ai bucket di directory per distribuire le richieste su connessioni separate per massimizzare la larghezza di banda accessibile. Come i bucket generici, S3 Express One Zone non ha limiti per il numero di connessioni effettuate al tuo bucket di directory. Le singole directory possono dimensionare le prestazioni orizzontalmente e automaticamente quando si verifica un numero elevato di scritture simultanee nella stessa directory.

Le singole connessioni TCP ai bucket di directory hanno un limite superiore fisso al numero di byte che possono essere caricati o scaricati al secondo. Quando gli oggetti diventano più grandi, i tempi di richiesta vengono dominati dallo streaming di byte piuttosto che dall'elaborazione delle transazioni. Per utilizzare più connessioni per parallelizzare il caricamento o il download di oggetti più grandi, puoi ridurre la latenza. end-to-end Se utilizzi l'Java 2.xSDK, dovresti prendere in considerazione l'utilizzo di S3 Transfer Manager, che trarrà vantaggio dai miglioramenti delle prestazioni come le operazioni dell'API di caricamento multiparte e il recupero di intervalli di byte per accedere ai dati in parallelo.

Usa gli endpoint VPC Gateway

Gli endpoint gateway forniscono una connessione diretta dal tuo VPC ai bucket di directory, senza richiedere un gateway Internet o un dispositivo NAT per il tuo VPC. Per ridurre la quantità di tempo che i pacchetti trascorrono sulla rete, è necessario configurare il VPC con un endpoint VPC gateway per i bucket di directory. Per ulteriori informazioni, consulta Collegamento in rete per i bucket di directory.

Utilizza l'autenticazione della sessione e riutilizza i token di sessione finché sono validi

I bucket di directory forniscono un meccanismo di autenticazione dei token di sessione per ridurre la latenza sulle operazioni API sensibili alle prestazioni. È possibile effettuare una singola chiamata per CreateSession ottenere un token di sessione che sia quindi valido per tutte le richieste nei 5 minuti successivi. Per ottenere la latenza più bassa nelle chiamate API, assicuratevi di acquisire un token di sessione e riutilizzarlo per l'intera durata di quel token prima di aggiornarlo.

Se lo utilizzi AWS SDKs, il token di SDKs sessione si aggiorna automaticamente per evitare interruzioni del servizio alla scadenza di una sessione. Ti consigliamo di utilizzare il AWS SDKs per avviare e gestire le richieste relative al funzionamento dell'API. CreateSession

Per ulteriori informazioni su CreateSession, consulta Autorizzazione delle operazioni API dell'endpoint di zona con CreateSession.

Utilizza un client basato su CRT

AWS Common Runtime (CRT) è un insieme di librerie modulari, performanti ed efficienti scritte in C e pensate per fungere da base per. AWS SDKs Il CRT offre una maggiore velocità di trasmissione, una migliore gestione delle connessioni e tempi di avvio più rapidi. Il CRT è disponibile in tutti i siti tranne Go. AWS SDKs

Per ulteriori informazioni su come configurare il CRT per l'SDK che utilizzi, consulta le librerie AWS Common Runtime (CRT), Accelerazione del throughput di Amazon S3 con AWS Common Runtime, Introduzione delclient S3 basato su CRT e S3 Transfer Manager nell' AWS SDK for Java 2.x, Uso di S3 per leoperazioni Amazon CrtClient S3 e Configurazione dei client HTTP basati su CRT. AWS

Utilizza la versione più recente di AWS SDKs

AWS SDKs Forniscono supporto integrato per molte delle linee guida consigliate per l'ottimizzazione delle prestazioni di Amazon S3. SDKs Offrono un'API più semplice per sfruttare Amazon S3 dall'interno di un'applicazione e vengono regolarmente aggiornate per seguire le best practice più recenti. Ad esempio, riprovano SDKs automaticamente le richieste dopo 503 errori HTTP e gestiscono le risposte di connessioni lente.

Se utilizzi l'Java 2.xSDK, dovresti prendere in considerazione l'utilizzo di S3 Transfer Manager, che ridimensiona automaticamente le connessioni orizzontalmente per ottenere migliaia di richieste al secondo utilizzando richieste con intervallo di byte, se necessario. Le richieste con intervallo di byte possono migliorare le prestazioni perché puoi utilizzare connessioni simultanee a S3 per recuperare intervalli di byte diversi dall'interno dello stesso oggetto. Questa operazione ti permette di ottenere un throughput aggregato superiore rispetto a una singola richiesta whole-object. Quindi è importante utilizzare la versione più recente di per ottenere le ultime funzionalità di ottimizzazione delle prestazioni AWS SDKs .

Risoluzione dei problemi relativi alle prestazioni

State impostando richieste di nuovi tentativi per applicazioni sensibili alla latenza?

S3 Express One Zone è progettato appositamente per offrire livelli costanti di alte prestazioni senza ulteriori regolazioni. Tuttavia, l'impostazione di valori di timeout aggressivi e nuovi tentativi possono contribuire ulteriormente a garantire latenza e prestazioni costanti. AWS SDKs Dispongono di valori di timeout e tentativi configurabili che è possibile regolare in base alle tolleranze dell'applicazione specifica.

Stai utilizzando librerie AWS Common Runtime (CRT) e tipi di EC2 istanze Amazon ottimali?

Le applicazioni che eseguono un elevato numero di operazioni di lettura e scrittura richiedono una capacità di memoria o calcolo superiore rispetto alle applicazioni che non eseguono tali operazioni. Quando avvii le istanze Amazon Elastic Compute Cloud EC2 (Amazon) per carichi di lavoro che richiedono prestazioni elevate, scegli i tipi di istanze che hanno la quantità di queste risorse di cui l'applicazione ha bisogno. Lo storage ad alte prestazioni S3 Express One Zone si abbina idealmente a tipi di istanze più grandi e nuove con maggiori quantità di memoria di sistema, più potenti e che possono sfruttare lo storage a prestazioni più elevate. CPUs GPUs Consigliamo inoltre di utilizzare le versioni più recenti di CRT-Enabled AWS SDKs, che possono accelerare meglio le richieste di lettura e scrittura in parallelo.

Lo stai utilizzando AWS SDKs per l'autenticazione basata sulla sessione?

Con Amazon S3, puoi anche ottimizzare le prestazioni quando utilizzi le richieste API REST HTTP seguendo le stesse best practice che fanno parte di. AWS SDKs Tuttavia, con il meccanismo di autorizzazione e autenticazione basato sulla sessione utilizzato da S3 Express One Zone, ti consigliamo vivamente di utilizzare AWS SDKs to manage CreateSession e il relativo token di sessione gestito. Creano e aggiornano AWS SDKs automaticamente i token per tuo conto utilizzando l'operazione API. CreateSession Utilizzo CreateSession della latenza di andata e ritorno per ogni richiesta AWS Identity and Access Management (IAM) per autorizzare ogni richiesta.

Esempi di funzionamento del bucket di directory e di interazione con le directory

Di seguito vengono mostrati tre esempi su come funzionano i bucket di directory.

Esempio 1: come PutObject le richieste S3 a un bucket di directory interagiscono con le directory

  1. Quando l'operazione PUT(<bucket>, "documents/reports/quarterly.txt") viene eseguita in un bucket vuoto, viene creata la directory documents/ all'interno della radice del bucket, viene creata la directory reports/ all'interno e documents/ viene creato l'oggetto all'interno. quarterly.txt reports/ Per questa operazione, sono state create due directory oltre all'oggetto.

    Diagramma che mostra la struttura delle cartelle dopo l'operazione PUT per documents/reports/quarterly.txt
  2. Quindi, quando PUT(<bucket>, "documents/logs/application.txt") viene eseguita un'altra operazione, la directory esiste documents/ già, la documents/ directory logs/ all'interno non esiste e viene creata e logs/ viene creato l'oggetto application.txt all'interno. Per questa operazione, è stata creata solo una directory oltre all'oggetto.

    Diagramma che mostra la struttura delle cartelle dopo l'operazione PUT per documents/logs/application.txt
  3. Infine, quando viene eseguita un'PUT(<bucket>, "documents/readme.txt")operazione, la directory all'documents/interno della radice esiste già e l'oggetto readme.txt viene creato. Per questa operazione, non viene creata alcuna directory.

    Diagramma che mostra la struttura delle cartelle dopo l'operazione PUT per documents/readme.txt

Esempio 2: come ListObjectsV2 le richieste S3 a un bucket di directory interagiscono con le directory

Per le ListObjectsV2 richieste S3 senza specificare un delimitatore, un bucket viene attraversato in base alla profondità. Gli output vengono restituiti in un ordine coerente. Tuttavia, sebbene questo ordine rimanga lo stesso tra le richieste, l'ordine non è lessicografico. Per il bucket e le directory creati nell'esempio precedente:

  1. Quando LIST(<bucket>) viene eseguito a, la directory documents/ viene inserita e l'attraversamento ha inizio.

  2. La sottodirectory logs/ viene inserita e l'attraversamento ha inizio.

  3. L'oggetto si application.txt trova all'interno. logs/

  4. All'interno non esistono altre vocilogs/. L'operazione Elenco esce da logs/ ed entra documents/ nuovamente.

  5. La documents/ directory continua a essere attraversata e l'oggetto readme.txt viene trovato.

  6. La documents/ directory continua a essere attraversata e la sottodirectory reports/ viene inserita e l'attraversamento ha inizio.

  7. L'oggetto si trova all'interno. quarterly.txt reports/

  8. All'interno non esistono altre vocireports/. L'elenco esce da reports/ ed entra di documents/ nuovo.

  9. Non esistono più voci all'interno documents/ e l'Elenco ritorna.

In questo esempio, logs/ viene ordinato prima readme.txt e readme.txt viene ordinato primareports/.

Esempio 3: come DeleteObject le richieste S3 a un bucket di directory interagiscono con le directory

Diagramma che mostra la struttura iniziale delle cartelle prima delle operazioni DELETE
  1. Nello stesso bucket, quando l'operazione DELETE(<bucket>, "documents/reports/quarterly.txt") viene eseguita, l'oggetto quarterly.txt viene eliminato, lasciando la directory reports/ vuota e provocandone l'eliminazione immediata. La documents/ directory non è vuota perché contiene sia la directory logs/ che l'oggettoreadme.txt, quindi non viene eliminata. Per questa operazione, sono stati eliminati solo un oggetto e una directory.

    Diagramma che mostra la struttura delle cartelle dopo l'operazione DELETE per documents/reports/quarterly.txt
  2. Quando l'operazione DELETE(<bucket>, "documents/readme.txt") viene eseguita, l'oggetto readme.txt viene eliminato. documents/non è ancora vuoto perché contiene la directorylogs/, quindi non viene eliminato. Per questa operazione, non viene eliminata alcuna directory e viene eliminato solo l'oggetto.

    Diagramma che mostra la struttura delle cartelle dopo l'operazione DELETE per documents/readme.txt
  3. Infine, quando l'operazione DELETE(<bucket>, "documents/logs/application.txt") viene eseguita, application.txt viene eliminata, lasciandola logs/ vuota e provocando l'eliminazione immediata. Questo quindi rimane documents/ vuoto e viene anch'esso eliminato immediatamente. Per questa operazione, vengono eliminati due directory e un oggetto. Il bucket ora è vuoto.

    Diagramma che mostra la struttura delle cartelle dopo l'operazione DELETE per documents/logs/application.txt