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
andPutObject
DeleteObject
AbortMultiPartUpload
, 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.ListObjectsV2
le 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'ListObjectsV2
operazione.
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.x
SDK, 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 del
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.x
SDK, 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
-
Quando l'operazione
PUT(<bucket>, "documents/reports/quarterly.txt")
viene eseguita in un bucket vuoto, viene creata la directorydocuments/
all'interno della radice del bucket, viene creata la directoryreports/
all'interno edocuments/
viene creato l'oggetto all'interno.quarterly.txt
reports/
Per questa operazione, sono state create due directory oltre all'oggetto. -
Quindi, quando
PUT(<bucket>, "documents/logs/application.txt")
viene eseguita un'altra operazione, la directory esistedocuments/
già, ladocuments/
directorylogs/
all'interno non esiste e viene creata elogs/
viene creato l'oggettoapplication.txt
all'interno. Per questa operazione, è stata creata solo una directory oltre all'oggetto. -
Infine, quando viene eseguita un'
PUT(<bucket>, "documents/readme.txt")
operazione, la directory all'documents/
interno della radice esiste già e l'oggettoreadme.txt
viene creato. Per questa operazione, non viene creata alcuna directory.
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:
-
Quando
LIST(<bucket>)
viene eseguito a, la directorydocuments/
viene inserita e l'attraversamento ha inizio. -
La sottodirectory
logs/
viene inserita e l'attraversamento ha inizio. -
L'oggetto si
application.txt
trova all'interno.logs/
-
All'interno non esistono altre voci
logs/
. L'operazione Elenco esce dalogs/
ed entradocuments/
nuovamente. -
La
documents/
directory continua a essere attraversata e l'oggettoreadme.txt
viene trovato. -
La
documents/
directory continua a essere attraversata e la sottodirectoryreports/
viene inserita e l'attraversamento ha inizio. -
L'oggetto si trova all'interno.
quarterly.txt
reports/
-
All'interno non esistono altre voci
reports/
. L'elenco esce dareports/
ed entra didocuments/
nuovo. -
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

-
Nello stesso bucket, quando l'operazione
DELETE(<bucket>, "documents/reports/quarterly.txt")
viene eseguita, l'oggettoquarterly.txt
viene eliminato, lasciando la directoryreports/
vuota e provocandone l'eliminazione immediata. Ladocuments/
directory non è vuota perché contiene sia la directorylogs/
che l'oggettoreadme.txt
, quindi non viene eliminata. Per questa operazione, sono stati eliminati solo un oggetto e una directory. -
Quando l'operazione
DELETE(<bucket>, "documents/readme.txt")
viene eseguita, l'oggettoreadme.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. -
Infine, quando l'operazione
DELETE(<bucket>, "documents/logs/application.txt")
viene eseguita,application.txt
viene eliminata, lasciandolalogs/
vuota e provocando l'eliminazione immediata. Questo quindi rimanedocuments/
vuoto e viene anch'esso eliminato immediatamente. Per questa operazione, vengono eliminati due directory e un oggetto. Il bucket ora è vuoto.