All Products
Search
Document Center

Container Service for Kubernetes:Aktifkan QoS memori kontainer

Last Updated:Jun 17, 2026

Gunakan ack-koordinator untuk memprioritaskan memori bagi kontainer yang sensitif terhadap latensi dan mengurangi error OOM saat terjadi persaingan sumber daya.

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 request dan limit memori untuk setiap pod. Dua mode kegagalan terjadi saat tekanan memori meningkat:

  • Tekanan tingkat kontainer: Ketika penggunaan memori kontainer (termasuk page cache) mendekati limit-nya, OS memicu reclamation langsung tingkat memcg, sehingga proses diblokir. Jika alokasi lebih cepat daripada reclamation, error OOM akan menghentikan pod tersebut.

  • Tekanan tingkat node: Ketika total limit memori kontainer melebihi kapasitas memori fisik node, kernel melakukan reclamation memori secara acak di seluruh kontainer, menurunkan kinerja, dan berpotensi memicu error OOM.

image

ack-koordinator mengatasi kedua masalah tersebut dengan mengonfigurasi memory control group (memcg) per kontainer, menggunakan tiga fitur kernel Alibaba Cloud Linux (Alinux):

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

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

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

Hal ini menghasilkan distribusi memori yang lebih adil dan latensi lebih rendah saat terjadi overcommitment.

Keunggulan dibanding QoS memori Kubernetes open-source

Fitur memory QoS Kubernetes upstream (Kubernetes 1.22+) hanya mendukung cgroup v2, memerlukan konfigurasi kubelet manual, dan tidak memiliki granularitas per-pod atau per-namespace.

ack-koordinator meningkatkan implementasi upstream dalam dua aspek:

  • Kompatibilitas kernel yang lebih luas: Mendukung cgroup v1 dan v2, didukung oleh fitur-fitur kernel Alinux seperti memcg backend asynchronous reclamation dan minimum watermark rating. Lihat Overview of kernel features and interfaces.

  • Konfigurasi granular tingkat tinggi: Konfigurasikan QoS memori per pod, namespace, atau kluster melalui anotasi pod atau ConfigMap.

Mekanisme konfigurasi

ack-koordinator menggunakan empat parameter cgroup untuk QoS memori. Masing-masing dipetakan ke opsi konfigurasi dalam Advanced parameters:

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

Prioritas konfigurasi

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

  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 secara otomatis memetakan kelas QoS Kubernetes sebagai berikut:

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:

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

  1. Buat file 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 untuk setiap pod menggunakan label koordinator.sh/qosClass:

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

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

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

  4. (Opsional) Konfigurasikan advanced parameters.

Aktifkan QoS memori untuk namespace

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

  1. Buat file 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 yang sebenarnya.

  2. Terapkan ConfigMap tersebut:

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

Contoh: Redis dalam kondisi overcommitment memori

Contoh ini menunjukkan bagaimana QoS memori mengurangi latensi Redis dan meningkatkan throughput dalam kondisi overcommitment memori. Pengujian menggunakan:

  • Kluster ACK Pro dengan dua node (masing-masing 8 vCPU, 32 GB)

  • Satu node untuk Redis, satu lagi untuk pengujian stres

Jalankan pengujian

  1. Buat file 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 tempat Redis berjalan.
    ---
    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 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, nilai global minimum watermark yang rendah menyebabkan OOM killer berjalan sebelum reclamation 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 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 pengirim 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

Hasil hanya sebagai referensi. Nilai aktual bergantung pada konfigurasi kluster dan beban kerja.

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

Konfigurasikan parameter berikut melalui anotasi pod atau ConfigMap ack-slo-config. Anotasi pod memiliki prioritas lebih tinggi.

Catatan Kolom Anotasi dan ConfigMap menunjukkan apakah parameter tersebut dapat dikonfigurasi melalui anotasi dan ConfigMap. Supported menunjukkan didukung dan Not supported 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 dengan pengaturan memcg yang direkomendasikan.</p></li> <li><p><code>false</code>: menonaktifkan QoS memori untuk semua kontainer dan mengembalikan pengaturan memcg default.</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 dengan pengaturan yang direkomendasikan, menggantikan ConfigMap ack-slo-pod-config.</p></li> <li><p><code>default</code>: mewarisi pengaturan dari ConfigMap ack-slo-pod-config.</p></li> <li><p><code>none</code>: menonaktifkan QoS memori dan mengembalikan pengaturan memcg default, menggantikan 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> (dinonaktifkan). </p><p>Proporsi memori request pod yang tidak dapat direclaim. Gunakan ini untuk menyimpan cache file pada aplikasi yang sensitif terhadap page cache. Lihat<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>Rumus: <code>Nilai memory.min = Request memori × Nilai minLimitPercent/100</code>. Contohnya, dengan <code>Memory Request=100MiB</code> dan <code>minLimitPercent=100</code>, <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> (dinonaktifkan). </p><p>Proporsi relatif memori request pod yang tidak dapat direclaim. Lihat<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>Rumus: <span><code>Nilai memory.low = Request memori × Nilai lowLimitPercent/100</code></span>. Contohnya, dengan <span><code>Memory Request=100MiB</code></span> dan <span><code>lowLimitPercent=100</code></span>, <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> (dinonaktifkan). </p><p>Ambang batas throttling memori sebagai rasio penggunaan kontainer terhadap limit. Saat dilampaui, memori direclaim. Mencegah OOM tingkat cgroup dalam skenario overcommitment. Lihat<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>Rumus: <code>Nilai memory.high = Limit memori × Nilai throttlingPercent/100</code>. Contohnya, dengan <code>Memory Limit=100MiB</code> dan <code>throttlingPercent=80</code>, <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>. <code>0</code> menonaktifkan parameter ini. Saat penggunaan melebihi ambang batas, reclamation asinkron backend memcg dipicu. </p><p>Ambang batas reclamation asinkron: rasio penggunaan terhadap limit, atau penggunaan terhadap <code>memory.high</code>. Lihat<a href="https://www.alibabacloud.com/help/en/document_detail/169535.html#task-2487938">Memcg backend asynchronous reclaim</a>. </p><p>Jika throttlingPercent dinonaktifkan, rumusnya adalah: Nilai memory.wmark_high = Limit memori × wmarkRatio/100. Jika throttlingPercent diaktifkan, rumusnya adalah: <code>Nilai memory.wmark_high = Nilai memory.high × wmarkRatio/100</code>. Contohnya, dengan <code>Memory Limit=100MiB</code> dan <code>wmarkRatio=95,throttlingPercent=80</code>: <code>memory.high adalah 83886080 (80 MiB)</code>, <code>memory.wmark_ratio adalah 95</code>, dan <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>. <code>0</code> menonaktifkan parameter ini. </p><p>Menyesuaikan global minimum watermark per kontainer. Nilai negatif menunda reclamation; nilai positif mempercepatnya. Lihat<a href="https://www.alibabacloud.com/help/en/document_detail/169537.html#task-2492619">Memcg global minimum watermark rating</a>. </p><p>Contohnya, pod LS secara default menggunakan <code>memory.wmark_min_adj=-25</code>, mengurangi minimum watermark sebesar 25%. </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 oleh masing-masing versi:

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

Dukungan untuk protokol alibabacloud.com berakhir pada 30 Juli 2023. Lakukan migrasi ke protokol koordinator.sh.

Penagihan

Tidak ada biaya untuk instalasi atau penggunaan 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 request 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 selanjutnya