1.詳細(xì)描述
在arm64平臺上,通過libvirt設(shè)置虛擬機(jī)CPU的占用率限額時,存在以下問題:
1.將虛擬機(jī)配置單核,并將CPU占用率限額(即cpu.cfs_quota_us)配置為100000(限制為100%)時,觀察虛擬機(jī)vCPU線程的物理機(jī)CPU占用率,實際可達(dá)到100%;
2.將虛擬機(jī)配置為4核,并將每個核的限額均設(shè)置為100%時,實際總占用率只能達(dá)到350%左右,無法達(dá)到400%。另外,若將限額設(shè)置200000(限制為200%)或-1(無限制)時,總占用率可達(dá)到400%。
1.在宿主機(jī)的/sys/fs/cgroup/cpu,cpuacct/目錄下新建一個目錄test
cd test
mkdir t1 t2 t3 t4
echo 100000 >t1/cpu.cfs_quota_us
echo 100000 >t2/cpu.cfs_quota_us
echo 100000 >t3/cpu.cfs_quota_us
echo 100000 >t4/cpu.cfs_quota_us
2.編寫測試程序,內(nèi)容如下:
#include <pthread.h>
#include <stdio.h>
void cpu100(void)
{
while(1);
}
void main(void)
{
pthread_t tid;
pthread_create(&tid,NULL,cpu100,NULL);
pthread_create(&tid,NULL,cpu100,NULL);
pthread_create(&tid,NULL,cpu100,NULL);
pthread_create(&tid,NULL,cpu100,NULL);
sleep(10000000);
}
3.編譯上述程序并運行;
4.找到該程序的PID,通過top -Hp <pid>,查詢其4個CPU占用率為100%的子線程的PID;
5.將4個子線程的PID分別寫入步驟1中test文件夾下的的t1/tasks, t2/tasks, t3/tasks, t4/tasks文件中;
6.繼續(xù)觀察top命令的輸出信息,可發(fā)現(xiàn)有一個子線程的CPU占用率明顯下降,如下圖:
該問題由cgroup和完全公平調(diào)度器(CFS)的時間片分配邏輯中存在競爭窗口導(dǎo)致。
在調(diào)度實體受限時,及時將其記錄到受限隊列中,以便函數(shù)distribute_cfs_runtime()在分發(fā)時間片時,可以發(fā)現(xiàn)該調(diào)度實體,并為其分配新的時間片額度。
目前,社區(qū)已在v5.8-rc1版本中修復(fù)了該問題,相關(guān)補(bǔ)丁為“sched/fair: Eliminate bandwidth race between throttling and distribution“,將該補(bǔ)丁進(jìn)行移植即可解決問題。