Sumber daya CPU yang tersedia untuk sebuah kontainer dibatasi oleh CPU Limit-nya. Ketika penggunaan aktual mencapai batas tersebut, kernel melakukan throttle terhadap kontainer, yang dapat menurunkan kinerja layanan. Fitur CPU Burst mendeteksi throttling CPU secara dinamis dan menyesuaikan parameter kontainer secara adaptif. Selama lonjakan beban mendadak, CPU Burst dapat memberikan sementara sumber daya CPU tambahan kepada kontainer, sehingga mengurangi hambatan kinerja akibat batas CPU dan meningkatkan kualitas layanan aplikasi—terutama yang sensitif terhadap latensi.
Untuk memahami dokumen ini dan menggunakan fitur ini secara optimal, pelajari konsep-konsep seperti CFS Scheduler dan Kebijakan Manajemen CPU.
Mengapa Anda perlu mengaktifkan CPU Burst
Kluster Kubernetes menggunakan CPU Limit untuk membatasi jumlah maksimum sumber daya CPU yang dapat digunakan oleh sebuah kontainer. Hal ini memastikan alokasi sumber daya yang adil di antara beberapa kontainer serta mencegah satu kontainer mengonsumsi terlalu banyak sumber daya CPU hingga memengaruhi kinerja kontainer lainnya.
CPU merupakan sumber daya berbagi waktu, artinya beberapa proses atau kontainer dapat berbagi irisan waktu CPU. Saat Anda mengonfigurasi CPU Limit suatu kontainer, kernel sistem operasi menggunakan Completely Fair Scheduler (CFS) untuk mengontrol penggunaan CPU kontainer (cpu.cfs_quota_us) dalam setiap periode (cpu.cfs_period_us). Misalnya, jika CPU Limit kontainer adalah 4, kernel sistem operasi membatasi kontainer tersebut hingga maksimal 400 ms waktu CPU dalam setiap periode penjadwalan, yang biasanya berdurasi 100 ms.
Manfaat
Pemanfaatan CPU merupakan metrik utama untuk mengukur kesehatan sebuah kontainer. Administrator kluster biasanya menggunakan metrik ini untuk mengonfigurasi CPU Limit kontainer. Dibandingkan dengan metrik per detik yang umum digunakan, pemanfaatan CPU kontainer pada skala ratusan milidetik sering kali menunjukkan gangguan yang lebih jelas dan fluktuasi cepat. Pada gambar berikut, penggunaan CPU jauh di bawah 4 core dalam basis per detik (garis ungu). Namun, dalam basis per milidetik (garis hijau), penggunaan CPU kontainer melebihi 4 core selama beberapa periode. Jika Anda menetapkan CPU Limit sebesar 4 core, sistem operasi akan menangguhkan thread karena throttling CPU.

Gambar berikut menunjukkan bagaimana sumber daya CPU dialokasikan ke thread-thread kontainer layanan web pada node 4-core setelah kontainer menerima permintaan (req). CPU Limit kontainer adalah 2. Gambar di sebelah kiri menunjukkan kasus normal, sedangkan gambar di sebelah kanan menunjukkan kasus setelah CPU Burst diaktifkan.
Meskipun pemanfaatan CPU keseluruhan kontainer dalam satu detik terakhir rendah, Thread 2 harus menunggu periode berikutnya untuk menyelesaikan pemrosesan req 2 karena throttling CPU. Hal ini meningkatkan waktu respons (RT) permintaan dan menjadi penyebab utama masalah latensi ekor panjang pada kontainer. | Setelah Anda mengaktifkan CPU Burst, kontainer dapat mengumpulkan irisan waktu CPU saat idle dan menggunakannya untuk memenuhi kebutuhan sumber daya selama lonjakan beban. Hal ini meningkatkan kinerja kontainer dan mengurangi latensi. |
Selain skenario di atas, CPU Burst juga cocok untuk menangani lonjakan penggunaan CPU. Misalnya, ketika lalu lintas layanan melonjak, ack-koordinator dapat menghilangkan hambatan CPU dalam beberapa detik sambil memastikan beban keseluruhan pada node tetap berada pada level aman.
ack-koordinator hanya memodifikasi cfs quota dalam parameter cgroup node dan tidak memodifikasi bidang CPU Limit dalam Spesifikasi Pod.
Skenario
Fitur CPU Burst berguna dalam skenario berikut.
Sebuah kontainer sering mengalami throttling CPU, yang memengaruhi kinerja aplikasi, meskipun penggunaan CPU-nya biasanya di bawah CPU Limit yang dikonfigurasi. Anda dapat mengaktifkan CPU Burst agar kontainer menggunakan irisan waktu yang terakumulasi selama lonjakan beban. Hal ini secara efektif menyelesaikan masalah throttling CPU dan meningkatkan kualitas layanan aplikasi.
Aplikasi kontainer mengonsumsi lebih banyak sumber daya CPU selama fase startup. Setelah aplikasi mulai berjalan dan memasuki kondisi stabil, penggunaan CPU-nya turun ke level yang lebih rendah dan stabil. Jika Anda mengaktifkan CPU Burst, aplikasi dapat menggunakan lebih banyak irisan waktu selama startup untuk memastikan peluncuran cepat tanpa perlu mengonfigurasi CPU Limit yang terlalu tinggi.
Penagihan
Komponen ack-koordinator dapat diinstal dan digunakan secara gratis. Namun, biaya tambahan mungkin timbul dalam skenario berikut:
ack-koordinator adalah komponen yang dikelola sendiri dan mengonsumsi sumber daya node pekerja setelah instalasi. Anda dapat mengonfigurasi permintaan sumber daya untuk setiap modul saat menginstal komponen tersebut.
Secara default, ack-koordinator mengekspos metrik pemantauan untuk fitur-fitur seperti profiling sumber daya dan penjadwalan detail halus dalam format Prometheus. Jika Anda memilih opsi Aktifkan Pemantauan Prometheus untuk ACK-Koordinator saat mengonfigurasi komponen dan menggunakan layanan Alibaba Cloud Prometheus, metrik-metrik ini dianggap sebagai metrik kustom dan dikenai biaya. Biaya tersebut bergantung pada faktor-faktor seperti ukuran kluster dan jumlah aplikasi. Sebelum mengaktifkan fitur ini, bacalah dengan cermat dokumentasi Penagihan instans Prometheus Alibaba Cloud Prometheus untuk memahami kuota gratis dan kebijakan penagihan untuk metrik kustom. Anda dapat memantau dan mengelola penggunaan sumber daya Anda dengan menanyakan data penggunaan.
Prasyarat
ACK Pro cluster telah dibuat dan versi Kubernetes kluster tersebut adalah 1.18 atau lebih baru. Untuk informasi lebih lanjut, lihat Buat Kluster ACK yang dikelola dan Tingkatkan kluster secara manual.
CatatanKami merekomendasikan agar Anda menggunakan Alibaba Cloud Linux sebagai sistem operasi. Untuk informasi lebih lanjut, lihat Apakah perlu menggunakan sistem operasi Alibaba Cloud Linux untuk mengaktifkan kebijakan CPU Burst?.
Komponen ack-koordinator telah diinstal, dan versinya 0.8.0 atau lebih baru. Untuk informasi lebih lanjut, lihat ack-koordinator.
Deskripsi Konfigurasi
Anda dapat mengaktifkan fitur CPU Burst untuk pod tertentu menggunakan anotasi pod. Anda juga dapat mengaktifkannya di tingkat kluster atau namespace menggunakan ConfigMap.
Gunakan anotasi untuk mengaktifkan CPU Burst untuk sebuah pod
Untuk mengaktifkan kebijakan CPU Burst untuk pod tertentu, tambahkan anotasi ke bidang metadata file YAML pod tersebut.
Untuk menerapkan konfigurasi ke beban kerja seperti deployment, atur anotasi yang sesuai untuk pod di bidang template.metadata.
annotations:
# Atur ke auto untuk mengaktifkan fitur CPU Burst untuk pod ini.
koordinator.sh/cpuBurst: '{"policy": "auto"}'
# Atur ke none untuk menonaktifkan fitur CPU Burst untuk pod ini.
koordinator.sh/cpuBurst: '{"policy": "none"}'Gunakan ConfigMap untuk mengaktifkan CPU Burst di tingkat kluster
Kebijakan CPU Burst yang dikonfigurasi melalui ConfigMap berlaku untuk seluruh kluster secara default.
Buat file bernama configmap.yaml menggunakan contoh ConfigMap berikut.
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-systemPeriksa apakah ConfigMap
ack-slo-configada di namespace kube-system.Jika ada, gunakan metode PATCH untuk memperbaruinya guna menghindari gangguan terhadap item konfigurasi lain dalam ConfigMap.
kubectl patch cm -n kube-system ack-slo-config --patch "$(cat configmap.yaml)"Jika tidak ada, jalankan perintah berikut untuk membuat ConfigMap.
kubectl apply -f configmap.yaml
Gunakan ConfigMap untuk mengaktifkan CPU Burst di tingkat namespace
Saat Anda mengonfigurasi kebijakan CPU Burst untuk beberapa pod dengan menentukan namespace, kebijakan tersebut berlaku untuk namespace tersebut.
Buat file bernama configmap.yaml menggunakan contoh ConfigMap berikut.
apiVersion: v1 kind: ConfigMap metadata: name: ack-slo-pod-config namespace: koordinator-system # Buat namespace ini secara manual jika Anda menggunakannya untuk pertama kali. data: # Aktifkan atau nonaktifkan pod secara individual di beberapa namespace. cpu-burst: | { "enabledNamespaces": ["allowed-ns"], "disabledNamespaces": ["blocked-ns"] } # Kebijakan CPU Burst diaktifkan untuk semua pod di namespace allowed-ns, sesuai dengan policy: auto. # Kebijakan CPU Burst dinonaktifkan untuk semua pod di namespace blocked-ns, sesuai dengan policy: none.Periksa apakah ConfigMap
ack-slo-configada di namespace kube-system.Jika ada, gunakan metode PATCH untuk memperbaruinya guna menghindari gangguan terhadap item konfigurasi lain dalam ConfigMap.
kubectl patch cm -n kube-system ack-slo-config --patch "$(cat configmap.yaml)"Jika tidak ada, jalankan perintah berikut untuk membuat ConfigMap.
kubectl apply -f configmap.yaml
Prosedur
Contoh ini menggunakan aplikasi layanan web untuk menunjukkan latensi akses sebelum dan setelah kebijakan CPU Burst diaktifkan, guna memverifikasi efek optimasi kebijakan tersebut.
Langkah verifikasi
Buat file bernama apache-demo.yaml yang berisi konten berikut untuk aplikasi contoh.
Tambahkan anotasi ke bidang
metadataobjek pod untuk mengaktifkan kebijakan CPU Burst untuk pod tersebut.apiVersion: v1 kind: Pod metadata: name: apache-demo annotations: koordinator.sh/cpuBurst: '{"policy": "auto"}' # Aktifkan kebijakan 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 # Ubah ini menjadi nama node yang sebenarnya. hostNetwork: False restartPolicy: Never schedulerName: default-schedulerJalankan perintah berikut untuk menerapkan Apache HTTP Server sebagai aplikasi target evaluasi.
kubectl apply -f apache-demo.yamlGunakan alat uji stres wrk2 untuk mengirim permintaan.
# Unduh, ekstrak, dan instal alat pengujian wrk2 open-source. Untuk detailnya, lihat https://github.com/giltene/wrk2. # Modul kompresi Gzip diaktifkan dalam konfigurasi citra Apache saat ini untuk mensimulasikan logika pemrosesan permintaan di sisi server. # Jalankan perintah uji stres. Pastikan untuk mengubah alamat IP menjadi alamat IP aplikasi target. ./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.testCatatanGanti alamat target dalam perintah dengan alamat IP pod Apache.
Anda dapat memodifikasi parameter
-Runtuk menyesuaikan laju QPS dari pengirim.
Analisis hasil
Data berikut menunjukkan kinerja pada Alibaba Cloud Linux dan versi komunitas CentOS sebelum dan setelah kebijakan CPU Burst diaktifkan.
Benar-benar dinonaktifkan berarti kebijakan CPU Burst diatur ke
none.Saat diaktifkan, kebijakan CPU Burst diatur ke
auto.
Data berikut hanya sebagai referensi. Hasil aktual dapat berbeda tergantung pada lingkungan operasi Anda.
Alibaba Cloud Linux | Shut Down All | Enabled |
apache RT-p99 | 107,37 ms | 67,18 ms (-37,4%) |
CPU Throttled Ratio | 33,3% | 0% |
Pod CPU average utilization | 31,8% | 32,6% |
CentOS | Matikan Semua | Diaktifkan |
apache RT-p99 | 111,69 ms | 71,30 ms (-36,2%) |
Rasio CPU Throttled | 33% | 0% |
Rata-rata pemanfaatan CPU Pod | 32,5% | 33,8% |
Perbandingan data menunjukkan hal berikut:
Setelah fitur CPU Burst diaktifkan, waktu respons (RT) p99 aplikasi meningkat secara signifikan.
Setelah fitur CPU Burst diaktifkan, throttling CPU berkurang secara signifikan, sedangkan pemanfaatan CPU pod secara keseluruhan tetap hampir tidak berubah.
Konfigurasi Lanjutan
Anda dapat menentukan konfigurasi lanjutan menggunakan ConfigMap atau dengan menambahkan anotasi ke konfigurasi pod. Anotasi memiliki prioritas lebih tinggi daripada ConfigMap. Jika suatu parameter dapat dikonfigurasi dengan kedua metode dan anotasi tidak ditambahkan, ack-koordinator menggunakan nilai dari ConfigMap tingkat namespace. Jika parameter tersebut tidak ditentukan dalam ConfigMap tingkat namespace, ack-koordinator menggunakan nilai dari ConfigMap tingkat kluster.
Berikut adalah contoh konfigurasi.
# Contoh ConfigMap ack-slo-config.
data:
cpu-burst-config: |
{
"clusterStrategy": {
"policy": "auto",
"cpuBurstPercent": 1000,
"cfsQuotaBurstPercent": 300,
"sharePoolThresholdPercent": 50,
"cfsQuotaBurstPeriodSeconds": -1
}
}
# Contoh anotasi pod.
koordinator.sh/cpuBurst: '{"policy": "auto", "cpuBurstPercent": 1000, "cfsQuotaBurstPercent": 300, "cfsQuotaBurstPeriodSeconds": -1}'Berikut adalah parameter lanjutan untuk kebijakan CPU Burst:
Kolom Anotasi dan ConfigMap menunjukkan apakah Anda dapat mengonfigurasi parameter menggunakan anotasi pod atau ConfigMap.
menunjukkan didukung, dan
menunjukkan tidak didukung.
Parameter | Tipe | Deskripsi | Anotasi | ConfigMap |
| string |
|
|
|
| int | Nilai default adalah Parameter ini digunakan untuk mengonfigurasi fitur CPU Burst tingkat kernel yang disediakan oleh Alibaba Cloud Linux. Parameter ini menentukan persentase hingga mana batas CPU dapat ditingkatkan oleh CPU Burst. Parameter ini sesuai dengan parameter cgroup pod Sebagai contoh, dengan konfigurasi default, untuk |
|
|
| int | Nilai default adalah Menentukan persentase maksimum hingga mana nilai parameter cgroup pod |
|
|
| int | Nilai default adalah Saat fitur burst kuota CFS diaktifkan, parameter ini menentukan batas waktu bagi pod untuk terus-menerus mengonsumsi CPU pada batas atasnya ( |
|
|
| int | Nilai default adalah Parameter ini menentukan ambang batas pemanfaatan CPU node saat penyesuaian otomatis kuota CFS diaktifkan. Jika ambang batas ini terlampaui, parameter cgroup |
|
|
Saat Anda mengaktifkan penyesuaian otomatis kuota CFS dengan mengatur
policykecfsQuotaBurstOnlyatauauto, parameter batas CPU podcpu.cfs_quota_uspada node disesuaikan secara dinamis berdasarkan throttling CPU.Saat melakukan uji stres pada pod, kami merekomendasikan agar Anda memantau penggunaan CPU pod atau sementara menonaktifkan penyesuaian otomatis kuota CFS (atur
policykecpuBurstOnlyataunone) untuk menjaga elastisitas sumber daya yang lebih baik di lingkungan produksi.
FAQ
Apakah fitur CPU Burst yang saya aktifkan berdasarkan protokol versi sebelumnya dari ack-slo-manager masih berfungsi setelah saya meningkatkan ack-slo-manager ke ack-koordinator?
Ya. Protokol Pod versi sebelumnya mengharuskan Anda menambahkan anotasi alibabacloud.com/cpuBurst. ack-koordinator sepenuhnya kompatibel dengan versi protokol sebelumnya ini. Anda dapat meningkatkan komponen tersebut ke versi baru secara mulus.
ack-koordinator kompatibel dengan versi protokol hingga 30 Juli 2023. Kami merekomendasikan agar Anda mengganti parameter sumber daya yang digunakan dalam versi protokol sebelumnya dengan yang digunakan dalam versi terbaru.
Berikut ini menjelaskan kompatibilitas ack-koordinator dengan berbagai versi protokol.
ack-koordinator versi | Protokol alibabacloud.com | Protokol koordinator.sh |
≥0.2.0 | Didukung | Tidak didukung |
≥0.8.0 | Didukung | Didukung |
Setelah saya mengaktifkan konfigurasi CPU Burst, mengapa pod saya masih mengalami throttling CPU?
Hal ini dapat terjadi karena beberapa alasan. Tinjau poin-poin berikut untuk memecahkan masalah tersebut.
Format konfigurasi mungkin salah, sehingga kebijakan CPU Burst tidak berlaku. Untuk informasi lebih lanjut, lihat Konfigurasi Lanjutan untuk memverifikasi dan memodifikasi konfigurasi.
Event throttling CPU mungkin tetap dihasilkan jika pemanfaatan CPU mencapai batas atas yang ditentukan oleh
cfsQuotaBurstPercentkarena sumber daya CPU yang tidak mencukupi.Anda dapat menyesuaikan nilai Request dan Limit berdasarkan kebutuhan aktual aplikasi Anda.
Kebijakan CPU Burst menyesuaikan dua parameter cgroup untuk pod:
cpu.cfs_quota_usdancpu.cfs_burst_us. Untuk informasi lebih lanjut, lihat Konfigurasi parameter lanjutan. Parametercpu.cfs_quota_ushanya diatur setelah ack-koordinator mendeteksi event CPU Throttled, yang menyebabkan sedikit keterlambatan. Sebaliknya, parametercpu.cfs_burst_usdiatur langsung berdasarkan konfigurasi, sehingga lebih responsif.Untuk hasil optimal, kami merekomendasikan agar Anda menggunakan sistem operasi Alibaba Cloud Linux.
Kebijakan CPU Burst mencakup mekanisme perlindungan untuk menyesuaikan
cpu.cfs_quota_us, yaitu ambang batas keamanan tingkat node yang dikonfigurasi oleh parametersharePoolThresholdPercent. Jika pemanfaatan CPU node menjadi terlalu tinggi,cpu.cfs_quota_usdikembalikan ke nilai awalnya untuk mencegah pod memengaruhi pod lain.Anda dapat mengatur ambang batas keamanan berdasarkan kebutuhan aplikasi Anda untuk menghindari degradasi kinerja akibat pemanfaatan mesin yang tinggi.
Apakah perlu menggunakan sistem operasi Alibaba Cloud Linux untuk mengaktifkan kebijakan CPU Burst?
Tidak. Kebijakan CPU Burst ack-koordinator mendukung semua kernel open source Alibaba Cloud Linux dan CentOS. Namun, kami merekomendasikan agar Anda menggunakan sistem operasi Alibaba Cloud Linux. Fitur kernel Alibaba Cloud Linux memungkinkan ack-koordinator menyediakan mekanisme manajemen CPU yang lebih detail halus dan elastis. Untuk informasi lebih lanjut, lihat Aktifkan Fitur CPU Burst pada Antarmuka cgroup v1.
Setelah saya mengaktifkan CPU Burst, mengapa jumlah thread yang dilaporkan oleh kode aplikasi saya berubah?
Hal ini terjadi karena mekanisme CPU Burst dapat bertentangan dengan cara beberapa aplikasi mengambil informasi sumber daya sistem. ack-koordinator mengimplementasikan CPU Burst dengan menyesuaikan secara dinamis parameter cgroup dasar kontainer cpu.cfs_quota_us. Nilai ini merepresentasikan kuota waktu CPU yang tersedia untuk kontainer dalam periode penjadwalan saat ini. ack-koordinator secara dinamis mengubah kuota ini berdasarkan beban aplikasi.
Banyak aplikasi, seperti Runtime.getRuntime().availableProcessors() pada Java, langsung membaca cpu.cfs_quota_us untuk memperkirakan jumlah core CPU yang tersedia. Oleh karena itu, ketika kuota CPU disesuaikan secara dinamis, jumlah core yang diambil oleh aplikasi juga berubah, menyebabkan parameter yang bergantung pada nilai ini—seperti ukuran kolam thread—menjadi tidak stabil.
Kami merekomendasikan agar Anda memodifikasi aplikasi Anda agar bergantung pada nilai tetap limits.cpu yang didefinisikan dalam pod.
Suntikkan variabel lingkungan: Anda dapat menggunakan
resourceFieldRefuntuk menyuntikkan nilailimits.cpupod ke dalam kontainer sebagai variabel lingkungan.env: - name: CPU_LIMIT valueFrom: resourceFieldRef: resource: limits.cpuModifikasi kode aplikasi: Anda dapat memodifikasi logika startup aplikasi agar memprioritaskan pembacaan variabel lingkungan
CPU_LIMITuntuk menghitung dan mengatur ukuran kolam thread. Setelah perubahan ini, aplikasi berjalan berdasarkan nilai yang stabil dan andal, terlepas dari bagaimana CPU Burst menyesuaikan kuota.

