All Products
Search
Document Center

Container Service for Kubernetes:Praktik terbaik untuk optimasi cache data Fluid

Last Updated:Aug 30, 2026

Konfigurasikan caching data Fluid untuk menyeimbangkan kinerja, stabilitas, dan konsistensi baca/tulis.

Setiap bagian mencakup konfigurasi yang direkomendasikan dan contoh YAML untuk pola workload umum.

Kapan caching data membantu

Caching memberikan manfaat bagi workload yang membaca data yang sama secara berulang. Pastikan workload Anda sesuai dengan pola ini sebelum mengonfigurasi sistem cache.

Workload pattern Caching benefit Contoh
Pembacaan berulang data yang sama Tinggi Pelatihan AI yang melakukan iterasi pada dataset selama beberapa epoch
Pembacaan konkuren file bersama Tinggi Layanan inferensi memuat model bersama ke dalam Memori GPU saat startup
Data bersama di berbagai tugas Tinggi Job SparkSQL memproses data pesanan yang dirujuk oleh beberapa kueri analitik
Pembacaan satu kali Tidak ada Pembersihan data ETL atau migrasi data satu kali
Workload hanya menulis Tidak ada Tidak ada operasi baca pada path data yang sama
Akses dengan frekuensi sangat rendah Tidak ada Cache kedaluwarsa atau dievict sebelum digunakan kembali

Jika caching berlaku untuk workload Anda, terapkan kebijakan berikut.

Optimasi kinerja

Konfigurasikan infrastruktur (tipe instans ECS dan media cache), sesuaikan parameter cache, serta selaraskan penjadwalan Pod dengan penempatan cache.

Pilih tipe instans ECS untuk sistem cache

Cache terdistribusi menggabungkan kapasitas penyimpanan dan bandwidth di seluruh node. Perkirakan batas atas untuk kluster cache Anda:

  • Kapasitas cache tersedia = Kapasitas cache per Worker Pod × Jumlah replika Worker Pod

  • Bandwidth cache tersedia = Jumlah replika Worker Pod × min{Bandwidth maksimum yang tersedia pada node ECS tempat Worker Pod berjalan, Throughput I/O media cache yang digunakan oleh Worker Pod}

  • Bandwidth aplikasi maksimum teoretis = min{Bandwidth yang tersedia pada node ECS tempat aplikasi Pod berjalan, Bandwidth cache tersedia}

Bandwidth aktual bergantung pada bandwidth node aplikasi dan pola akses (sequential vs. random). Saat beberapa aplikasi Pod mengakses data secara konkuren, bandwidth cache dibagi bersama.

Contoh estimasi

Tambahkan dua instans ecs.g7nex.8xlarge ke kluster ACK Anda sebagai Worker Pod cache, masing-masing dengan memori 100 GiB pada node terpisah. Aplikasi Pod berjalan pada satu instans ecs.gn7i-c8g1.2xlarge (8 vCPU, memori 30 GiB, bandwidth 16 Gbps).

Metric Perhitungan Hasil
Kapasitas cache tersedia 100 GiB x 2 200 GiB
Bandwidth cache tersedia 2 x min{40 Gbps, Throughput I/O akses memori} 80 Gbps
Bandwidth aplikasi maksimum (pada cache hit) min{80 Gbps, 16 Gbps} 16 Gbps

Bottleneck-nya adalah bandwidth node aplikasi sebesar 16 Gbps, bukan kluster cache. Untuk meningkatkan throughput, gunakan tipe instans dengan bandwidth lebih tinggi atau distribusikan workload ke beberapa aplikasi Pod.

Tipe instans ECS yang direkomendasikan

Pilih tipe instans berbandwidth tinggi untuk node cache. Gunakan memori untuk throughput maksimum, atau SSD lokal untuk kapasitas lebih besar dengan biaya lebih rendah.

Keluarga instans ECS Tipe instans ECS Konfigurasi
g7nex, general-purpose peningkatan jaringan ecs.g7nex.8xlarge 32 vCPU, memori 128 GiB, bandwidth 40 Gbps
ecs.g7nex.16xlarge 64 vCPU, memori 256 GiB, bandwidth 80 Gbps
ecs.g7nex.32xlarge 128 vCPU, memori 512 GiB, bandwidth 160 Gbps
i4g, penyimpanan SSD lokal ecs.i4g.16xlarge 64 vCPU, memori 256 GiB, 2 x 1920 GB SSD lokal, bandwidth 32 Gbps
ecs.i4g.32xlarge 128 vCPU, memori 512 GiB, 4 x 1920 GB SSD lokal, bandwidth 64 Gbps
g7ne, general-purpose peningkatan jaringan ecs.g7ne.8xlarge 32 vCPU, memori 128 GiB, bandwidth 25 Gbps
ecs.g7ne.12xlarge 48 vCPU, memori 192 GiB, bandwidth 40 Gbps
ecs.g7ne.24xlarge 96 vCPU, memori 384 GiB, bandwidth 80 Gbps
g8i, general-purpose ecs.g8i.24xlarge 96 vCPU, memori 384 GiB, bandwidth 50 Gbps
ecs.g8i.16xlarge 64 vCPU, memori 256 GiB, bandwidth 32 Gbps

Lihat Keluarga instans untuk spesifikasi lengkap.

Pilih media cache

Media cache menentukan batas throughput I/O untuk setiap node. Bahkan jika instans ECS memiliki bandwidth jaringan tinggi, media cache yang lambat akan menjadi bottleneck.

Penting

SSD Perusahaan (ESSD) sering kali tidak dapat memenuhi kebutuhan kinerja workload intensif data. Misalnya, satu disk PL2 memiliki throughput maksimum 750 MB/detik. Jika Anda menggunakan satu disk PL2 sebagai media cache pada instans dengan bandwidth 40 Gbps, bandwidth cache efektif dibatasi hingga 750 MB/detik, sehingga kapasitas jaringan instans tersebut terbuang sia-sia.

Media cache yang tersedia:

Media cache mediumtype volumeType path Paling cocok untuk
Memori MEM emptyDir /dev/shm Throughput maksimum; dataset muat dalam memori
Disk sistem (SSD lokal) SSD emptyDir /var/lib/fluid/cache Kapasitas lebih besar dengan biaya lebih rendah; siklus hidup cache terikat pada Worker Pod
Disk data SSD terpasang SSD hostPath /mnt/disk1 Disk khusus untuk penyimpanan cache
Beberapa disk data SSD SSD hostPath /mnt/disk1,/mnt/disk2 Kapasitas lokal tertinggi; kapasitas didistribusikan merata di seluruh disk

Konfigurasikan media cache dan kapasitasnya di spec.tieredstore pada resource Runtime:

Memori sebagai media cache

spec:
  tieredstore:
    levels:
      - mediumtype: MEM
        volumeType: emptyDir
        path: /dev/shm
        quota: 30Gi # Kapasitas cache per replika Worker Pod.
        high: "0.99"
        low: "0.95"

Penyimpanan lokal sebagai media cache

Pilih berdasarkan konfigurasi disk Anda:

Penyimpanan disk sistem:

spec:
  tieredstore:
    levels:
      - mediumtype: SSD
        volumeType: emptyDir # emptyDir mengikat siklus hidup cache ke Worker Pod, mencegah data sisa.
        path: /var/lib/fluid/cache
        quota: 100Gi # Kapasitas cache per replika Worker Pod.
        high: "0.99"
        low: "0.95"

Disk data SSD terpasang:

spec:
  tieredstore:
    levels:
      - mediumtype: SSD
        volumeType: hostPath
        path: /mnt/disk1,/mnt/disk2 # Jalur mount disk data pada Host.
        quota: 100Gi # Kapasitas cache per replika Pod Worker. Kapasitas didistribusikan secara merata: /mnt/disk1 dan /mnt/disk2 masing-masing mendapatkan 50 GiB.
        high: "0.99"
        low: "0.95"

Beberapa disk data SSD:

spec:
  tieredstore:
    levels:
      - mediumtype: SSD
        volumeType: hostPath
        path: /mnt/disk1,/mnt/disk2 # Path pemasangan disk data pada host.
        quota: 100Gi # Kapasitas cache per replika Worker Pod. Kapasitas didistribusikan merata: /mnt/disk1 dan /mnt/disk2 masing-masing mendapat 50 GiB.
        high: "0.99"
        low: "0.95"
high dan low watermark mengontrol eviksi cache. Saat penggunaan cache melebihi ambang batas high, sistem cache mengevict data hingga penggunaan turun ke ambang batas low.

Konfigurasikan afinitas penjadwalan antara cache dan aplikasi

Latensi jaringan lintas zona antara aplikasi Pod dan cache Worker Pod menurunkan kinerja akses data. Deploy keduanya dalam zona yang sama.

Secara spesifik:

  • Deploy cache Worker Pod dalam zona yang sama bila memungkinkan.

  • Deploy aplikasi Pod dalam zona yang sama dengan cache Worker Pod bila memungkinkan.

Penting

Mengkonsentrasikan semua Pod dalam satu zona mengurangi kemampuan pemulihan bencana. Seimbangkan kinerja dan ketersediaan berdasarkan service-level agreement (SLA) Anda.

Tentukan zona cache dengan mengonfigurasi spec.nodeAffinity pada resource Dataset:

apiVersion: data.fluid.io/v1alpha1
kind: Dataset
metadata:
  name: demo-dataset
spec:
  ...
  nodeAffinity:
    required:
      nodeSelectorTerms:
        - matchExpressions:
            - key: topology.kubernetes.io/zone
              operator: In
              values:
                - <ZONE_ID> # Zona untuk deploy cache Worker Pod, misalnya cn-beijing-i.

Ini menempatkan cache Worker Pod pada node di zona yang ditentukan. Fluid juga dapat secara otomatis menyuntikkan aturan afinitas agar aplikasi Pod dijadwalkan berdekatan dengan cache Worker Pod. Lihat Optimalkan penjadwalan berdasarkan afinitas cache data.

Sesuaikan parameter prefetch untuk pembacaan sequential file besar

Workload yang melakukan pembacaan sequential penuh pada file besar dapat memperoleh manfaat dari pengaturan prefetch agresif. Contoh umum meliputi:

  • Pelatihan AI pada dataset dalam format TFRecord atau Tar

  • Startup layanan inferensi memuat file parameter model

  • Analitik terdistribusi membaca file Parquet

Prefetch agresif meningkatkan amplifikasi baca. Untuk pembacaan acak atau file kecil, pengaturan ini membuang bandwidth pada data yang tidak digunakan. Gunakan nilai default untuk workload campuran atau pembacaan acak.

Konfigurasi prefetch bervariasi tergantung runtime.

JindoRuntime

Konfigurasikan prefetch Filesystem in Userspace (FUSE) di spec.fuse.properties:

kind: JindoRuntime
metadata:
  ...
spec:
  fuse:
    properties:
      fs.oss.download.thread.concurrency: "200"
      fs.oss.read.buffer.size: "8388608"
      fs.oss.read.readahead.max.buffer.count: "200"
      fs.oss.read.sequence.ambiguity.range: "2147483647" # Sekitar 2 GB.
Parameter Deskripsi
fs.oss.download.thread.concurrency Jumlah thread prefetch konkuren.
fs.oss.read.buffer.size Ukuran buffer prefetch tunggal.
fs.oss.read.readahead.max.buffer.count Jumlah maksimum buffer untuk prefetch aliran tunggal.
fs.oss.read.sequence.ambiguity.range Rentang yang digunakan untuk menentukan apakah pola baca bersifat sequential.

JuiceFSRuntime

Konfigurasikan prefetch di spec.fuse.options dan spec.worker.options:

kind: JuiceFSRuntime
metadata:
  ...
spec:
  fuse:
    options:
      buffer-size: "2048"
      cache-size: "0"
      max-uploads: "150"
  worker:
    options:
      buffer-size: "2048"
      max-downloads: "200"
      max-uploads: "150"
  master:
    resources:
      requests:
        memory: 2Gi
      limits:
        memory: 8Gi
  ...
Parameter Deskripsi
buffer-size Ukuran buffer baca/tulis.
max-downloads Konkurensi download prefetch.
max-uploads Konkurensi upload.
fuse cache-size Kapasitas cache lokal untuk FUSE.

Mengatur cache-size: "0" menonaktifkan cache lokal FUSE, sehingga menggunakan memori node sebagai Linux Page Cache. Pada cache miss, data dibaca dari cache terdistribusi JuiceFSRuntime Worker. Lihat dokumentasi JuiceFS untuk panduan tuning detail.

Optimasi stabilitas

Kebijakan berikut mengatasi risiko stabilitas umum: overload metadata, kehilangan data saat restart Pod, crash OOM FUSE, dan kegagalan titik pemasangan.

Hindari pemasangan direktori dengan terlalu banyak file

Sistem cache mempertahankan metadata untuk setiap file dalam direktori yang dipasang. Memasang direktori dengan terlalu banyak file (seperti root sistem penyimpanan skala besar) menghabiskan memori dan CPU berlebihan.

Pasang subdirektori spesifik yang sesuai dengan cakupan data Anda. Buat Dataset terpisah untuk koleksi data berbeda.

apiVersion: data.fluid.io/v1alpha1
kind: Dataset
metadata:
  name: demo-dataset
spec:
  ...
  mounts:
  - mountPoint: oss://<BUCKET>/<PATH1>/<SUBPATH>/
    name: sub-bucket
Beberapa sistem cache menambah kompleksitas operasional. Pilih granularitas yang tepat berdasarkan kebutuhan Anda.
Skenario Pendekatan
Dataset kecil dengan sedikit file dan relevansi kuat Satu Dataset dan satu sistem cache
Dataset besar dengan banyak file Pisahkan menjadi beberapa Dataset berdasarkan direktori data. Aplikasi Pod dapat memasang beberapa Dataset.
Beberapa pengguna atau persyaratan isolasi data Buat Dataset berumur pendek per pengguna atau job. Pertimbangkan Kubernetes Operator untuk manajemen dinamis.

Pertahankan metadata dengan penyimpanan tahan lama

JindoRuntime dan sistem cache serupa menggunakan arsitektur Master-Worker. Pod Master menyimpan metadata file dan status cache untuk penyimpanan backend yang dipasang. Tanpa metadata persisten, restart memerlukan pembangunan ulang status penuh.

Gunakan persistent volume claim (PVC) yang didukung ESSD untuk menyimpan metadata secara tahan lama:

apiVersion: data.fluid.io/v1alpha1
kind: JindoRuntime
metadata:
  name: sd-dataset
spec:
  ...
  volumes:
    - name: meta-vol
      persistentVolumeClaim:
        claimName: demo-jindo-master-meta
  master:
    resources:
      requests:
        memory: 4Gi
      limits:
        memory: 8Gi
    volumeMounts:
      - name: meta-vol
        mountPath: /root/jindofs-meta
    properties:
      namespace.meta-dir: "/root/jindofs-meta"

Di sini, demo-jindo-master-meta adalah PVC yang telah dibuat sebelumnya dan didukung oleh ESSD. Metadata tetap ada setelah restart Pod dan bermigrasi bersama Pod. Lihat Gunakan JindoRuntime untuk mempertahankan status Pod Master.

Alokasikan resource Pod FUSE

Pod FUSE memasang sistem file FUSE pada node dan melakukan bind-mount ke dalam aplikasi Pod, menyediakan antarmuka POSIX untuk membaca data remote sebagai file lokal.

Untuk mencegah kegagalan pemasangan akibat OOM, hindari menetapkan batas memori Pod FUSE, atau atur mendekati memori alokasi node:

spec:
  fuse:
    resources:
      requests:
        memory: 8Gi
    # limits:
    #   memory: <ECS_ALLOCATABLE_MEMORY>
Jika Pod FUSE di-kill karena OOM, titik pemasangan aplikasi Pod rusak. Restart aplikasi untuk membangun kembali pemasangan, kecuali self-healing FUSE diaktifkan (lihat di bawah).

Aktifkan self-healing FUSE

Secara default, crash FUSE membuat titik pemasangan tidak dapat diakses. Kontainer aplikasi harus direstart untuk memicu kembali bind mount.

Mekanisme self-healing FUSE Fluid secara otomatis memulihkan akses titik pemasangan setelah restart FUSE tanpa memerlukan restart kontainer aplikasi.

Penting

Selama jendela restart FUSE, titik pemasangan tidak dapat diakses. Aplikasi harus menangani error I/O dan menyertakan logika retry.

Self-healing FUSE memiliki keterbatasan. Aktifkan hanya jika restart mengganggu, seperti lingkungan interaktif Jupyter Notebook atau VS Code.

Lihat Cara mengaktifkan kemampuan auto-recovery FUSE.

Konsistensi baca/tulis cache

Caching memunculkan tantangan konsistensi — konsistensi kuat sering kali menurunkan kinerja. Pilih kebijakan yang sesuai dengan pola baca/tulis workload Anda.

Tabel berikut merangkum lima skenario. Lihat setiap subbagian untuk detail konfigurasi.

Skenario Perubahan data backend Mode akses Pendekatan konfigurasi
Data read-only, statis Tidak ada ReadOnlyMany (default) Konfigurasi Dataset default
Data read-only, perubahan periodik Periodik (terjadwal) ReadOnlyMany DataLoad dengan kebijakan Cron
Perubahan hanya-baca berbasis event Sesuai permintaan ReadOnlyMany Nonaktifkan cache metadata; atur timeout metadata FUSE
Baca/tulis, direktori terpisah Melalui path tulis terpisah ReadOnlyMany + ReadWriteMany Dua Dataset dengan mode akses berbeda
Baca/tulis, direktori sama In-place ReadWriteMany Satu Dataset; backend kompatibel POSIX

Skenario 1: Data read-only tanpa perubahan backend

Kapan digunakan: Satu job pelatihan AI membaca dataset tetap selama beberapa epoch. Cache dihapus setelah pelatihan.

Konfigurasi: Fluid secara default menggunakan mode read-only. Gunakan konfigurasi Dataset default atau atur secara eksplisit:

apiVersion: data.fluid.io/v1alpha1
kind: Dataset
metadata:
  name: demo-dataset
spec:
  ...
  # accessModes: ["ReadOnlyMany"] ReadOnlyMany adalah nilai default.
---
apiVersion: data.fluid.io/v1alpha1
kind: DataLoad
metadata:
  name: demo-dataset-warmup
spec:
  ...
  policy: Cron
  schedule: "0 0 * * *" # Pra-ambil data pada pukul 00:00 setiap hari.
  loadMetadata: true # Sinkronkan perubahan metadata dari penyimpanan backend selama pra-ambil.
  target:
  - path: /path/to/warmup # Jalur di penyimpanan backend untuk di-pra-ambil.

Mengatur accessModes: ["ReadOnlyMany"] mencegah penulisan tidak disengaja ke dataset selama pelatihan.

Skenario 2: Data read-only dengan perubahan backend periodik

Kapan digunakan: Data bisnis dikumpulkan setiap hari di penyimpanan backend. Job analisis malam hari memproses data harian tersebut. Hasil ditulis langsung ke penyimpanan backend, melewati cache.

Konfigurasi: Gunakan resource DataLoad dengan kebijakan Cron untuk menyinkronkan perubahan dari penyimpanan backend secara berkala:

apiVersion: data.fluid.io/v1alpha1
kind: Dataset
metadata:
  name: demo-dataset
spec:
  ...
  # accessModes: ["ReadOnlyMany"] ReadOnlyMany adalah nilai default.
---
apiVersion: data.fluid.io/v1alpha1
kind: DataLoad
metadata:
  name: demo-dataset-warmup
spec:
  ...
  policy: Cron
  schedule: "0 0 * * *" # Prefetch data setiap hari pukul 00:00.
  loadMetadata: true # Sinkronkan perubahan metadata dari penyimpanan backend selama prefetch.
  target:
  - path: /path/to/warmup # Path di penyimpanan backend untuk prefetch.

loadMetadata: true juga menyegarkan metadata selama setiap prefetch, menjaga konsistensi cache dengan penyimpanan backend.

Skenario 3: Data read-only dengan perubahan backend berbasis event

Kapan digunakan: Pengguna mengunggah model kustom ke penyimpanan backend dan memilihnya untuk inferensi. Cache harus mencerminkan unggahan baru tanpa menunggu sinkronisasi terjadwal.

Konfigurasi: Nonaktifkan cache metadata sisi server dan atur timeout metadata FUSE yang singkat untuk memaksa pemeriksaan penyimpanan backend pada setiap akses.

Menggunakan JindoRuntime:

apiVersion: data.fluid.io/v1alpha1
kind: Dataset
metadata:
  name: demo-dataset
spec:
  mounts:
    - mountPoint: <MOUNTPOINT>
      name: data
      path: /
      options:
        metaPolicy: ALWAYS # Nonaktifkan cache metadata sisi server.
---
apiVersion: data.fluid.io/v1alpha1
kind: JindoRuntime
metadata:
  name: demo-dataset
spec:
  fuse:
    args:
      - -oauto_cache
      # Timeout metadata dalam detik. Mengatur ke 0 memberikan konsistensi kuat tetapi dapat sangat mengurangi efisiensi baca.
      - -oattr_timeout=30
      - -oentry_timeout=30
      - -onegative_timeout=30
      - -ometrics_port=0

Mengatur metaPolicy: ALWAYS menonaktifkan cache metadata sisi server, memaksa setiap akses metadata untuk langsung mengkueri penyimpanan backend.

Mengatur attr_timeout, entry_timeout, dan negative_timeout ke 0 memberikan konsistensi kuat tetapi dapat secara signifikan mengurangi kinerja baca. Nilai 30 (detik) menyeimbangkan kesegaran dan kinerja untuk sebagian besar skenario berbasis event.

Skenario 4: Baca dan tulis di direktori terpisah

Kapan digunakan: Pelatihan terdistribusi skala besar membaca data dari direktori A dan menulis checkpoint ke direktori B setiap epoch. Caching tulisan meningkatkan efisiensi checkpoint.

Konfigurasi: Buat dua Dataset. Atur satu sebagai read-only untuk data pelatihan dan yang lain sebagai read-write untuk checkpoint:

apiVersion: data.fluid.io/v1alpha1
kind: Dataset
metadata:
  name: train-samples
spec:
  ...
  # accessModes: ["ReadOnlyMany"] ReadOnlyMany adalah nilai default.
---
apiVersion: data.fluid.io/v1alpha1
kind: Dataset
metadata:
  name: model-ckpt
spec:
  ...
  accessModes: ["ReadWriteMany"]

Pasang kedua Dataset ke aplikasi Pod:

apiVersion: v1
kind: Pod
metadata:
  ...
spec:
  containers:
  ...
    volumeMounts:
    - name: train-samples-vol
      mountPath: /data/A
    - name: model-ckpt-vol
      mountPath: /data/B
  volumes:
    - name: train-samples-vol
      persistentVolumeClaim:
        claimName: train-samples
    - name: model-ckpt-vol
      persistentVolumeClaim:
        claimName: model-ckpt

Ini mengisolasi dataset pelatihan dari checkpoint. Dataset train-samples read-only mencegah masalah konsistensi terkait penulisan, sedangkan Dataset model-ckpt read-write memungkinkan caching tulisan.

Skenario 5: Baca dan tulis di direktori yang sama

Kapan digunakan: Pengembangan interaktif, seperti ruang kerja Jupyter Notebook online atau VS Code, di mana file sering dibuat, dimodifikasi, dan dihapus dalam direktori bersama.

Konfigurasi: Atur mode akses Dataset ke read-write. Gunakan backend penyimpanan kompatibel POSIX:

apiVersion: data.fluid.io/v1alpha1
kind: Dataset
metadata:
  name: myworkspace
spec:
  ...
  accessModes: ["ReadWriteMany"]

ReadWriteMany memungkinkan akses baca/tulis konkuren ke direktori yang sama oleh beberapa pengguna atau proses.

Referensi