Batas CPU membatasi jumlah CPU yang dapat digunakan oleh sebuah kontainer. Saat penggunaan aktual mencapai batas tersebut, kernel akan melakukan throttling terhadap kontainer tersebut. Throttling menurunkan kualitas layanan. Fitur CPU Burst mendeteksi throttling dan secara otomatis menyesuaikan parameter kontainer. Selama lonjakan beban, CPU Burst menyediakan sumber daya CPU tambahan bagi kontainer, sehingga mengurangi bottleneck performa terkait CPU dan meningkatkan kualitas layanan—terutama untuk aplikasi yang sensitif terhadap latensi.
Untuk memahami dokumen ini dan menggunakan fitur ini secara optimal, pelajari terlebih dahulu tentang CFS Scheduler dan kebijakan manajemen CPU node.
Mengapa mengaktifkan CPU Burst
Kluster Kubernetes menggunakan batas CPU untuk membatasi konsumsi CPU oleh sebuah kontainer. Hal ini memastikan pembagian sumber daya yang adil di antara kontainer dan mencegah satu kontainer menghabiskan sumber daya yang seharusnya tersedia untuk kontainer lain.
CPU merupakan sumber daya yang dibagi berdasarkan waktu. Banyak proses atau kontainer berbagi time slice CPU. Saat Anda menetapkan batas CPU, kernel sistem operasi menggunakan Completely Fair Scheduler (CFS) untuk mengontrol berapa banyak waktu CPU yang diberikan kepada sebuah kontainer dalam setiap siklus penjadwalan. Panjang siklus ditentukan oleh cpu.cfs_period_us. Waktu CPU yang diizinkan per siklus ditentukan oleh cpu.cfs_quota_us. Sebagai contoh, jika sebuah kontainer memiliki batas CPU sebesar 4, kernel membatasinya hingga 400 ms waktu CPU per siklus penjadwalan 100 ms.
Manfaat
Penggunaan CPU merupakan metrik utama untuk memantau kesehatan kontainer. Administrator kluster sering menggunakannya untuk menetapkan batas CPU. Dibandingkan dengan metrik tingkat detik, penggunaan CPU tingkat milidetik menunjukkan lonjakan dan fluktuasi jangka pendek yang lebih nyata. Pada grafik di bawah ini, penggunaan CPU yang diukur per detik (garis ungu) tampak jauh di bawah 4 core. Namun pada tingkat milidetik (garis hijau), penggunaan melebihi 4 core selama beberapa periode. Jika batas CPU ditetapkan pada 4 core, throttling akan menunda thread—dan meningkatkan latensi respons (RT). Ini merupakan penyebab utama masalah RT long-tail.

Gambar berikutnya menunjukkan alokasi sumber daya CPU untuk kontainer layanan web dengan batas CPU 2 pada node 4-core. Sisi kiri menunjukkan perilaku normal. Sisi kanan menunjukkan perilaku setelah mengaktifkan CPU Burst.
Meskipun penggunaan CPU keseluruhan dalam satu detik terakhir rendah, throttling memaksa Thread 2 menunggu hingga siklus penjadwalan berikutnya untuk menyelesaikan pemrosesan req 2. Hal ini meningkatkan RT permintaan dan merupakan penyebab umum dari RT long-tail. | Setelah mengaktifkan CPU Burst, kontainer mengumpulkan waktu CPU yang tidak terpakai dan menggunakannya selama lonjakan beban. Hal ini meningkatkan performa dan mengurangi latensi. |
CPU Burst juga membantu ketika permintaan CPU melonjak secara tiba-tiba. Misalnya, jika lalu lintas layanan meningkat pesat, ack-koordinator mengatasi bottleneck CPU dalam hitungan detik—sementara tetap menjaga beban total node dalam batas aman.
ack-koordinator hanya menyesuaikan parameter cfs quota dalam cgroup node. Parameter ini tidak mengubah bidang batas CPU dalam spesifikasi Pod.
Skenario
Kasus penggunaan khas untuk CPU Burst meliputi hal-hal berikut:
Penggunaan CPU sebagian besar waktu berada di bawah batas CPU—namun throttling tetap terjadi dan merusak performa aplikasi. Mengaktifkan CPU Burst memungkinkan kontainer menggunakan waktu CPU terakumulasi selama lonjakan beban, sehingga mengatasi throttling dan meningkatkan kualitas layanan.
Kontainer menggunakan CPU tinggi selama startup dan pemuatan. Setelah pemuatan selesai, penggunaan CPU turun ke level rendah yang stabil. Dengan CPU Burst diaktifkan, Anda tidak perlu menetapkan batas CPU yang terlalu tinggi. Kontainer menggunakan waktu CPU ekstra selama startup—dan memulai lebih cepat.
Prasyarat
Buat ACK managed cluster Pro edition dengan versi Kubernetes 1.18 atau lebih baru. Lihat Buat kluster ACK yang dikelola dan Tingkatkan kluster secara manual.
CatatanKami merekomendasikan penggunaan Alibaba Cloud Linux sebagai sistem operasi. Lihat Apakah saya perlu menggunakan Alibaba Cloud Linux untuk mengaktifkan kebijakan CPU Burst?.
Instal komponen ack-koordinator. Gunakan versi 0.8.0 atau lebih baru. Lihat ack-koordinator.
Konfigurasi
Anda dapat mengaktifkan CPU Burst untuk Pod tertentu menggunakan anotasi Pod. Atau Anda dapat mengaktifkannya di seluruh kluster atau namespace menggunakan ConfigMap.
Aktifkan CPU Burst untuk Pod tertentu menggunakan anotasi
Tambahkan anotasi CPU Burst di bawah bidang metadata dalam YAML Pod. Konfigurasi ini hanya berlaku untuk Pod tersebut.
Untuk menerapkan konfigurasi ke workload seperti deployment, tetapkan anotasi yang sesuai untuk Pod di bidang template.metadata.
annotations:
# Tetapkan ke auto untuk mengaktifkan CPU Burst untuk Pod ini.
koordinator.sh/cpuBurst: '{"policy": "auto"}'
# Tetapkan ke none untuk menonaktifkan CPU Burst untuk Pod ini.
koordinator.sh/cpuBurst: '{"policy": "none"}'Mengaktifkan pada dimensi kluster menggunakan ConfigMap
ConfigMap mengonfigurasi CPU Burst 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-configsudah ada di namespace kube-system.Jika sudah ada, perbarui menggunakan PATCH agar pengaturan lain tidak berubah.
kubectl patch cm -n kube-system ack-slo-config --patch "$(cat configmap.yaml)"Jika belum ada, buat dengan perintah berikut.
kubectl apply -f configmap.yaml
Aktifkan melalui ConfigMap pada Dimensi Namespace
Anda dapat mengonfigurasi kebijakan CPU Burst untuk Pod dalam suatu namespace dengan menentukan namespace tersebut. Kebijakan tersebut kemudian 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 sebelum penggunaan pertama. data: # Aktifkan atau nonaktifkan CPU Burst untuk namespace yang dipilih. cpu-burst: | { "enabledNamespaces": ["allowed-ns"], "disabledNamespaces": ["blocked-ns"] } # Mengaktifkan CPU Burst untuk semua Pod di namespace allowed-ns. Kebijakan adalah auto. # Menonaktifkan CPU Burst untuk semua Pod di namespace blocked-ns. Kebijakan adalah none.Periksa apakah ConfigMap
ack-slo-configsudah ada di namespace kube-system.Jika sudah ada, perbarui menggunakan PATCH agar pengaturan lain tidak berubah.
kubectl patch cm -n kube-system ack-slo-config --patch "$(cat configmap.yaml)"Jika belum ada, buat dengan perintah berikut.
kubectl apply -f configmap.yaml
Prosedur
Contoh ini menggunakan aplikasi layanan web untuk menunjukkan bagaimana CPU Burst mengurangi latensi akses—dan membuktikan manfaat performanya.
Langkah verifikasi
Buat file bernama apache-demo.yaml menggunakan YAML berikut.
Tambahkan anotasi CPU Burst di bawah bidang
metadatauntuk mengaktifkan CPU Burst pada Pod ini.apiVersion: v1 kind: Pod metadata: name: apache-demo annotations: koordinator.sh/cpuBurst: '{"policy": "auto"}' # Aktifkan 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 # Ganti dengan nama node yang sebenarnya. hostNetwork: False restartPolicy: Never schedulerName: default-schedulerDeploy Apache HTTP Server sebagai aplikasi uji coba.
kubectl apply -f apache-demo.yamlGunakan wrk2 untuk mengirim permintaan.
# Unduh dan ekstrak tool open-source wrk2. Lihat https://github.com/giltene/wrk2. # Image Apache telah mengaktifkan kompresi Gzip untuk mensimulasikan pemrosesan permintaan di sisi server. # Jalankan uji beban. Ganti $target_ip_address dengan alamat IP Pod Apache. ./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.
Sesuaikan tekanan QPS dengan mengubah parameter
-R.
Analisis hasil
Tabel berikut membandingkan performa pada Alibaba Cloud Linux dan CentOS komunitas—dengan dan tanpa CPU Burst.
All disabled berarti kebijakan CPU Burst diatur ke
none.All enabled berarti kebijakan CPU Burst diatur ke
auto.
Nilai di bawah ini bersifat teoretis. Hasil aktual bergantung pada lingkungan Anda.
Alibaba Cloud Linux | Shutdown All | All enabled |
apache RT-p99 | 107,37 ms | 67,18 ms (-37,4%) |
CPU Throttled Ratio | 33,3% | 0% |
Rata-rata utilisasi CPU Pod | 31,8% | 32,6% |
CentOS | Shut Down All | All enabled |
apache RT-p99 | 111,69 ms | 71,30 ms (-36,2%) |
CPU Throttled Ratio | 33% | 0% |
Rata-rata utilisasi CPU Pod | 32,5% | 33,8% |
Hasil ini menunjukkan:
Mengaktifkan CPU Burst secara signifikan meningkatkan metrik RT p99.
Mengaktifkan CPU Burst sangat mengurangi throttling CPU. Rata-rata utilisasi CPU Pod tetap hampir tidak berubah.
Konfigurasi lanjutan
Anda dapat mengonfigurasi parameter lanjutan CPU Burst dalam ConfigMap atau dalam anotasi Pod. Jika keduanya diatur, anotasi Pod memiliki prioritas lebih tinggi. Jika tidak ada anotasi yang ditetapkan, ack-koordinator memeriksa ConfigMap tingkat namespace. Jika tidak ada ConfigMap tingkat namespace yang ditetapkan, ack-koordinator menggunakan ConfigMap tingkat kluster.
Contoh:
# 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}'Tabel berikut mencantumkan parameter lanjutan CPU Burst:
Kolom Anotasi dan ConfigMap menunjukkan apakah setiap parameter mendukung konfigurasi melalui anotasi Pod atau ConfigMap.
berarti didukung.
berarti tidak didukung.
Parameter | Tipe | Deskripsi | Anotasi | ConfigMap |
| string |
|
|
|
| int | Default: Untuk elastisitas CPU Burst tingkat kernel Alibaba Cloud Linux, parameter ini menentukan seberapa besar CPU Burst diperkuat melebihi batas CPU. Memetakan ke parameter cgroup Sebagai contoh, dengan pengaturan default, |
|
|
| int | Default: Saat elastisitas kuota CFS diaktifkan, parameter ini menentukan peningkatan maksimum yang diizinkan untuk parameter cgroup |
|
|
| int | Default: Saat elastisitas kuota CFS diaktifkan, parameter ini menentukan berapa lama sebuah Pod dapat mengonsumsi CPU pada kuota yang ditingkatkan ( |
|
|
| int | Default: Saat elastisitas kuota CFS diaktifkan, parameter ini menetapkan ambang batas aman penggunaan CPU untuk node. Jika penggunaan melebihi ambang batas ini, semua Pod dengan |
|
|
Saat Anda mengaktifkan penyesuaian kuota CFS otomatis (
policydiatur kecfsQuotaBurstOnlyatauauto), parametercpu.cfs_quota_usuntuk Pod berubah secara dinamis berdasarkan event throttling.Selama uji stres Pod, pantau penggunaan CPU Pod—atau nonaktifkan sementara penyesuaian kuota CFS otomatis (
policydiatur kecpuBurstOnlyataunone). Hal ini menjaga stabilitas elastisitas sumber daya di lingkungan produksi.
FAQ
Saya menggunakan CPU Burst dengan protokol lama ack-slo-manager. Apakah masih berfungsi setelah upgrade ke ack-koordinator?
Anotasi Pod lama menggunakan alibabacloud.com/cpuBurst. ack-koordinator sepenuhnya mendukung protokol lama ini. Anda dapat melakukan upgrade secara mulus.
Periode kompatibilitas ack-koordinator untuk versi protokol sebelumnya berakhir pada 30 Juli 2023. Kami sangat menyarankan Anda untuk mengupgrade parameter sumber daya dari versi protokol sebelumnya ke versi terbaru.
ack-koordinator kompatibel dengan versi protokol berikut.
ack-koordinator versi | protokol alibabacloud.com | protokol koordinator.sh |
≥0.2.0 | Didukung | Tidak didukung |
≥0.8.0 | Didukung | Didukung |
Mengapa throttling CPU masih terjadi setelah mengaktifkan CPU Burst?
Penyebab umum dan solusinya:
Sintaksis konfigurasi tidak valid mencegah CPU Burst berjalan. Lihat Konfigurasi lanjutan untuk memperbaiki dan memverifikasi.
Throttling tetap terjadi saat penggunaan CPU mencapai batas
cfsQuotaBurstPercentkarena sumber daya CPU tidak mencukupi.Sesuaikan nilai request dan limit CPU Anda agar sesuai dengan kebutuhan riil aplikasi.
CPU Burst menyesuaikan dua parameter cgroup:
cpu.cfs_quota_usdancpu.cfs_burst_us. Lihat Konfigurasi lanjutan.cpu.cfs_quota_ushanya diperbarui setelah ack-koordinator mendeteksi throttling—sehingga terdapat sedikit penundaan.cpu.cfs_burst_usdiperbarui langsung dari nilai yang dikonfigurasi—sehingga merespons lebih cepat.Untuk hasil terbaik, gunakan Alibaba Cloud Linux.
Kebijakan CPU Burst memiliki mekanisme perlindungan saat menyesuaikan
cpu.cfs_quota_us, yaitu pengaturan ambang batas watermark keamanan keseluruhansharePoolThresholdPercent. Saat utilisasi keseluruhan terlalu tinggi, untuk mencegah satu Pod menyebabkan gangguan lebih lanjut,cpu.cfs_quota_usdikembalikan ke nilai awalnya.Anda harus menetapkan ambang batas keamanan mesin yang sesuai berdasarkan kondisi aktual aplikasi Anda untuk mencegah utilisasi mesin tinggi memengaruhi performa aplikasi.
Apakah saya perlu menggunakan Alibaba Cloud Linux untuk mengaktifkan kebijakan CPU Burst?
ack-koordinator CPU Burst berfungsi pada semua kernel open-source Alibaba Cloud Linux dan CentOS. Kami merekomendasikan Alibaba Cloud Linux. Fitur kernel-nya memungkinkan ack-koordinator memberikan elastisitas CPU yang lebih granular. Untuk detailnya, lihat Aktifkan CPU Burst menggunakan antarmuka cgroup v1.
Setelah mengaktifkan CPU Burst, mengapa aplikasi saya melaporkan jumlah thread yang berbeda?
Hal ini karena mekanisme kerja CPU Burst bertentangan dengan cara aplikasi tertentu memperoleh sumber daya sistem. ack-koordinator secara dinamis menyesuaikan parameter cgroup dasar kontainer, cpu.cfs_quota_us, saat menerapkan CPU Burst. Nilai ini merepresentasikan kuota waktu CPU yang tersedia untuk kontainer dalam siklus penjadwalan saat ini. ack-koordinator secara dinamis mengubah skala kuota ini berdasarkan beban aplikasi.
Banyak aplikasi, seperti Runtime.getRuntime().availableProcessors() pada Java, langsung membaca cpu.cfs_quota_us untuk menghitung jumlah core CPU yang tersedia. Oleh karena itu, saat kuota CPU disesuaikan secara dinamis, jumlah core yang diperoleh aplikasi juga berubah, sehingga menyebabkan parameter yang bergantung pada nilai ini—seperti ukuran kolam thread—menjadi tidak stabil.
Sebagai gantinya, buat aplikasi Anda bergantung pada nilai tetap limits.cpu yang didefinisikan dalam spesifikasi Pod.
Suntikkan variabel lingkungan: Gunakan
resourceFieldRefuntuk menyuntikkan nilailimits.cpuPod ke dalam kontainer.env: - name: CPU_LIMIT valueFrom: resourceFieldRef: resource: limits.cpuPerbarui kode aplikasi Anda: Ubah logika startup untuk membaca
CPU_LIMITterlebih dahulu saat menghitung dan menetapkan ukuran kolam thread. Hal ini memastikan perilaku yang stabil dan andal—meskipun CPU Burst mengubah kuota.

