a4103eacc2
This patch adds scx_flatcg example scheduler which implements hierarchical weight-based cgroup CPU control by flattening the cgroup hierarchy into a single layer by compounding the active weight share at each level. This flattening of hierarchy can bring a substantial performance gain when the cgroup hierarchy is nested multiple levels. in a simple benchmark using wrk[8] on apache serving a CGI script calculating sha1sum of a small file, it outperforms CFS by ~3% with CPU controller disabled and by ~10% with two apache instances competing with 2:1 weight ratio nested four level deep. However, the gain comes at the cost of not being able to properly handle thundering herd of cgroups. For example, if many cgroups which are nested behind a low priority parent cgroup wake up around the same time, they may be able to consume more CPU cycles than they are entitled to. In many use cases, this isn't a real concern especially given the performance gain. Also, there are ways to mitigate the problem further by e.g. introducing an extra scheduling layer on cgroup delegation boundaries. v5: - Updated to specify SCX_OPS_HAS_CGROUP_WEIGHT instead of SCX_OPS_KNOB_CGROUP_WEIGHT. v4: - Revert reference counted kptr for cgv_node as the change caused easily reproducible stalls. v3: - Updated to reflect the core API changes including ops.init/exit_task() and direct dispatch from ops.select_cpu(). Fixes and improvements including additional statistics. - Use reference counted kptr for cgv_node instead of xchg'ing against stash location. - Dropped '-p' option. v2: - Use SCX_BUG[_ON]() to simplify error handling. Signed-off-by: Tejun Heo <tj@kernel.org> Reviewed-by: David Vernet <dvernet@meta.com> Acked-by: Josh Don <joshdon@google.com> Acked-by: Hao Luo <haoluo@google.com> Acked-by: Barret Rhoden <brho@google.com>
52 lines
803 B
C
52 lines
803 B
C
#ifndef __SCX_EXAMPLE_FLATCG_H
|
|
#define __SCX_EXAMPLE_FLATCG_H
|
|
|
|
enum {
|
|
FCG_HWEIGHT_ONE = 1LLU << 16,
|
|
};
|
|
|
|
enum fcg_stat_idx {
|
|
FCG_STAT_ACT,
|
|
FCG_STAT_DEACT,
|
|
FCG_STAT_LOCAL,
|
|
FCG_STAT_GLOBAL,
|
|
|
|
FCG_STAT_HWT_UPDATES,
|
|
FCG_STAT_HWT_CACHE,
|
|
FCG_STAT_HWT_SKIP,
|
|
FCG_STAT_HWT_RACE,
|
|
|
|
FCG_STAT_ENQ_SKIP,
|
|
FCG_STAT_ENQ_RACE,
|
|
|
|
FCG_STAT_CNS_KEEP,
|
|
FCG_STAT_CNS_EXPIRE,
|
|
FCG_STAT_CNS_EMPTY,
|
|
FCG_STAT_CNS_GONE,
|
|
|
|
FCG_STAT_PNC_NO_CGRP,
|
|
FCG_STAT_PNC_NEXT,
|
|
FCG_STAT_PNC_EMPTY,
|
|
FCG_STAT_PNC_GONE,
|
|
FCG_STAT_PNC_RACE,
|
|
FCG_STAT_PNC_FAIL,
|
|
|
|
FCG_STAT_BAD_REMOVAL,
|
|
|
|
FCG_NR_STATS,
|
|
};
|
|
|
|
struct fcg_cgrp_ctx {
|
|
u32 nr_active;
|
|
u32 nr_runnable;
|
|
u32 queued;
|
|
u32 weight;
|
|
u32 hweight;
|
|
u64 child_weight_sum;
|
|
u64 hweight_gen;
|
|
s64 cvtime_delta;
|
|
u64 tvtime_now;
|
|
};
|
|
|
|
#endif /* __SCX_EXAMPLE_FLATCG_H */
|