如何控制进程组内每个进程CPU利用率不超25%并均匀分配负载?
解决128个进程的CPU使用率控制与负载均匀问题
问题根源分析
你之前把所有进程放在同一个cgroup下,设置的cpu.cfs_quota_us=3200000是整个组的总配额(每秒允许3.2秒的CPU时间),128个进程共享这个配额,自然会同时耗尽配额进入休眠,再同时被唤醒,导致负载大幅波动。要实现每个进程独立控制,必须给每个进程分配单独的cgroup,同时绑定到固定逻辑核心。
具体实现方案
1. 为每个进程创建独立cgroup(以cgroup v1为例)
cgroup v1的CPU控制器默认挂载在/sys/fs/cgroup/cpu下,先创建父目录统一管理:
mkdir -p /sys/fs/cgroup/cpu/process_groups
对每个进程(假设进程PID为$pid,对应逻辑核心编号为$core_id,从0到127):
- 创建专属子cgroup:
mkdir /sys/fs/cgroup/cpu/process_groups/pid_$pid - 设置25%的CPU配额:默认周期
cpu.cfs_period_us=100000(100ms),25%对应配额为25000微秒:echo 25000 > /sys/fs/cgroup/cpu/process_groups/pid_$pid/cpu.cfs_quota_us - 将进程加入该cgroup:
echo $pid > /sys/fs/cgroup/cpu/process_groups/pid_$pid/tasks
2. 绑定进程到固定逻辑核心
为保证每个逻辑核心负载均匀,将每个进程绑定到唯一核心,避免调度器跨核迁移进程:
taskset -cp $core_id $pid
比如进程0绑定核心0、进程1绑定核心1,以此类推,确保每个核只运行一个目标进程。
3. cgroup v2的适配操作
如果系统使用cgroup v2,路径和参数略有不同:
- 确认cgroup v2挂载点(通常为
/sys/fs/cgroup),创建子cgroup:mkdir -p /sys/fs/cgroup/process_groups/pid_$pid - 设置CPU配额:
cpu.max格式为配额 周期,25%对应25000 100000:echo "25000 100000" > /sys/fs/cgroup/process_groups/pid_$pid/cpu.max - 将进程加入cgroup:
echo $pid > /sys/fs/cgroup/process_groups/pid_$pid/cgroup.procs - 同样用
taskset绑定进程到对应核心编号。
方案效果说明
- 每个进程拥有独立CPU配额,不会出现共享配额导致的同时休眠/唤醒问题,调度系统可独立管理每个进程的执行。
- 进程绑定固定核心后,每个逻辑核心负载稳定在25%,实现核心间的负载均匀。
- 单个进程在周期内25%时间运行、75%时间休眠,多个进程在不同核上独立调度,系统整体负载会随时间均匀分布,无大幅波动。
批量操作建议
手动处理128个进程太繁琐,可编写脚本批量完成:
# 假设进程PID列表保存在pid_list.txt中,每行一个PID core_id=0 while read pid; do # 创建cgroup并设置配额 mkdir -p /sys/fs/cgroup/cpu/process_groups/pid_$pid echo 25000 > /sys/fs/cgroup/cpu/process_groups/pid_$pid/cpu.cfs_quota_us echo $pid > /sys/fs/cgroup/cpu/process_groups/pid_$pid/tasks # 绑定核心 taskset -cp $core_id $pid core_id=$((core_id + 1)) done < pid_list.txt
内容的提问来源于stack exchange,提问作者Frontier_Setter
相关产品推荐
相关产品推荐

