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.
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.
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:
Memcg QoS: Yüksek öncelikli konteynerlerin çalışma kümesini koruması için minimum miktarda belleği kilitler.
Memcg arka uç eşzamansız geri kazanımı: Sınıra ulaşılmadan önce belleği proaktif olarak geri kazanarak doğrudan geri kazanımın engellenmesini önler.
Memcg genel minimum su işareti derecelendirmesi: Konteyner başına geri kazanım eşiğini ayarlayarak gecikmeye duyarlı (LS) konteynerlerin en son geri kazanılmasını sağlar.
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:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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:
Pod açıklaması (
koordinator.sh/memoryQOS)Ad alanı düzeyinde ConfigMap (
ack-slo-pod-config)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:
|
|
|
|
|
|
|
|
|
|
|
|
Ön koşullar
Başlamadan önce şunlara sahip olduğunuzdan emin olun:
Kubernetes 1.18+ çalıştıran bir ACK kümesi. Bkz. ACK kümelerini manuel olarak güncelleme.
Düğüm işletim sistemi olarak Alinux. Bazı gelişmiş parametreler Alinux çekirdek özelliklerine bağlıdır. Bkz. Gelişmiş parametreler.
Yüklenmiş ack-koordinator 0.8.0+. Bkz. ack-koordinator.
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.
-
Aşağıdaki içeriğe sahip
configmap.yamldosyası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 } } } } -
Her podun QoS sınıfını
koordinator.sh/qosClassetiketiyle ayarlayın:apiVersion: v1 kind: Pod metadata: name: pod-demo labels: koordinator.sh/qosClass: 'LS' -
ConfigMap'i uygulayın:
ack-slo-configzatenkube-systemiç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``
(İ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.
-
Aşağıdaki içeriğe sahip
ack-slo-pod-config.yamldosyası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-nsveblock-nsdeğerlerini gerçek ad alanı adlarıyla değiştirin. -
ConfigMap'i uygulayın:
kubectl patch cm -n kube-system ack-slo-pod-config --patch "$(cat ack-slo-pod-config.yaml)" (İ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
-
redis-demo.yamldosyası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 -
Redis'i dağıtın:
kubectl apply -f redis-demo.yaml -
Stress aracıyla bellek aşırı tahsisini simüle edin.
stress-demo.yamldosyası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. -
Stres iş yükünü dağıtın:
kubectl apply -f stress-demo.yaml -
Karşılaştırma testini çalıştırmadan önce genel minimum su işaretini doğrulayın.
ÖnemliBellek 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_kbytesBeklenen çıktı:
4000000 -
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. -
Karşılaştırma sonuçlarını kontrol edin:
kubectl logs -f memtier-demo -
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ı
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.
|
|
|
|
|
|
|
|
|
|
|
|
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.
Açıklama ve ConfigMap sütunları, parametrenin açıklamalar ve ConfigMap üzerinden yapılandırılabilir olup olmadığını gösterir.
desteklendiğini,
ise desteklenmediğini belirtir.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Birim: %. Varsayılan değer: Formül: |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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ı ayarlaralibabacloud.com/memoryQOS— bellek QoS'yi yapılandırır
Aşağıdaki tabloda her sürümün hangi protokolleri desteklediği gösterilmektedir:
|
|
|
|
|
|
|
|
|
|
|
|
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:
Düğüm kaynak kullanımı: ack-koordinator, çalışan düğümlerde çalışan yönetilmeyen bir bileşendir. Yükleme sırasında her modül için kaynak isteklerini yapılandırabilirsiniz.
Prometheus ölçümleri: ack-koordinator için Prometheus ölçümlerini etkinleştirir ve Managed Service for Prometheus kullanırsanız ölçümler özel ölçümler olarak faturalandırılır. Bu özelliği etkinleştirmeden önce Managed Service for Prometheus faturalandırma kurallarını inceleyin. Kullanımı izlemek için bkz. Gözlemlenebilir veri miktarını ve faturaları sorgulama.
Sonraki adımlar
Çekirdek özellikleri ve arabirimlerine genel bakış — ACK bellek QoS tarafından gereken çekirdek özellikleri
Konteynerler için CPU QoS'yi etkinleştirin — gecikmeye duyarlı iş yüklerini korumak için geri kazanılan kaynakları sınırlayın ve evikte edin
L3 önbelleği ve MBA'ya dayalı kaynak yalıtımını etkinleştirin