All Products
Search
Document Center

Container Service for Kubernetes:Aktifkan QoS memori kontainer

Last Updated:Mar 27, 2026

Komponen ack-koordinator menyediakan Quality of Service (QoS) memori untuk kontainer yang berjalan di kluster ACK. Dengan menetapkan kelas QoS berbeda ke kontainer, ack-koordinator memprioritaskan alokasi memori bagi workload yang sensitif terhadap latensi dan mengurangi error out of memory (OOM) selama kontensi memori.

Catatan Sebelum menggunakan QoS memori, baca Pod Quality of Service Classes dan Assign Memory Resources to Containers and Pods dalam dokumentasi Kubernetes.

Cara kerja

Kubernetes menetapkan memory request dan memory limit untuk setiap pod. Dua mode kegagalan dapat terjadi ketika memori dibatasi:

  • Tekanan tingkat kontainer: Ketika penggunaan memori kontainer (termasuk page cache) mendekati batasnya, OS memicu reclaim memori langsung pada level memcg, sehingga memblokir proses kontainer tersebut. Jika alokasi memori lebih cepat daripada reclaim, error OOM akan menghentikan pod.

  • Tekanan tingkat node: Ketika jumlah batas memori semua kontainer melebihi kapasitas memori fisik node, kernel OS melakukan reclaim memori secara acak di antara kontainer. Hal ini menurunkan kinerja dan dapat memicu error OOM pada pod mana pun di node tersebut.

image

ack-koordinator mengatasi kedua mode kegagalan tersebut dengan mengonfigurasi secara otomatis memory control group (memcg) untuk setiap kontainer. Fitur ini mengaktifkan tiga fitur kernel Alibaba Cloud Linux:

  • Memcg QoS: mengunci jumlah minimum memori agar kontainer prioritas tinggi tetap mempertahankan working set-nya

  • Memcg backend asynchronous reclamation: melakukan reclaim memori secara proaktif sebelum mencapai batas, sehingga menghindari reclaim langsung yang memblokir

  • Memcg global minimum watermark rating: menyesuaikan ambang batas reclaim per kontainer sehingga kontainer sensitif terhadap latensi (LS) menjadi yang terakhir direclaim

Hasilnya adalah distribusi memori yang lebih adil di antara kontainer dan latensi aplikasi yang lebih rendah selama overcommitment.

Keunggulan dibanding QoS memori Kubernetes open-source

Fitur memory QoS Kubernetes upstream didukung mulai Kubernetes 1.22 ke atas, hanya mendukung cgroup v2, dan memerlukan konfigurasi kubelet manual. Fitur ini berlaku untuk semua pod dan node di kluster serta tidak mendukung konfigurasi detail halus per pod atau per namespace.

Fitur memory QoS ack-koordinator meningkatkan implementasi upstream dalam dua aspek utama:

  • Kompatibilitas kernel yang lebih luas: Mendukung antarmuka cgroup v1 dan cgroup v2, didukung oleh fitur kernel Alibaba Cloud Linux seperti memcg backend asynchronous reclamation dan minimum watermark rating. Untuk detailnya, lihat Overview of kernel features and interfaces.

  • Konfigurasi detail halus: Gunakan anotasi pod atau ConfigMap untuk mengonfigurasi QoS memori secara independen untuk pod tertentu, namespace, atau seluruh kluster.

Mekanisme konfigurasi

ack-koordinator menggunakan empat parameter cgroup untuk menerapkan kebijakan QoS memori. Tabel berikut menunjukkan bagaimana setiap parameter dipetakan ke opsi konfigurasi yang dijelaskan dalam Advanced parameters:

cgroup parameter Kontrol Dikonfigurasi oleh
memory.limit_in_bytes Batas atas keras untuk kontainer Kubernetes (dari limits.memory)
memory.high Ambang batas throttling — reclaim dimulai di sini throttlingPercent
memory.wmark_high Pemicu reclaim asinkron wmarkRatio
memory.min Lantai memori yang tidak dapat direclaim minLimitPercent / lowLimitPercent

Prioritas konfigurasi

Ketika beberapa sumber konfigurasi berlaku untuk pod yang sama, ack-koordinator menggunakan urutan prioritas berikut (tertinggi pertama):

  1. Anotasi Pod (koordinator.sh/memoryQOS)

  2. ConfigMap tingkat Namespace (ack-slo-pod-config)

  3. ConfigMap tingkat Kluster (ack-slo-config)

Pemetaan kelas QoS

Jika sebuah pod tidak memiliki label koordinator.sh/qosClass, ack-koordinator memetakan dari kelas QoS Kubernetes secara otomatis:

Kelas QoS Kubernetes Kelas QoS koordinator
Guaranteed Pengaturan QoS memori default
Burstable LS (latency-sensitive)
BestEffort BE (best-effort)

Prasyarat

Sebelum memulai, pastikan Anda telah memiliki:

  • Kluster ACK yang menjalankan Kubernetes 1.18 atau lebih baru. Untuk upgrade, lihat Manually update ACK clusters.

  • Alibaba Cloud Linux sebagai OS node. Beberapa parameter lanjutan bergantung pada fitur kernel Alibaba Cloud Linux. Lihat Advanced parameters untuk detailnya.

  • ack-koordinator versi 0.8.0 atau lebih baru telah diinstal. Lihat ack-koordinator untuk langkah instalasi.

Aktifkan QoS memori untuk pod tertentu

Tambahkan anotasi berikut ke spesifikasi pod:

annotations:
  # Aktifkan QoS memori dengan pengaturan yang direkomendasikan
  koordinator.sh/memoryQOS: '{"policy": "auto"}'
  # Nonaktifkan QoS memori
  # koordinator.sh/memoryQOS: '{"policy": "none"}'

Aktifkan QoS memori untuk kluster

Gunakan ConfigMap ack-slo-config untuk menerapkan QoS memori ke semua pod di kluster.

  1. Buat file bernama configmap.yaml dengan konten berikut:

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: ack-slo-config
      namespace: kube-system
    data:
      resource-qos-config: |-
        {
          "clusterStrategy": {
            "lsClass": {
              "memoryQOS": {
                "enable": true
              }
            },
            "beClass": {
              "memoryQOS": {
                "enable": true
              }
            }
          }
        }
  2. Tetapkan kelas QoS setiap pod menggunakan label koordinator.sh/qosClass:

    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-demo
      labels:
        koordinator.sh/qosClass: 'LS'
  3. Terapkan ConfigMap:

    • Jika ack-slo-config sudah ada di kube-system, perbarui agar tidak menimpa pengaturan lain yang tidak terkait: ``bash kubectl patch cm -n kube-system ack-slo-config --patch "$(cat configmap.yaml)" ``

    • Jika belum ada, buat: ``bash kubectl apply -f configmap.yaml ``

  4. (Opsional) Konfigurasi advanced parameters.

Aktifkan QoS memori untuk namespace

Gunakan ConfigMap ack-slo-pod-config untuk mengaktifkan atau menonaktifkan QoS memori untuk pod di namespace tertentu.

  1. Buat file bernama ack-slo-pod-config.yaml dengan konten berikut:

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: ack-slo-pod-config
      namespace: kube-system
    data:
      memory-qos: |
        {
          "enabledNamespaces": ["allow-ns"],
          "disabledNamespaces": ["block-ns"]
        }

    Ganti allow-ns dan block-ns dengan nama namespace aktual.

  2. Terapkan ConfigMap:

    kubectl patch cm -n kube-system ack-slo-pod-config --patch "$(cat ack-slo-pod-config.yaml)"
  3. (Opsional) Konfigurasi advanced parameters.

Contoh: Redis dalam kondisi overcommitment memori

Contoh ini menunjukkan bagaimana QoS memori mengurangi latensi Redis dan meningkatkan throughput saat memori node mengalami overcommitment. Pengujian menggunakan:

  • Kluster ACK Pro dengan dua node, masing-masing memiliki 8 vCPU dan memori 32 GB

  • Satu node menjalankan workload Redis, satu lagi menjalankan uji stres

Jalankan pengujian

  1. Buat file bernama redis-demo.yaml:

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: redis-demo-config
    data:
      redis-config: |
        appendonly yes
        appendfsync no
    ---
    apiVersion: v1
    kind: Pod
    metadata:
      name: redis-demo
      labels:
        koordinator.sh/qosClass: 'LS'
      annotations:
        koordinator.sh/memoryQOS: '{"policy": "auto"}'
    spec:
      containers:
      - name: redis
        image: redis:5.0.4
        command:
          - redis-server
          - "/redis-master/redis.conf"
        env:
        - name: MASTER
          value: "true"
        ports:
        - containerPort: 6379
        resources:
          limits:
            cpu: "2"
            memory: "6Gi"
          requests:
            cpu: "2"
            memory: "2Gi"
        volumeMounts:
        - mountPath: /redis-master-data
          name: data
        - mountPath: /redis-master
          name: config
      volumes:
        - name: data
          emptyDir: {}
        - name: config
          configMap:
            name: redis-demo-config
            items:
            - key: redis-config
              path: redis.conf
      nodeName: # Tetapkan ke nama node yang menjalankan Redis.
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: redis-demo
    spec:
      ports:
      - name: redis-port
        port: 6379
        protocol: TCP
        targetPort: 6379
      selector:
        name: redis-demo
      type: ClusterIP
  2. Deploy Redis:

    kubectl apply -f redis-demo.yaml
  3. Simulasikan overcommitment memori menggunakan tool Stress. Buat file bernama stress-demo.yaml:

    apiVersion: v1
    kind: Pod
    metadata:
      name: stress-demo
      labels:
        koordinator.sh/qosClass: 'BE'
      annotations:
        koordinator.sh/memoryQOS: '{"policy": "auto"}'
    spec:
      containers:
        - args:
            - '--vm'
            - '2'
            - '--vm-bytes'
            - 11G
            - '-c'
            - '2'
            - '--vm-hang'
            - '2'
          command:
            - stress
          image: polinux/stress
          imagePullPolicy: Always
          name: stress
      restartPolicy: Always
      nodeName: # Tetapkan ke node yang sama dengan redis-demo.
  4. Deploy workload stres:

    kubectl apply -f stress-demo.yaml
  5. Verifikasi global minimum watermark sebelum menjalankan benchmark.

    Penting

    Dalam skenario overcommitment memori, global minimum watermark yang rendah menyebabkan OOM killer berjalan sebelum reclaim memori. Untuk node 32 GB, atur nilai ini minimal 4.000.000 KB.

    cat /proc/sys/vm/min_free_kbytes

    Output yang diharapkan:

    4000000
  6. Deploy tool memtier-benchmark untuk mengirim permintaan ke pod Redis:

    apiVersion: v1
    kind: Pod
    metadata:
      labels:
        name: memtier-demo
      name: memtier-demo
    spec:
      containers:
        - command:
            - memtier_benchmark
            - '-s'
            - 'redis-demo'
            - '--data-size'
            - '200000'
            - "--ratio"
            - "1:4"
          image: 'redislabs/memtier_benchmark:1.3.0'
          name: memtier
      restartPolicy: Never
      nodeName: # Tetapkan ke nama node yang mengirim permintaan.
  7. Periksa hasil benchmark:

    kubectl logs -f memtier-demo
  8. Untuk perbandingan, nonaktifkan QoS memori pada kedua pod dan ulangi pengujian:

    apiVersion: v1
    kind: Pod
    metadata:
      name: redis-demo
      labels:
        koordinator.sh/qosClass: 'LS'
      annotations:
        koordinator.sh/memoryQOS: '{"policy": "none"}'
    spec:
      ...
    ---
    apiVersion: v1
    kind: Pod
    metadata:
      name: stress-demo
      labels:
        koordinator.sh/qosClass: 'BE'
      annotations:
        koordinator.sh/memoryQOS: '{"policy": "none"}'

Hasil pengujian

Penting

Data berikut hanya sebagai referensi. Hasil aktual bergantung pada konfigurasi kluster dan workload Anda.

Metrik QoS memori dinonaktifkan QoS memori diaktifkan
Latency-avg 51,32 ms 47,25 ms
Throughput-avg 149,0 MB/s 161,9 MB/s

Mengaktifkan QoS memori mengurangi latensi Redis sebesar 7,9% dan meningkatkan throughput sebesar 8,7% dalam kondisi overcommitment memori.

Parameter lanjutan

Tabel berikut mencantumkan parameter lanjutan yang dapat Anda atur dalam anotasi pod atau ConfigMap ack-slo-config. Anotasi pod memiliki prioritas lebih tinggi daripada pengaturan ConfigMap.

Catatan Kolom Anotasi dan ConfigMap menunjukkan apakah parameter tersebut dapat dikonfigurasi melalui anotasi dan ConfigMap. 对 menunjukkan didukung dan 错 menunjukkan tidak didukung.
image

<table> <thead> <tr> <td><p><b>Parameter</b></p></td> <td><p><b>Tipe</b></p></td> <td><p><b>Rentang nilai</b></p></td> <td><p><b>Deskripsi</b></p></td> <td><p><b>Anotasi pod</b></p></td> <td><p><b>ConfigMap</b></p></td> </tr> </thead> <colgroup></colgroup> <colgroup></colgroup> <colgroup></colgroup> <colgroup></colgroup> <colgroup></colgroup> <colgroup></colgroup> <tbody> <tr> <td><p><code>enable</code></p></td> <td><p>Boolean</p></td> <td> <ul> <li><p><code>true</code></p></li> <li><p><code>false</code></p></li> </ul></td> <td> <ul> <li><p><code>true</code>: mengaktifkan QoS memori untuk semua kontainer di kluster. Pengaturan memcg yang direkomendasikan untuk kelas QoS kontainer digunakan. </p></li> <li><p><code>false</code>: menonaktifkan QoS memori untuk semua kontainer di kluster. Pengaturan memcg dikembalikan ke pengaturan awal untuk kelas QoS kontainer. </p></li> </ul></td> <td><p><img></p></td> <td><p><img></p></td> </tr> <tr> <td><p><code>policy</code></p></td> <td><p>String</p></td> <td> <ul> <li><p><code>auto</code></p></li> <li><p><code>default</code></p></li> <li><p><code>none</code></p></li> </ul></td> <td> <ul> <li><p><code>auto</code>: mengaktifkan QoS memori untuk kontainer di pod dan menggunakan pengaturan yang direkomendasikan. Pengaturan yang direkomendasikan memiliki prioritas lebih tinggi daripada pengaturan yang ditentukan dalam ConfigMap ack-slo-pod-config. </p></li> <li><p><code>default</code>: menentukan bahwa pod mewarisi pengaturan yang ditentukan dalam ConfigMap ack-slo-pod-config. </p></li> <li><p><code>none</code>: menonaktifkan QoS memori untuk pod. Pengaturan memcg terkait dikembalikan ke pengaturan awal. Pengaturan awal memiliki prioritas lebih tinggi daripada pengaturan yang ditentukan dalam ConfigMap ack-slo-pod-config. </p></li> </ul></td> <td><p><img></p></td> <td><p><img></p></td> </tr> <tr> <td><p><code>minLimitPercent</code></p></td> <td><p>Int</p></td> <td><p>0\~100</p></td> <td><p>Satuan: %. Nilai default: <code>0</code>. Nilai default menunjukkan bahwa parameter ini dinonaktifkan. </p><p>Parameter ini menentukan proporsi memori request pod yang tidak dapat direclaim. Parameter ini cocok untuk skenario di mana aplikasi sensitif terhadap page cache. Anda dapat menggunakan parameter ini untuk caching file guna mengoptimalkan kinerja baca dan tulis. Untuk informasi lebih lanjut, lihat topik Alibaba Cloud Linux <a href="https://www.alibabacloud.com/help/en/document_detail/169536.html#concept-2482889">Memcg QoS feature of the cgroup v1 interface</a>. </p><p>Jumlah memori yang tidak dapat direclaim dihitung berdasarkan rumus berikut: <code>Nilai memory.min = Memory request × Nilai minLimitPercent/100</code>. Misalnya, jika Anda menentukan <code>Memory Request=100MiB</code> dan <code>minLimitPercent=100</code> untuk kontainer, <code>nilai memory.min adalah 104857600</code>. </p></td> <td><p><img></p></td> <td><p><img></p></td> </tr> <tr> <td><p><code>lowLimitPercent</code></p></td> <td><p>Int</p></td> <td><p>0\~100</p></td> <td><p>Satuan: %. Nilai default: <code>0</code>. Nilai default menunjukkan bahwa parameter ini dinonaktifkan. </p><p>Parameter ini menentukan proporsi relatif memori request pod yang tidak dapat direclaim. Untuk informasi lebih lanjut, lihat topik Alibaba Cloud Linux <a href="https://www.alibabacloud.com/help/en/document_detail/169536.html#concept-2482889">Memcg QoS feature of the cgroup v1 interface</a>. </p><p>Jumlah memori yang relatif tidak dapat direclaim dihitung berdasarkan rumus berikut: <span><code>Nilai memory.low = Memory request × Nilai lowLimitPercent/100</code></span>. Misalnya, jika Anda menentukan <span><code>Memory Request=100MiB</code></span> dan <span><code>lowLimitPercent=100</code></span> untuk kontainer, <span><code>nilai memory.low adalah 104857600</code></span>. </p></td> <td><p><img></p></td> <td><p><img></p></td> </tr> <tr> <td><p><code>throttlingPercent</code></p></td> <td><p>Int</p></td> <td><p>0\~100</p></td> <td><p>Satuan: %. Nilai default: <code>0</code>. Nilai default menunjukkan bahwa parameter ini dinonaktifkan. </p><p>Parameter ini menentukan ambang batas throttling memori berdasarkan rasio penggunaan memori kontainer terhadap batas memori kontainer. Jika penggunaan memori kontainer melebihi ambang batas throttling memori, memori yang digunakan oleh kontainer akan direclaim. Parameter ini cocok untuk skenario overcommitment memori kontainer. Anda dapat menggunakan parameter ini untuk mencegah cgroup memicu OOM. Untuk informasi lebih lanjut, lihat topik Alibaba Cloud Linux <a href="https://www.alibabacloud.com/help/en/document_detail/169536.html#concept-2482889">Memcg QoS feature of the cgroup v1 interface</a>. </p><p>Ambang batas throttling memori untuk penggunaan memori dihitung berdasarkan rumus berikut: <code>Nilai memory.high = Memory limit × Nilai throttlingPercent/100</code>. Misalnya, jika Anda menentukan <code>Memory Limit=100MiB</code> dan <code>throttlingPercent=80</code> untuk kontainer, <code>nilai memory.high adalah 83886080(80 MiB)</code>. </p></td> <td><p><img></p></td> <td><p><img></p></td> </tr> <tr> <td><p><code>wmarkRatio</code></p></td> <td><p>Int</p></td> <td><p>0\~100</p></td> <td><p>Satuan: %. Nilai default: <code>95</code>. Nilai <code>0</code> menunjukkan bahwa parameter ini dinonaktifkan. Jika penggunaan memori melebihi ambang batas reclaim, fitur memcg backend asynchronous reclamation dipicu. </p><p>Parameter ini menentukan ambang batas reclaim memori asinkron berdasarkan rasio penggunaan memori terhadap batas memori atau penggunaan memori terhadap nilai <code>memory.high</code>. Untuk informasi lebih lanjut, lihat topik Alibaba Cloud Linux <a href="https://www.alibabacloud.com/help/en/document_detail/169535.html#task-2487938">Memcg backend asynchronous reclaim</a>. </p><p>Jika throttlingPercent dinonaktifkan, ambang batas reclaim memori untuk penggunaan memori dihitung berdasarkan rumus berikut: Nilai memory.wmark_high = Memory limit × wmarkRatio/100. Jika throttlingPercent diaktifkan, ambang batas reclaim memori untuk penggunaan memori dihitung berdasarkan rumus berikut: <code>Nilai memory.wmark_high = Nilai memory.high × wmarkRatio/100</code>. Misalnya, jika Anda menentukan <code>Memory Limit=100MiB</code> dan <code>wmarkRatio=95,throttlingPercent=80</code> untuk kontainer, ambang batas throttling memori yang ditentukan oleh <code>memory.high adalah 83886080 (80 MiB)</code>, rasio reclaim memori <code>memory.wmark_ratio adalah 95</code>, dan ambang batas reclaim memori yang ditentukan oleh <code>memory.wmark_high adalah 79691776 (76 MiB)</code>. </p></td> <td><p><img></p></td> <td><p><img></p></td> </tr> <tr> <td><p><code>wmarkMinAdj</code></p></td> <td><p>Int</p></td> <td><p>-25\~50</p></td> <td><p>Satuan: %. Nilai default adalah <code>-25</code> untuk kelas QoS <code>LS</code> dan <code>50</code> untuk kelas QoS <code>BE</code>. Nilai <code>0</code> menunjukkan bahwa parameter ini dinonaktifkan. </p><p>Parameter ini menentukan penyesuaian global minimum watermark untuk kontainer. Nilai negatif menurunkan global minimum watermark sehingga menunda reclaim memori untuk kontainer tersebut. Nilai positif meningkatkan global minimum watermark sehingga mempercepat reclaim memori untuk kontainer tersebut. Untuk informasi lebih lanjut, lihat topik Alibaba Cloud Linux <a href="https://www.alibabacloud.com/help/en/document_detail/169537.html#task-2492619">Memcg global minimum watermark rating</a>. </p><p>Misalnya, jika Anda membuat pod dengan kelas QoS LS, pengaturan default parameter ini adalah <code>memory.wmark_min_adj=-25</code>, yang menunjukkan bahwa minimum watermark diturunkan sebesar 25% untuk kontainer di pod tersebut. </p></td> <td><p><img></p></td> <td><p><img></p></td> </tr> </tbody> </table>

FAQ

Apakah konfigurasi QoS memori dari ack-slo-manager masih berlaku setelah upgrade ke ack-koordinator?

Ya. ack-koordinator kompatibel mundur dengan protokol berbasis anotasi yang digunakan di ack-slo-manager 0.8.0 dan sebelumnya:

  • alibabacloud.com/qosClass — menetapkan kelas QoS

  • alibabacloud.com/memoryQOS — mengonfigurasi QoS memori

Tabel berikut menunjukkan protokol yang didukung setiap versi:

Versi komponen Protokol alibabacloud.com Protokol koordinator.sh
≥ 0.3.0 dan < 0.8.0 ×
≥ 0.8.0

Dukungan kompatibilitas untuk protokol alibabacloud.com berakhir pada 30 Juli 2023. Migrasikan konfigurasi Anda ke protokol koordinator.sh.

Penagihan

Tidak ada biaya untuk menginstal atau menggunakan komponen ack-koordinator. Namun, biaya mungkin berlaku dalam kasus berikut:

  • Penggunaan sumber daya node: ack-koordinator adalah komponen non-managed yang berjalan di node pekerja. Anda dapat mengonfigurasi permintaan sumber daya untuk setiap modul saat instalasi.

  • Metrik Prometheus: Jika Anda mengaktifkan metrik Prometheus untuk ack-koordinator dan menggunakan Managed Service for Prometheus, metrik tersebut dikenai biaya sebagai custom metrics. Sebelum mengaktifkan fitur ini, tinjau Managed Service for Prometheus billing rules. Untuk memantau penggunaan, lihat Query the amount of observable data and bills.

Langkah berikutnya