Tüm Ürünler
Search
Belge Merkezi

Container Service for Kubernetes:Enable container memory QoS

Son Güncelleme:Oct 06, 2026

Bellek çekişmesi sırasında OOM hatalarını azaltmak ve gecikmeye duyarlı konteynerler için belleği önceliklendirmek üzere ack-koordinator'u kullanın.

Not

Bellek QoS'yi kullanmadan önce Kubernetes belgelerindeki Pod Hizmet Kalitesi Sınıfları ve Konteynerlere ve Podlara Bellek Kaynakları Atama konularını okuyun.

Nasıl çalışır

Kubernetes, her poda bir bellek isteği ve sınırı atar. Bellek baskısı altında iki tür arıza durumu oluşabilir:

  • Konteyner düzeyinde baskı: Bir konteynerin bellek kullanımı (sayfa önbelleği dahil) sınırına yaklaştığında işletim sistemi memcg düzeyinde doğrudan geri kazanımı tetikler ve işlemleri engeller. Tahsis, geri kazanım hızını aşarsa bir OOM hatası podu sonlandırır.

  • Düğüm düzeyinde baskı: Toplam konteyner bellek sınırları düğümün fiziksel belleğini aştığında çekirdek, belleği konteynerler arasında ayrım yapmaksızın geri kazanır. Bu durum performansı düşürür ve potansiyel olarak OOM hatalarını tetikler.

image

ack-koordinator, Alibaba Cloud Linux (Alinux) çekirdeğinin üç özelliğini kullanarak konteyner başına bellek kontrol grubunu (memcg) yapılandırır ve her iki sorunu da ele alır:

Bu yaklaşım, aşırı tahsis sırasında daha adil bir bellek dağılımı ve daha düşük gecikme süresi sağlar.

Açık kaynak Kubernetes bellek QoS'ye göre avantajları

Yukarı akış Kubernetes bellek QoS özelliği (Kubernetes 1.22+) yalnızca cgroup v2'yi destekler, manuel kubelet yapılandırması gerektirir ve pod veya ad alanı düzeyinde ayrıntıgranülarite sunmaz.

ack-koordinator, yukarı akış uygulamasını iki şekilde geliştirir:

  • Daha geniş çekirdek uyumluluğu: cgroup v1 ve v2'yi destekler; memcg arka uç eşzamansız geri kazanımı ve minimum su işareti derecelendirmesi gibi Alinux çekirdek özelliklerine dayanır. Ayrıntılar için bkz. Çekirdek özellikleri ve arabirimlerine genel bakış.

  • Ayrıntılı yapılandırma: Pod açıklamaları veya ConfigMap'ler aracılığıyla bellek QoS'yi pod, ad alanı veya küme düzeyinde yapılandırabilirsiniz.

Yapılandırma mekanizması

ack-koordinator, bellek QoS için dört cgroup parametresi kullanır. Her biri Gelişmiş parametreler bölümündeki yapılandırma seçenekleriyle eşleşir:


cgroup parametresi


Kontrol eder


Tarafından yapılandırılır


memory.limit_in_bytes


Konteyner için sabit üst sınır


Kubernetes (limits.memory değerinden)


memory.high


Kısıtlama eşiği — geri kazanım burada başlar


throttlingPercent


memory.wmark_high


Eşzamansız geri kazanım tetikleyicisi


wmarkRatio


memory.min


Geri kazanılamaz bellek tabanı


minLimitPercent / lowLimitPercent

image.svg

Yapılandırma önceliği

Aynı pod için birden fazla yapılandırma kaynağı geçerli olduğunda ack-koordinator aşağıdaki öncelik sırasını (en yüksekten en düşüğe) kullanır:

  1. Pod açıklaması (koordinator.sh/memoryQOS)

  2. Ad alanı düzeyinde ConfigMap (ack-slo-pod-config)

  3. Küme düzeyinde ConfigMap (ack-slo-config)

QoS sınıfı eşlemesi

Bir podda koordinator.sh/qosClass etiketi yoksa ack-koordinator Kubernetes QoS sınıflarını otomatik olarak eşler:


Kubernetes QoS sınıfı


koordinator QoS sınıfı


Guaranteed


Varsayılan bellek QoS ayarları


Burstable


LS (gecikmeye duyarlı)


BestEffort


BE (en iyi çaba)

Ön koşullar

Başlamadan önce şunlara sahip olduğunuzdan emin olun:

Belirli bir pod için bellek QoS'yi etkinleştirin

Pod spesifikasyonuna aşağıdaki açıklamayı ekleyin:

annotations:
  # Enable memory QoS with recommended settings
  koordinator.sh/memoryQOS: '{"policy": "auto"}'
  # Disable memory QoS
  # koordinator.sh/memoryQOS: '{"policy": "none"}'

Bir küme için bellek QoS'yi etkinleştirin

Kümedeki tüm podlara bellek QoS uygulamak için ack-slo-config ConfigMap'ini kullanın.

  1. Aşağıdaki içeriğe sahip configmap.yaml dosyasını oluşturun:

    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. Her podun QoS sınıfını koordinator.sh/qosClass etiketiyle ayarlayın:

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

    • ack-slo-config zaten kube-system içinde varsa diğer ayarları korumak için güncelleyin: ``bash kubectl patch cm -n kube-system ack-slo-config --patch "$(cat configmap.yaml)" ``

    • Yoksa oluşturun: ``bash kubectl apply -f configmap.yaml ``

  4. (İsteğe bağlı) gelişmiş parametreleri yapılandırın.

Bir ad alanı için bellek QoS'yi etkinleştirin

Belirli ad alanlarında bulunan podlar için bellek QoS'yi etkinleştirmek veya devre dışı bırakmak üzere ack-slo-pod-config ConfigMap'ini kullanın.

  1. Aşağıdaki içeriğe sahip ack-slo-pod-config.yaml dosyasını oluşturun:

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

    allow-ns ve block-ns değerlerini gerçek ad alanı adlarıyla değiştirin.

  2. ConfigMap'i uygulayın:

    kubectl patch cm -n kube-system ack-slo-pod-config --patch "$(cat ack-slo-pod-config.yaml)"
  3. (İsteğe bağlı) gelişmiş parametreleri yapılandırın.

Örnek: Bellek aşırı tahsisi altında Redis

Bu örnek, bellek aşırı tahsisi altında bellek QoS'nin Redis gecikme süresini nasıl azalttığını ve aktarım hızını nasıl artırdığını gösterir. Test şu ortamı kullanır:

  • İki düğümlü (her biri 8 vCPU, 32 GB) bir ACK Pro kümesi

  • Redis için bir düğüm, stres testi için diğer düğüm

Testi çalıştırın

  1. redis-demo.yaml dosyasını oluşturun:

    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: # Set to the name of the node running 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. Redis'i dağıtın:

    kubectl apply -f redis-demo.yaml
  3. Stress aracıyla bellek aşırı tahsisini simüle edin. stress-demo.yaml dosyasını oluşturun:

    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: # Set to the same node as redis-demo.
  4. Stres iş yükünü dağıtın:

    kubectl apply -f stress-demo.yaml
  5. Karşılaştırma testini çalıştırmadan önce genel minimum su işaretini doğrulayın.

    Önemli

    Bellek aşırı tahsisi senaryolarında düşük bir genel minimum su işareti, bellek geri kazanımından önce OOM killer'ın çalışmasına neden olur. 32 GB'lık bir düğüm için bu değeri en az 4.000.000 KB olarak ayarlayın.

    cat /proc/sys/vm/min_free_kbytes

    Beklenen çıktı:

    4000000
  6. Redis poduna istek göndermek için memtier-benchmark'ı dağıtın:

    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: # Set to the name of the node sending requests.
  7. Karşılaştırma sonuçlarını kontrol edin:

    kubectl logs -f memtier-demo
  8. Karşılaştırmak için her iki podda da bellek QoS'yi devre dışı bırakın ve testi tekrarlayın:

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

Test sonuçları

Önemli

Sonuçlar yalnızca referans amaçlıdır. Gerçek değerler küme yapılandırmasına ve iş yüküne bağlıdır.


Ölçüm


Bellek QoS devre dışı


Bellek QoS etkin


Latency-avg


51,32 ms


47,25 ms


Throughput-avg


149,0 MB/s


161,9 MB/s

Bellek QoS'nin etkinleştirilmesi, bellek aşırı tahsisi altında Redis gecikme süresini %7,9 oranında azaltmış ve aktarım hızını %8,7 oranında artırmıştır.

Gelişmiş parametreler

Bu parametreleri pod açıklamalarında veya ack-slo-config ConfigMap'inde yapılandırın. Pod açıklamaları önceliklidir.

Not

Açıklama ve ConfigMap sütunları, parametrenin açıklamalar ve ConfigMap üzerinden yapılandırılabilir olup olmadığını gösterir. Supported desteklendiğini, Not supported ise desteklenmediğini belirtir.


Parametre


Tür


Değer aralığı


Açıklama


Pod açıklaması


ConfigMap


enable


Boolean


- true- false


- true: Önerilen memcg ayarlarıyla tüm konteynerler için bellek QoS'yi etkinleştirir.- false: Tüm konteynerler için bellek QoS'yi devre dışı bırakır ve varsayılan memcg ayarlarını geri yükler.

Not supported

Supported


policy


Dize


- auto- default- none


- auto: ack-slo-pod-config ConfigMap'ini geçersiz kılarak önerilen ayarlarla bellek QoS'yi etkinleştirir.- default: Ayarları ack-slo-pod-config ConfigMap'inden devralır.- none: ack-slo-pod-config ConfigMap'ini geçersiz kılarak bellek QoS'yi devre dışı bırakır ve varsayılan memcg ayarlarını geri yükler.

Supported

Not supported


minLimitPercent


Int


0~100

Birim: %. Varsayılan değer: 0 (devre dışı). Pod bellek isteğinin geri kazanılamaz oranı. Sayfa önbelleğine duyarlı uygulamalar için dosyaları önbelleğe almak amacıyla kullanın. Bkz. cgroup v1 arabiriminin Memcg QoS özelliği.

Formül: memory.min = request × minLimitPercent/100. Örneğin, Memory Request=100MiB ve minLimitPercent=100 iken memory.min değeri 104857600 olur.

Supported

Supported


lowLimitPercent


Int


0~100


Birim: %. Varsayılan değer: 0 (devre dışı). Pod bellek isteğinin nispeten geri kazanılamaz oranı. Bkz. cgroup v1 arabiriminin Memcg QoS özelliği. Formül: memory.low = request × lowLimitPercent/100. Örneğin, Memory Request=100MiB ve lowLimitPercent=100 iken memory.low değeri 104857600 olur.

Supported

Supported


throttlingPercent


Int


0~100


Birim: %. Varsayılan değer: 0 (devre dışı). Konteyner kullanımının sınıra oranı olarak bellek kısıtlama eşiği. Aşıldığında bellek geri kazanılır. Aşırı tahsis senaryolarında cgroup düzeyinde OOM oluşmasını önler. Bkz. cgroup v1 arabiriminin Memcg QoS özelliği. Formül: memory.high = limit × throttlingPercent/100. Örneğin, Memory Limit=100MiB ve throttlingPercent=80 iken memory.high değeri 83886080(80 MiB) olur.

Supported

Supported


wmarkRatio


Int


0~100


Birim: %. Varsayılan değer: 95. 0 bu parametreyi devre dışı bırakır. Kullanım eşiği aştığında memcg arka uç eşzamansız geri kazanımı tetiklenir. Eşzamansız geri kazanım eşiği: Kullanımın sınıra oranı veya kullanımın memory.high değerine oranı. Bkz. Memcg arka uç eşzamansız geri kazanımı. throttlingPercent devre dışıysa formül şöyledir: memory.wmark_high değeri = Bellek sınırı × wmarkRatio/100. throttlingPercent etkinse formül şöyledir: memory.wmark_high = memory.high × wmarkRatio/100. Örneğin, Memory Limit=100MiB ve wmarkRatio=95,throttlingPercent=80 iken: memory.high değeri 83886080 (80 MiB), memory.wmark_ratio değeri 95 ve memory.wmark_high değeri 79691776 (76 MiB) olur.

Supported

Supported


wmarkMinAdj


Int


-25~50


Birim: %. Varsayılan değer LS QoS sınıfı için -25, BE QoS sınıfı için 50 değeridir. 0 bu parametreyi devre dışı bırakır. Konteyner başına genel minimum su işaretini ayarlar. Negatif değerler geri kazanımı geciktirir; pozitif değerler hızlandırır. Bkz. Memcg genel minimum su işareti derecelendirmesi. Örneğin, bir LS podu varsayılan olarak memory.wmark_min_adj=-25 değerine sahiptir ve minimum su işaretini %25 oranında azaltır.

Supported

Supported

SSS

ack-koordinator'a yükseltme yaptıktan sonra ack-slo-manager'dan gelen bellek QoS yapılandırması hala geçerli mi?

Evet. ack-koordinator, ack-slo-manager 0.8.0 ve önceki sürümlerde kullanılan açıklama tabanlı protokol ile geriye dönük uyumludur:

  • alibabacloud.com/qosClass — QoS sınıfını ayarlar

  • alibabacloud.com/memoryQOS — bellek QoS'yi yapılandırır

Aşağıdaki tabloda her sürümün hangi protokolleri desteklediği gösterilmektedir:


Bileşen sürümü


alibabacloud.com protokolü


koordinator.sh protokolü


≥ 0.3.0 ve < 0.8.0


✓


×


≥ 0.8.0


✓


✓

alibabacloud.com protokolü desteği 30 Temmuz 2023'te sona ermiştir. koordinator.sh protokolüne geçiş yapın.

Faturalandırma

ack-koordinator bileşenini yüklemek veya kullanmak için ücret alınmaz. Ancak aşağıdaki durumlarda maliyetler oluşabilir:

Sonraki adımlar