shares
这个容易理解,无论 cpuset.cpus 中有多少个 cpu,它都是按照比例用。
cpu.cfs_quota_us
这个就有点坑了,用起来会有些费劲。8核机器,ap tasks 里有 20 个线程并行执行,设置 cpu.cfs_quota_us 为 30000(period 为 100000),预期是 cpu 能用到 30% * 8 = 240%,而实际上只用到了 30%。也就是说,20个线程共享 30% 的 cpu。
[xiaochu.yh ~/tools/cgroup] $cat /sys/fs/cgroup/cpu/oceanbase/ap/tasks
59249
59250
59251
59252
59253
59254
59255
59256
59257
59258
59259
59260
59261
59263
59264
59265
59266
59267
59268
59269
echo 30000 > /sys/fs/cgroup/cpu/oceanbase/ap/cpu.cfs_quota_us
所以,cpu.cfs_quota_us 是个绝对值,和 group 下的 cpu 数量无关,指的是这个 group 下的 tasks 总共可以用到的 cpuu 时间(基准值是 cfs_period_us)
思考
如果我们的目标是 ap、tp 混跑时,cpu 负载满时,ap 最多占 30% cpu,那么设置好 shares 即可。
如果我们的目标是 ap、tp 混跑时,cpu 负载不满时,ap 最多占 30% cpu,那么就需要设置 cpu.cfs_quota_us,但要设置的 quota 和 cpu 核数有关,需要考虑核数计算一番才能得到最终 quota 值。例如,在8核场景下,quota = 8 * 30000 = 240000。这个对于写程序来说太复杂了,程序需要感知到当前 cpu 数量。