CPU limitleri, konteynerlerin ayrılan işlem süresinden daha fazlasını tüketmesini engeller. Ancak Linux çekirdeği bu limitleri 100 milisaniyelik zamanlama döngüleri üzerinden uygular; bu durum, bir konteynerin son bir saniyedeki ortalama kullanımı normal görünse bile tek bir döngüde kotayı tamamen tüketebileceği anlamına gelir. Sonuç olarak CPU kısıtlaması (throttling) meydana gelir: İş parçacıkları bir sonraki döngüye kadar askıya alınır ve bu durum saniye düzeyindeki ölçümlerde görünmeyen gecikmelere yol açar.
CPU Burst, bu sorunu çözmek için konteynerlerin kullanılmayan CPU kotasını biriktirmesine ve kısa süreli talep artışları sırasında harcamasına olanak tanır. ack-koordinator, kısıtlama olaylarını izler ve pod belirtimindeki CPU limitini değiştirmeden cgroup kota parametrelerini dinamik olarak ayarlar. Bu yaklaşım, tüm sistem genelinde CPU limitlerini artırmanıza gerek kalmadan gecikme duyarlı iş yüklerinde kuyruk ucundaki gecikmeyi azaltır.
Bu konudan en iyi şekilde yararlanmak için CFS Zamanlayıcısı ve düğüm CPU yönetim ilkeleri hakkında bilgi sahibi olun.
Nasıl çalışır?
CPU, zaman paylaşımına dayalı bir kaynaktır. Çekirdek, Completely Fair Scheduler (CFS) kullanarak CPU zamanını sabit zamanlama döngülerinde tahsis eder. Döngü uzunluğu cpu.cfs_period_us (genellikle 100 ms) ile kontrol edilir. Bir konteynerin döngü başına kullanabileceği CPU süresi ise cpu.cfs_quota_us tarafından belirlenir. CPU limiti 4 olan bir konteyner, her 100 ms'lik döngüde 400 ms CPU süresi alır.
Sorun şudur: Saniye düzeyindeki ortalamalar düşük görünse bile CPU kullanımı milisaniye seviyesinde dalgalıdır. Aşağıdaki grafik bunu göstermektedir: Mor çizgi saniye başına CPU kullanımının 4 çekirdeğin oldukça altında kaldığını gösterirken, yeşil çizgi bazı dönemlerde milisaniye düzeyindeki kullanımın 4 çekirdeğin üzerine çıktığını gösterir. Bu ani yükselişler CFS kotasını tükettiğinde çekirdek konteyneri kısıtlar.

Kısıtlama, iş parçacıklarını bir sonraki zamanlama döngüsünü beklemeye zorlar; bu durum yanıt süresini (RT) artırır ve uzun kuyruk gecikmesine neden olur. Aşağıdaki tablo, 4 çekirdekli bir düğümde CPU limiti 2 olan bir web hizmeti konteyneri için bunun pratikte nasıl göründüğünü göstermektedir.
<table> <thead> <tr> <td><p>Son bir saniyedeki genel CPU kullanımı düşük olsa bile kısıtlama, Thread 2'nin req 2 isteğini işlemeyi tamamlaması için bir sonraki zamanlama döngüsünü beklemesine neden olur. Bu durum istek RT değerini artırır ve uzun kuyruk RT sorunlarının yaygın bir nedenidir.<img></p></td> <td><p>CPU Burst etkinleştirildikten sonra konteyner kullanılmayan CPU zamanını biriktirir. Ani yükselişler sırasında bu zamanı kullanır. Böylece performans artar ve gecikme azalır.<img></p><p></p></td> </tr> </thead> <colgroup></colgroup> <colgroup></colgroup> <tbody></tbody> </table>
Talep, biriken kotanın karşılayabileceği seviyenin üzerine çıktığında (örneğin ani trafik artışı gibi), ack-koordinator toplam düğüm yükünü güvenli sınırlar içinde tutarken CPU darboğazını saniyeler içinde çözer.
ack-koordinator yalnızca düğüm cgroup'undaki cfs quota parametresini ayarlar. Pod belirtimindeki CPU limit alanını değiştirmez.
Kullanım senaryoları
Düşük ortalama kullanıma rağmen kısıtlama. CPU kullanımı çoğu zaman CPU limitinin altında kalır, ancak zamanlama döngüleri içindeki kısa süreli ani yükselişler yine de kısıtlamayı tetikler. CPU Burst, konteynerin bu ani yükselişler sırasında birikmiş kotayı harcamasına olanak tanıyarak kısıtlamayı azaltır ve hizmet kalitesini iyileştirir.
CPU yoğun başlatma nedeniyle yavaş açılış. Konteyner, başlatma ve yükleme aşamalarında yüksek CPU gücüne ihtiyaç duyarken kararlı duruma geçtiğinde daha düşük bir seviyede çalışır. CPU Burst, konteynerin başlatma sırasında sürekli yüksek bir CPU limiti gerektirmeden ek CPU zamanı kullanmasını sağlar.
Faturalama
ack-koordinator ücretsiz olarak yüklenebilir ve kullanılabilir. Ancak aşağıdaki iki durumda ek ücretler uygulanabilir:
Çalışan düğüm kaynakları: ack-koordinator yönetilmeyen bir bileşendir. Yüklemeden sonra çalışan düğümlerinizde çalışır ve onların kaynaklarını tüketir. Yükleme sırasında her modül için kaynak isteklerini yapılandırın.
Prometheus ölçümleri: ack-koordinator, kaynak profil oluşturma ve zamanlama ölçümlerini Prometheus formatında sunar. Enable Prometheus monitoring metrics for ACK-Koordinator seçeneğini etkinleştirir ve Alibaba Cloud Prometheus kullanırsanız bu ölçümler özel ölçümler olarak sayılır ve ücrete tabi olur. Etkinleştirmeden önce Prometheus örneği fiyatlandırmasını inceleyin ve tüketimi izlemek için kullanım sorgularını kullanın.
Ön koşullar
Başlamadan önce aşağıdakilere sahip olduğunuzdan emin olun:
Kubernetes 1.18 veya sonraki bir sürümü çalıştıran ACK yönetilen küme Pro sürümü. Bkz. ACK yönetilen küme oluşturma ve Kümeyi manuel olarak yükseltme.
Kümede ack-koordinator sürüm 0.8.0 veya üzerinin yüklü olması. Bkz. ack-koordinator.
Düğüm işletim sistemi olarak Alibaba Cloud Linux kullanın. Çekirdek düzeyindeki CPU Burst desteği daha hassas kota kontrolü sağlar. Bkz. CPU Burst ilkesini etkinleştirmek için Alibaba Cloud Linux kullanmam gerekir mi?.
CPU Burst'i etkinleştirme
CPU Burst üç farklı kapsamda etkinleştirilebilir. Daha dar kapsamdaki yapılandırma önceliklidir: pod açıklamaları (annotations), ad alanı düzeyindeki ConfigMap'leri; bunlar da küme düzeyindeki ConfigMap'i geçersiz kılar.
| Kapsam | Yöntem | Öncelik |
|---|---|---|
| Tek pod | Pod açıklaması (annotation) | En yüksek |
| Ad alanı | ack-slo-pod-config ConfigMap |
Orta |
| Tüm küme | ack-slo-config ConfigMap |
En düşük |
Belirli bir pod için etkinleştirme
Pod YAML dosyasındaki metadata altına açıklamayı ekleyin. Bir Deployment veya başka bir iş yükü için açıklamayı bunun yerine template.metadata içine ayarlayın.
annotations:
# Enable CPU Burst for this pod.
koordinator.sh/cpuBurst: '{"policy": "auto"}'
# Disable CPU Burst for this pod.
koordinator.sh/cpuBurst: '{"policy": "none"}'
Tüm küme için etkinleştirme
-
Aşağıdaki içeriğe sahip
configmap.yamldosyasını oluşturun.apiVersion: v1 data: cpu-burst-config: '{"clusterStrategy": {"policy": "auto"}}' #cpu-burst-config: '{"clusterStrategy": {"policy": "cpuBurstOnly"}}' #cpu-burst-config: '{"clusterStrategy": {"policy": "none"}}' kind: ConfigMap metadata: name: ack-slo-config namespace: kube-system -
ConfigMap'i uygulayın. Diğer ayarların üzerine yazılmasını önlemek için
ack-slo-configzatenkube-systemad alanında varsa PATCH komutunu kullanın.ConfigMap varsa: ``
bash kubectl patch cm -n kube-system ack-slo-config --patch "$(cat configmap.yaml)"``Yoksa: ``
bash kubectl apply -f configmap.yaml``
Belirli bir ad alanı için etkinleştirme
-
Aşağıdaki içeriğe sahip
configmap.yamldosyasını oluşturun.apiVersion: v1 kind: ConfigMap metadata: name: ack-slo-pod-config namespace: koordinator-system # Create this namespace manually before first use. data: # Enable or disable CPU Burst for selected namespaces. cpu-burst: | { "enabledNamespaces": ["allowed-ns"], "disabledNamespaces": ["blocked-ns"] } # Enables CPU Burst for all pods in the allowed-ns namespace. Policy is auto. # Disables CPU Burst for all pods in the blocked-ns namespace. Policy is none. -
ConfigMap'i uygulayın. Diğer ayarların üzerine yazılmasını önlemek için
ack-slo-pod-configzatenkoordinator-systemad alanında varsa PATCH komutunu kullanın.ConfigMap varsa: ``
bash kubectl patch cm -n koordinator-system ack-slo-pod-config --patch "$(cat configmap.yaml)"``Yoksa: ``
bash kubectl apply -f configmap.yaml``
Yük testi ile doğrulama
Bu örnekte, CPU Burst'in erişim gecikmesini nasıl azalttığını göstermek için bir Apache HTTP Server pod'u kullanılmaktadır.
-
Aşağıdaki içeriğe sahip
apache-demo.yamldosyasını oluşturun. Açıklama, bu pod için CPU Burst'i etkinleştirir.apiVersion: v1 kind: Pod metadata: name: apache-demo annotations: koordinator.sh/cpuBurst: '{"policy": "auto"}' # Enable CPU Burst. spec: containers: - command: - httpd - -D - FOREGROUND image: registry.cn-zhangjiakou.aliyuncs.com/acs/apache-2-4-51-for-slo-test:v0.1 imagePullPolicy: Always name: apache resources: limits: cpu: "4" memory: 10Gi requests: cpu: "4" memory: 10Gi nodeName: $nodeName # Replace with the actual node name. hostNetwork: False restartPolicy: Never schedulerName: default-scheduler -
Apache HTTP Server'ı dağıtın.
kubectl apply -f apache-demo.yaml -
wrk2 kullanarak bir yük testi çalıştırın.
$target_ip_addressdeğerini Apache pod'unun IP adresiyle değiştirin.# Download and extract the open-source wrk2 tool. See https://github.com/giltene/wrk2. # The Apache image has Gzip compression enabled to simulate server-side request processing. # Adjust QPS pressure by changing the -R parameter. ./wrk -H "Accept-Encoding: deflate, gzip" -t 2 -c 12 -d 120 --latency --timeout 2s -R 24 http://$target_ip_address:8010/static/file.1m.test
Sonuçlar
Aşağıdaki tablolar, hem Alibaba Cloud Linux hem de CentOS üzerinde CPU Burst etkinleştirildiğinde ve etkinleştirilmediğinde p99 yanıt süresi, CPU kısıtlama oranı ve ortalama pod CPU kullanımını karşılaştırmaktadır.
Tümü devre dışı: CPU Burst ilkesi
noneolarak ayarlanır.Tümü etkin: CPU Burst ilkesi
autoolarak ayarlanır.
Aşağıdaki değerler teoriktir. Gerçek sonuçlar ortamınıza bağlı olarak değişir.
<table> <thead> <tr> <td><p><b>Alibaba Cloud Linux</b></p></td> <td><p><b>Tümü devre dışı</b></p></td> <td><p><b>Tümü etkin</b></p></td> </tr> </thead> <colgroup></colgroup> <colgroup></colgroup> <colgroup></colgroup> <tbody> <tr> <td><p>apache RT-p99</p></td> <td><p>107,37 ms</p></td> <td><p>67,18 ms (-%37,4)</p></td> </tr> <tr> <td><p>CPU Kısıtlama Oranı</p></td> <td><p>%33,3</p></td> <td><p>%0</p></td> </tr> <tr> <td><p>Ortalama Pod CPU Kullanımı</p></td> <td><p>%31,8</p></td> <td><p>%32,6</p></td> </tr> </tbody> </table><table> <thead> <tr> <td><p><b>CentOS</b></p></td> <td><p><b>Tümü devre dışı</b></p></td> <td><p><b>Tümü etkin</b></p></td> </tr> </thead> <colgroup></colgroup> <colgroup></colgroup> <colgroup></colgroup> <tbody> <tr> <td><p>apache RT-p99</p></td> <td><p>111,69 ms</p></td> <td><p>71,30 ms (-%36,2)</p></td> </tr> <tr> <td><p>CPU Kısıtlama Oranı</p></td> <td><p>%33</p></td> <td><p>%0</p></td> </tr> <tr> <td><p>Ortalama Pod CPU Kullanımı</p></td> <td><p>%32,5</p></td> <td><p>%33,8</p></td> </tr> </tbody> </table>
CPU Burst'in etkinleştirilmesi, ortalama CPU kullanımında ihmal edilebilir bir değişiklik olmasına rağmen p99 yanıt süresini yaklaşık %37 azaltır ve CPU kısıtlama oranını %0'a düşürür.
Gelişmiş yapılandırma
Gelişmiş parametreleri bir pod açıklamasında veya bir ConfigMap'te yapılandırabilirsiniz. Pod açıklamaları önceliklidir, ardından ad alanı düzeyindeki ConfigMap'ler ve son olarak küme düzeyindeki ConfigMap gelir.
# Example ConfigMap ack-slo-config.
data:
cpu-burst-config: |
{
"clusterStrategy": {
"policy": "auto",
"cpuBurstPercent": 1000,
"cfsQuotaBurstPercent": 300,
"sharePoolThresholdPercent": 50,
"cfsQuotaBurstPeriodSeconds": -1
}
}
# Example pod annotation.
koordinator.sh/cpuBurst: '{"policy": "auto", "cpuBurstPercent": 1000, "cfsQuotaBurstPercent": 300, "cfsQuotaBurstPeriodSeconds": -1}'
Açıklama ve ConfigMap sütunları, her bir parametrenin pod açıklaması veya ConfigMap aracılığıyla yapılandırmayı destekleyip desteklemediğini gösterir.
desteklendiği anlamına gelir.
desteklenmediği anlamına gelir.
<table> <thead> <tr> <td><p><b>Parametre</b></p></td> <td><p><b>Tür</b></p></td> <td><p><b>Açıklama</b></p></td> <td><p><b>Açıklama</b></p></td> <td><p><b>ConfigMap</b></p></td> </tr> </thead> <colgroup></colgroup> <colgroup></colgroup> <colgroup></colgroup> <colgroup></colgroup> <colgroup></colgroup> <tbody> <tr> <td><p><code>policy</code></p></td> <td><p>dize</p></td> <td> <ul> <li><p><code>none</code> (varsayılan): CPU Burst'i devre dışı bırakır. İlgili tüm parametreler başlangıç değerlerine sıfırlanır.</p></li> <li><p><code>cpuBurstOnly</code>: Yalnızca Alibaba Cloud Linux çekirdek düzeyindeki CPU Burst esnekliğini etkinleştirir.</p></li> <li><p><code>cfsQuotaBurstOnly</code>: Yalnızca CFS kota esnekliğini etkinleştirir. Tüm çekirdek sürümleriyle çalışır.</p></li> <li><p><code>auto</code>: Hem Alibaba Cloud Linux çekirdek özelliklerini hem de CFS kota esnekliğini otomatik olarak etkinleştirir.</p></li> </ul></td> <td><p><img></p></td> <td><p><img></p></td> </tr> <tr> <td><p><code>cpuBurstPercent</code></p></td> <td><p>tamsayı</p></td> <td><p>Varsayılan: <code>1000</code>. Birim: yüzde.</p><p>Alibaba Cloud Linux çekirdek düzeyindeki CPU Burst esnekliği için bu değer, CPU Burst'in CPU limitinin ne kadar üzerine çıkacağını belirler. cgroup parametresi <code>cpu.cfs_burst_us</code> ile eşlenir. Ayrıntılar için bkz. <a href="https://www.alibabacloud.com/help/en/document_detail/306980.html#task-2108025">cgroup v1 arabirimini kullanarak CPU Burst'i etkinleştirme</a>.</p><p>Örneğin, varsayılan ayarda <code>CPU Limit = 1</code> değeri <code>cpu.cfs_quota_us</code> değerini 100.000 olarak ayarlar. Ardından <code>cpu.cfs_burst_us</code> 1.000.000 olur; bu da 10 katlık bir artıştır.</p></td> <td><p><img></p></td> <td><p><img></p></td> </tr> <tr> <td><p><code>cfsQuotaBurstPercent</code></p></td> <td><p>tamsayı</p></td> <td><p>Varsayılan: <code>300</code>. Birim: yüzde.</p><p>CFS kota esnekliği etkinleştirildiğinde, bu değer cgroup parametresi <code>cpu.cfs_quota_us</code> için izin verilen maksimum artış oranını belirler. Varsayılan değer 3 kattır.</p></td> <td><p><img></p></td> <td><p><img></p></td> </tr> <tr> <td><p><code>cfsQuotaBurstPeriodSeconds</code></p></td> <td><p>tamsayı</p></td> <td><p>Varsayılan: <code>-1</code>. Birim: saniye. -1 sınırsız anlamına gelir.</p><p>CFS kota esnekliği etkinleştirildiğinde, bu değer bir pod'un artırılmış kota (<code>cfsQuotaBurstPercent</code>) ile CPU tüketebileceği süreyi belirler. Bu süre sonunda pod'un <code>cpu.cfs_quota_us</code> değeri orijinal değerine sıfırlanır. Diğer pod'lar etkilenmez.</p></td> <td><p><img></p></td> <td><p><img></p></td> </tr> <tr> <td><p><code>sharePoolThresholdPercent</code></p></td> <td><p>tamsayı</p></td> <td><p>Varsayılan: <code>50</code>. Birim: yüzde.</p><p>CFS kota esnekliği etkinleştirildiğinde, bu değer düğüm için güvenli CPU kullanım eşiğini belirler. Kullanım bu eşiği aşarsa, <code>cpu.cfs_quota_us</code> değeri artırılmış tüm pod'lar orijinal değerlerine sıfırlanır.</p></td> <td><p><img></p></td> <td><p><img></p></td> </tr> </tbody> </table>
policydeğericfsQuotaBurstOnlyveyaautoolarak ayarlandığında,cpu.cfs_quota_uskısıtlama olaylarına göre dinamik olarak değişir.Stres testleri sırasında pod CPU kullanımını izleyin veya otomatik CFS kota ayarlamasını devre dışı bırakmak için
policydeğerinicpuBurstOnlyveyanoneolarak ayarlayın. Bu, üretim ortamında esnekliğin stabil kalmasını sağlar.
SSS
Daha eski ack-slo-manager protokolüyle CPU Burst kullandım. ack-koordinator'a yükselttikten sonra hala çalışıyor mu?
Evet. Eski açıklama anahtarı alibabacloud.com/cpuBurst idi. ack-koordinator bu eski protokolü tamamen destekler, bu nedenle yükseltmeler sorunsuz gerçekleşir.
ack-koordinator'un önceki protokol sürümü için uyumluluk dönemi 30 Temmuz 2023'te sona ermiştir. Önceki protokol sürümünün kaynak parametrelerini en son sürüme yükseltin.
ack-koordinator aşağıdaki protokol sürümleriyle uyumludur.
<table> <thead> <tr> <td><p><span>ack-koordinator</span><b> sürümü</b></p></td> <td><p><b>alibabacloud.com protokolü</b></p></td> <td><p><b>koordinator.sh protokolü</b></p></td> </tr> </thead> <colgroup></colgroup> <colgroup></colgroup> <colgroup></colgroup> <tbody> <tr> <td><p>≥0.2.0</p></td> <td><p>Desteklenir</p></td> <td><p>Desteklenmez</p></td> </tr> <tr> <td><p>≥0.8.0</p></td> <td><p>Desteklenir</p></td> <td><p>Desteklenir</p></td> </tr> </tbody> </table>
CPU Burst'i etkinleştirdikten sonra neden hala CPU kısıtlaması oluşuyor?
En yaygın neden, ilkenin etkili olmasını engelleyen bir yapılandırma sözdizimi hatasıdır. Açıklamanızı veya ConfigMap'inizi Gelişmiş yapılandırma bölümündeki örneklerle karşılaştırın.
Yapılandırma geçerliyse, CPU talebi cfsQuotaBurstPercent tavanına ulaştığında kısıtlama yine de oluşabilir. CPU istek ve limit değerlerinizi gerçek iş yükü ihtiyaçlarınızla daha iyi eşleşecek şekilde ayarlayın.
Dikkate alınması gereken iki diğer faktör şunlardır:
cpu.cfs_quota_usyalnızca ack-koordinator bir kısıtlama olayı algıladıktan sonra güncellenir, bu nedenle küçük bir gecikme vardır. Buna karşılık,cpu.cfs_burst_ushemen uygulanır ve daha hızlı tepki verir. En iyi sonuçlar için Alibaba Cloud Linux kullanın.Düğüm genelindeki CPU kullanımı
sharePoolThresholdPercentdeğerini aştığında, ack-koordinator herhangi bir pod'un parazite neden olmasını önlemek için tüm pod'larıncpu.cfs_quota_usdeğerini sıfırlar.sharePoolThresholdPercentdeğerini gerçek düğüm yükü desenlerini yansıtacak şekilde ayarlayın.
CPU Burst ilkesini etkinleştirmek için Alibaba Cloud Linux kullanmam gerekir mi?
CPU Burst, tüm Alibaba Cloud Linux ve CentOS çekirdeklerinde çalışır. Alibaba Cloud Linux önerilir: Çekirdek düzeyindeki cpu.cfs_burst_us desteği, ack-koordinator'un yalnızca CFS kota ayarlamasından daha hassas CPU esnekliği sağlamasına olanak tanır. Ayrıntılar için bkz. cgroup v1 arabirimini kullanarak CPU Burst'i etkinleştirme.
CPU Burst'i etkinleştirdikten sonra uygulamam neden farklı iş parçacığı sayıları bildiriyor?
ack-koordinator, yük değişikliklerine yanıt olarak konteynerin her zamanlama döngüsü için CPU zamanı kotası olan cpu.cfs_quota_us değerini dinamik olarak ayarlar. Java'nın Runtime.getRuntime().availableProcessors() yöntemini kullananlar dahil birçok uygulama, mevcut CPU çekirdeklerini hesaplamak için cpu.cfs_quota_us değerini okur. Kota değiştiğinde bildirilen çekirdek sayısı da değişir; bu durum iş parçacığı havuzu boyutlarının ve kotaya bağlı diğer parametrelerin dalgalanmasına neden olur.
Bu sorunu çözmek için uygulamanızın pod belirtimindeki sabit limits.cpu değerini okumasını sağlayın.
-
resourceFieldRefkullanaraklimits.cpudeğerini bir ortam değişkeni olarak ekleyin.env: - name: CPU_LIMIT valueFrom: resourceFieldRef: resource: limits.cpu İş parçacığı havuzu boyutunu hesaplayıp ayarlarken
CPU_LIMITdeğerini okuyacak şekilde uygulama başlatma mantığınızı güncelleyin. Bu, ack-koordinator CFS kotasını nasıl ayarlarsa ayarlasın iş parçacığı sayısının sabit kalmasını sağlar.