Praktik terbaik untuk mengoptimalkan kinerja S3 Express One Zone - Amazon Simple Storage Service

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Praktik terbaik untuk mengoptimalkan kinerja S3 Express One Zone

Saat membangun aplikasi yang mengunggah dan mengambil objek dari Amazon S3 Express One Zone, ikuti panduan praktik terbaik kami untuk mengoptimalkan kinerja. Untuk menggunakan kelas penyimpanan S3 Express One Zone, Anda harus membuat bucket direktori S3. Kelas penyimpanan S3 Express One Zone tidak didukung untuk digunakan dengan bucket tujuan umum S3.

Untuk panduan kinerja semua kelas penyimpanan Amazon S3 lainnya dan bucket tujuan umum S3, lihat Pola desain praktik terbaik: mengoptimalkan performa Amazon S3.

Untuk kinerja dan skalabilitas yang optimal dengan kelas penyimpanan S3 Express One Zone dan bucket direktori dalam beban kerja skala tinggi, penting untuk memahami cara kerja bucket direktori secara berbeda dari bucket tujuan umum. Kemudian, kami menyediakan praktik terbaik untuk menyelaraskan aplikasi Anda dengan cara kerja bucket direktori.

Cara kerja bucket direktori

Kelas penyimpanan Amazon S3 Express One Zone dapat mendukung beban kerja hingga 2.000.000 GET dan hingga 200.000 transaksi PUT per detik (TPS) per bucket direktori. Dengan S3 Express One Zone, data disimpan dalam bucket direktori S3 di Availability Zones. Objek dalam bucket direktori dapat diakses dalam namespace hierarkis, mirip dengan sistem file dan berbeda dengan bucket tujuan umum S3 yang memiliki namespace datar. Tidak seperti bucket tujuan umum, bucket direktori mengatur kunci secara hierarkis ke dalam direktori alih-alih prefiks. Prefiks adalah string karakter di bagian awal nama kunci objek. Anda dapat menggunakan awalan untuk mengatur data Anda dan mengelola arsitektur penyimpanan objek datar di bucket tujuan umum. Untuk informasi selengkapnya, lihat Organisasi objek menggunakan prefiks.

Dalam bucket direktori, objek diatur dalam namespace hierarkis menggunakan garis miring maju (/) sebagai satu-satunya pembatas yang didukung. Saat Anda mengunggah objek dengan kunci sepertidir1/dir2/file1.txt, direktori dir1/ dan secara otomatis dir2/ dibuat dan dikelola oleh Amazon S3. Direktori dibuat selama PutObject atau CreateMultiPartUpload operasi dan secara otomatis dihapus ketika mereka menjadi kosong setelah DeleteObject atau AbortMultiPartUpload operasi. Tidak ada batas atas jumlah objek dan subdirektori dalam direktori.

Direktori yang dibuat saat objek diunggah ke bucket direktori dapat diskalakan secara instan untuk mengurangi kemungkinan kesalahan HTTP. 503 (Slow Down) Penskalaan otomatis ini memungkinkan aplikasi Anda untuk memparalelkan permintaan baca dan tulis di dalam dan di seluruh direktori sesuai kebutuhan. Untuk S3 Express One Zone, direktori individual dirancang untuk mendukung tingkat permintaan maksimum bucket direktori. Tidak perlu mengacak awalan kunci untuk mencapai kinerja optimal karena sistem secara otomatis mendistribusikan objek untuk distribusi beban yang merata, tetapi sebagai hasilnya, kunci tidak disimpan secara leksikografis dalam ember direktori. Ini berbeda dengan bucket tujuan umum S3 di mana kunci yang lebih dekat secara leksikografis lebih mungkin ditempatkan bersama di server yang sama.

Untuk informasi selengkapnya tentang contoh operasi bucket direktori dan interaksi direktori, lihatOperasi bucket direktori dan contoh interaksi direktori.

Praktik terbaik

Ikuti praktik terbaik untuk mengoptimalkan kinerja bucket direktori Anda dan membantu beban kerja Anda menskalakan dari waktu ke waktu.

Gunakan direktori yang berisi banyak entri (objek atau subdirektori)

Bucket direktori memberikan kinerja tinggi secara default untuk semua beban kerja. Untuk optimasi kinerja yang lebih besar dengan operasi tertentu, mengkonsolidasikan lebih banyak entri (yang merupakan objek atau subdirektori) ke dalam direktori akan menghasilkan latensi yang lebih rendah dan tingkat permintaan yang lebih tinggi:

  • Operasi API yang bermutasi, sepertiPutObject,, CreateMultiPartUpload dan DeleteObjectAbortMultiPartUpload, mencapai kinerja optimal saat diimplementasikan dengan direktori yang lebih sedikit dan lebih padat yang berisi ribuan entri, bukan dengan sejumlah besar direktori yang lebih kecil.

  • ListObjectsV2operasi berkinerja lebih baik ketika lebih sedikit direktori perlu dilalui untuk mengisi halaman hasil.

Jangan gunakan entropi dalam awalan

Dalam operasi Amazon S3, entropi mengacu pada keacakan dalam penamaan awalan yang membantu mendistribusikan beban kerja secara merata di seluruh partisi penyimpanan. Namun, karena bucket direktori mengelola distribusi beban secara internal, tidak disarankan untuk menggunakan entropi dalam awalan untuk kinerja terbaik. Ini karena untuk bucket direktori, entropi dapat menyebabkan permintaan menjadi lebih lambat dengan tidak menggunakan kembali direktori yang telah dibuat.

Pola kunci seperti $HASH/directory/object bisa berakhir dengan membuat banyak direktori perantara. Dalam contoh berikut, semua job-1 s adalah direktori yang berbeda karena orang tua mereka berbeda. Direktori akan jarang dan mutasi dan permintaan daftar akan lebih lambat. Dalam contoh ini ada 12 Direktori perantara yang semuanya memiliki satu entri.

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

Sebaliknya, untuk kinerja yang lebih baik, kita dapat menghapus $HASH komponen dan memungkinkan job-1 untuk menjadi satu direktori, meningkatkan kepadatan direktori. Dalam contoh berikut, direktori perantara tunggal yang memiliki 6 entri dapat menghasilkan kinerja yang lebih baik, dibandingkan dengan contoh sebelumnya.

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

Keuntungan kinerja ini terjadi karena ketika kunci objek awalnya dibuat dan nama kuncinya termasuk direktori, direktori secara otomatis dibuat untuk objek. Unggahan objek berikutnya ke direktori yang sama tidak memerlukan direktori yang akan dibuat, yang mengurangi latensi pada unggahan objek ke direktori yang ada.

Gunakan pemisah selain pembatas/untuk memisahkan bagian kunci Anda jika Anda tidak memerlukan kemampuan untuk mengelompokkan objek secara logis selama panggilan ListObjectsV2

Karena / pembatas diperlakukan khusus untuk ember direktori, itu harus digunakan dengan niat. Sementara bucket direktori tidak secara leksikografis mengurutkan objek, objek dalam direktori masih dikelompokkan bersama dalam output. ListObjectsV2 Jika Anda tidak memerlukan fungsi ini, Anda dapat mengganti / dengan karakter lain sebagai pemisah untuk tidak menyebabkan pembuatan direktori perantara.

Misalnya, asumsikan kunci berikut berada dalam YYYY/MM/DD/HH/ pola awalan

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

Jika Anda tidak perlu mengelompokkan objek berdasarkan jam atau hari dalam ListObjectsV2 hasil, tetapi Anda perlu mengelompokkan objek berdasarkan bulan, pola kunci berikut YYYY/MM/DD-HH- akan menghasilkan direktori yang jauh lebih sedikit dan kinerja yang lebih baik untuk ListObjectsV2 operasi.

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

Gunakan operasi daftar yang dibatasi jika memungkinkan

ListObjectsV2Permintaan tanpa delimiter melakukan traversal rekursif kedalaman pertama dari semua direktori. ListObjectsV2Permintaan dengan hanya delimiter mengambil entri dalam direktori yang ditentukan oleh prefix parameter, mengurangi latensi permintaan dan meningkatkan kunci agregat per detik. Untuk bucket direktori, gunakan operasi daftar terbatas jika memungkinkan. Daftar yang dibatasi menghasilkan direktori yang dikunjungi lebih sedikit kali, yang mengarah ke lebih banyak kunci per detik dan latensi permintaan yang lebih rendah.

Misalnya, untuk direktori dan objek berikut di bucket direktori Anda:

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 ...

Untuk ListObjectsV2 kinerja yang lebih baik, gunakan daftar terbatas untuk daftar subdirektori dan objek Anda, jika logika aplikasi Anda memungkinkan untuk itu. Misalnya, Anda dapat menjalankan perintah berikut untuk operasi daftar yang dibatasi,

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

Outputnya adalah daftar subdirektori.

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

Untuk daftar setiap subdirektori dengan kinerja yang lebih baik, Anda dapat menjalankan perintah seperti contoh berikut:

Perintah:

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" } ] }

Lokasi bersama penyimpanan S3 Express One Zone dengan sumber daya komputasi Anda

Dengan S3 Express One Zone, setiap bucket direktori terletak di satu Availability Zone yang Anda pilih saat membuat bucket. Anda dapat memulai dengan membuat bucket direktori baru di Zona Ketersediaan lokal untuk beban kerja atau sumber daya komputasi Anda. Anda kemudian dapat segera memulai membaca dan menulis latensi sangat rendah. Bucket direktori adalah jenis bucket S3 tempat Anda dapat memilih Availability Zone Wilayah AWS untuk mengurangi latensi antara komputasi dan penyimpanan.

Jika Anda mengakses bucket direktori di Availability Zones, Anda mungkin mengalami sedikit peningkatan latensi. Untuk mengoptimalkan performa, kami menyarankan agar Anda sebisa mungkin mengakses bucket direktori dari instans Amazon Elastic Container Service, Amazon Elastic Kubernetes Service, dan Amazon Elastic Compute Cloud yang berada di Zona Ketersediaan yang sama.

Gunakan koneksi bersamaan untuk mencapai throughput tinggi dengan objek di atas 1MB

Anda dapat mencapai kinerja terbaik dengan mengeluarkan beberapa permintaan sekaligus ke bucket direktori untuk menyebarkan permintaan Anda melalui koneksi terpisah untuk memaksimalkan bandwidth yang dapat diakses. Seperti bucket tujuan umum, S3 Express One Zone tidak memiliki batasan jumlah koneksi yang dibuat ke bucket direktori Anda. Direktori individu dapat menskalakan kinerja secara horizontal dan otomatis ketika terjadi sejumlah besar penulisan bersamaan ke direktori yang sama.

Koneksi TCP individual ke bucket direktori memiliki batas atas tetap pada jumlah byte yang dapat diunggah atau diunduh per detik. Ketika objek menjadi lebih besar, waktu permintaan menjadi didominasi oleh streaming byte daripada pemrosesan transaksi. Untuk menggunakan beberapa koneksi untuk memparalelkan unggahan atau pengunduhan objek yang lebih besar, Anda dapat mengurangi end-to-end latensi. Jika menggunakan Java 2.x SDK, Anda harus mempertimbangkan untuk menggunakan S3 Transfer Manager yang akan memanfaatkan peningkatan kinerja seperti operasi API unggahan multibagian dan pengambilan rentang byte untuk mengakses data secara paralel.

Gunakan titik akhir VPC Gateway

Titik akhir Gateway menyediakan koneksi langsung dari VPC Anda ke bucket direktori, tanpa memerlukan gateway internet atau perangkat NAT untuk VPC Anda. Untuk mengurangi jumlah waktu yang dihabiskan paket Anda di jaringan, Anda harus mengonfigurasi VPC Anda dengan titik akhir VPC gateway untuk bucket direktori. Untuk informasi selengkapnya, lihat Jaringan untuk ember direktori.

Gunakan otentikasi sesi dan gunakan kembali token sesi saat valid

Bucket direktori menyediakan mekanisme otentikasi token sesi untuk mengurangi latensi pada operasi API yang peka terhadap kinerja. Anda dapat melakukan satu panggilan CreateSession untuk mendapatkan token sesi yang kemudian berlaku untuk semua permintaan dalam 5 menit berikutnya. Untuk mendapatkan latensi terendah dalam panggilan API Anda, pastikan untuk memperoleh token sesi dan menggunakannya kembali selama masa pakai token tersebut sebelum menyegarkannya.

Jika Anda menggunakan AWS SDKs, SDKs tangani penyegaran token sesi secara otomatis untuk menghindari gangguan layanan saat sesi berakhir. Kami menyarankan Anda menggunakan AWS SDKs untuk memulai dan mengelola permintaan ke operasi CreateSession API.

Untuk informasi selengkapnya tentang CreateSession, lihat Mengotorisasi operasi API titik akhir Zonal dengan CreateSession.

Gunakan klien berbasis CRT

AWS Common Runtime (CRT) adalah seperangkat pustaka modular, berkinerja, dan efisien yang ditulis dalam C dan dimaksudkan untuk bertindak sebagai dasar dari. AWS SDKs CRT menyediakan throughput yang ditingkatkan, manajemen koneksi yang ditingkatkan, dan waktu startup yang lebih cepat. CRT tersedia melalui semua AWS SDKs kecuali Go.

Untuk informasi selengkapnya tentang cara mengonfigurasi CRT untuk SDK yang Anda gunakan, lihat pustaka AWS Common Runtime (CRT), Mempercepatthroughput Amazon S3 dengan AWS Common Runtime, Memperkenalkan klien S3 berbasis CRT, dan Manajer Transfer S3 di SDK for Java 2.x, Menggunakan operasi S3 untuk AmazonS3, dan Mengkonfigurasi AWS klien HTTP berbasis CRT. CrtClient AWS

Gunakan versi terbaru dari AWS SDKs

Ini AWS SDKs menyediakan dukungan bawaan untuk banyak pedoman yang direkomendasikan untuk mengoptimalkan kinerja Amazon S3. SDKs Menawarkan API yang lebih sederhana untuk memanfaatkan Amazon S3 dari dalam aplikasi dan diperbarui secara berkala untuk mengikuti praktik terbaik terbaru. Misalnya, permintaan coba ulang SDKs secara otomatis setelah 503 kesalahan HTTP dan menangani respons koneksi yang lambat.

Jika menggunakan Java 2.x SDK, Anda harus mempertimbangkan untuk menggunakan S3 Transfer Manager, yang secara otomatis menskalakan koneksi secara horizontal untuk mencapai ribuan permintaan per detik menggunakan permintaan rentang byte jika diperlukan. Permintaan rentang byte dapat meningkatkan kinerja karena Anda dapat menggunakan koneksi bersamaan ke S3 untuk mengambil rentang byte yang berbeda dari dalam objek yang sama. Ini membantu Anda mencapai throughput agregat yang lebih tinggi dibandingkan permintaan objek utuh tunggal. Jadi penting untuk menggunakan versi terbaru dari AWS SDKs untuk mendapatkan fitur optimasi kinerja terbaru.

Penyelesaian masalah kinerja

Apakah Anda menyetel permintaan coba lagi untuk aplikasi yang sensitif terhadap latensi?

S3 Express One Zone dibuat khusus untuk menghadirkan tingkat kinerja tinggi yang konsisten tanpa penyetelan tambahan. Namun, menetapkan nilai batas waktu yang agresif dan percobaan ulang dapat membantu mendorong latensi dan kinerja yang konsisten. AWS SDKs Memiliki batas waktu yang dapat dikonfigurasi dan nilai coba lagi yang dapat Anda sesuaikan dengan toleransi aplikasi spesifik Anda.

Apakah Anda menggunakan pustaka AWS Common Runtime (CRT) dan tipe instans Amazon EC2 yang optimal?

Aplikasi yang melakukan sejumlah besar operasi baca dan tulis cenderung membutuhkan lebih banyak memori atau kapasitas komputasi daripada aplikasi yang tidak melakukannya. Saat meluncurkan instans Amazon Elastic Compute Cloud (Amazon EC2) untuk beban kerja yang menuntut kinerja, pilih jenis instans yang memiliki jumlah sumber daya ini yang dibutuhkan aplikasi Anda. Penyimpanan berkinerja tinggi S3 Express One Zone idealnya dipasangkan dengan tipe instans yang lebih besar dan lebih baru dengan jumlah memori sistem yang lebih besar dan lebih kuat CPUs dan GPUs dapat memanfaatkan penyimpanan berkinerja lebih tinggi. Kami juga merekomendasikan penggunaan versi terbaru dari CRT-enabled AWS SDKs, yang dapat mempercepat permintaan baca dan tulis secara paralel dengan lebih baik.

Apakah Anda menggunakan AWS SDKs otentikasi berbasis sesi?

Dengan Amazon S3, Anda juga dapat mengoptimalkan kinerja saat menggunakan permintaan HTTP REST API dengan mengikuti praktik terbaik yang sama yang merupakan bagian dari permintaan. AWS SDKs Namun, dengan mekanisme otorisasi dan otentikasi berbasis sesi yang digunakan oleh S3 Express One Zone, kami sangat menyarankan Anda menggunakan token AWS SDKs to manage CreateSession dan managed session token. AWS SDKs Secara otomatis membuat dan menyegarkan token atas nama Anda dengan menggunakan operasi CreateSession API. Menggunakan CreateSession save on per-request round-trip latency to AWS Identity and Access Management (IAM) untuk mengotorisasi setiap permintaan.

Operasi bucket direktori dan contoh interaksi direktori

Berikut ini menunjukkan tiga contoh tentang cara kerja bucket direktori.

Contoh 1: Bagaimana PutObject permintaan S3 ke bucket direktori berinteraksi dengan direktori

  1. Ketika operasi PUT(<bucket>, "documents/reports/quarterly.txt") dijalankan dalam bucket kosong, direktori di documents/ dalam root bucket dibuat, direktori di reports/ dalamnya documents/ dibuat, dan objek di quarterly.txt dalamnya reports/ dibuat. Untuk operasi ini, dua direktori dibuat selain objek.

    Diagram yang menunjukkan struktur direktori setelah operasi PUT untuk documents/reports/quarterly.txt
  2. Kemudian, ketika operasi lain PUT(<bucket>, "documents/logs/application.txt") dijalankan, direktori documents/ sudah ada, direktori di logs/ dalamnya documents/ tidak ada dan dibuat, dan objek di application.txt dalamnya logs/ dibuat. Untuk operasi ini, hanya satu direktori yang dibuat selain objek.

    Diagram yang menunjukkan struktur direktori setelah operasi PUT untuk documents/logs/application.txt
  3. Terakhir, ketika PUT(<bucket>, "documents/readme.txt") operasi dijalankan, direktori di documents/ dalam root sudah ada dan objek readme.txt dibuat. Untuk operasi ini, tidak ada direktori yang dibuat.

    Diagram yang menunjukkan struktur direktori setelah operasi PUT untuk documents/readme.txt

Contoh 2: Bagaimana ListObjectsV2 permintaan S3 ke bucket direktori berinteraksi dengan direktori

Untuk ListObjectsV2 permintaan S3 tanpa menentukan pembatas, bucket dilintasi secara mendalam terlebih dahulu. Output dikembalikan dalam urutan yang konsisten. Namun, meskipun urutan ini tetap sama di antara permintaan, urutannya tidak leksikografis. Untuk bucket dan direktori yang dibuat pada contoh sebelumnya:

  1. Ketika LIST(<bucket>) dieksekusi, direktori documents/ dimasukkan dan melintasi dimulai.

  2. Subdirektori logs/ dimasukkan dan melintasi dimulai.

  3. Objek application.txt ditemukan di dalamlogs/.

  4. Tidak ada lagi entri di dalamnyalogs/. Operasi Daftar keluar dari logs/ dan masuk documents/ lagi.

  5. documents/Direktori terus dilalui dan objek ditemukanreadme.txt.

  6. documents/Direktori terus dilalui dan subdirektori reports/ dimasukkan dan melintasi dimulai.

  7. Objek quarterly.txt ditemukan di dalamreports/.

  8. Tidak ada lagi entri di dalamnyareports/. Daftar keluar dari reports/ dan masuk documents/ lagi.

  9. Tidak ada lagi entri di dalam documents/ dan Daftar kembali.

Dalam contoh ini, logs/ dipesan sebelumnya readme.txt dan readme.txt dipesan sebelumnyareports/.

Contoh 3: Bagaimana DeleteObject permintaan S3 ke bucket direktori berinteraksi dengan direktori

Diagram yang menunjukkan struktur direktori awal sebelum operasi DELETE
  1. Dalam ember yang sama, ketika operasi DELETE(<bucket>, "documents/reports/quarterly.txt") dijalankan, objek quarterly.txt dihapus, membiarkan direktori reports/ kosong dan menyebabkannya segera dihapus. documents/Direktori tidak kosong karena memiliki direktori logs/ dan objek di readme.txt dalamnya, jadi tidak dihapus. Untuk operasi ini, hanya satu objek dan satu direktori yang dihapus.

    Diagram yang menunjukkan struktur direktori setelah operasi DELETE untuk documents/reports/quarterly.txt
  2. Ketika operasi DELETE(<bucket>, "documents/readme.txt") dijalankan, objek readme.txt dihapus. documents/masih belum kosong karena berisi direktorilogs/, jadi tidak dihapus. Untuk operasi ini, tidak ada direktori yang dihapus dan hanya objek yang dihapus.

    Diagram yang menunjukkan struktur direktori setelah operasi DELETE untuk documents/readme.txt
  3. Terakhir, ketika operasi DELETE(<bucket>, "documents/logs/application.txt") dijalankan, dihapus, application.txt dibiarkan logs/ kosong dan menyebabkannya segera dihapus. Ini kemudian dibiarkan documents/ kosong dan menyebabkannya juga segera dihapus. Untuk operasi ini, dua direktori dan satu objek dihapus. Ember itu sekarang kosong.

    Diagram yang menunjukkan struktur direktori setelah operasi DELETE untuk documents/logs/application.txt