Files
Graham Whaley c846e9753d metrics: add cpu-load generator code and docs
Add library code that can generate a variety of cpu loads across the
cluster. Configuration is via environment variables, documented in the
.md file.

Signed-off-by: Graham Whaley <graham.whaley@intel.com>
2019-11-15 12:23:38 -06:00

3.5 KiB

cpu-load stack stresser

The cpu-load stress functionality of the scaling framework allows you to optionally add a constant CPU stress load to cluster under test whilst the tests are running. This aids impact analysis of CPU load.

The cpu-load functionality utilises the stress-ng tool to generate the CPU load. Some of the configuration parameters are taken directoy from the stress-ng command line.

Configuration

cpu-load is configured via a number of environment variables:

Tool Description
collectd collectd based statistics/metrics gathering daemonset code
lib General library helper functions for forming and launching workloads, and storing results in a uniform manner to aid later analysis
report Rmarkdown based report generator, used to produce a PDF comparison report of 1 or more sets of results
scaling Tests to measure scaling, such as linear or parallel launching of pods
Variable Description Default
SMF_CPU_LOAD_NODES Set to non-empty to deploy cpu-load stressor unset (off)
SMF_CPU_LOAD_NODES_NCPU Number of stressor threads to launch per node 0 (one per cpu)
SMF_CPU_LOAD_NODES_PERCENT Percentage of CPU to load unset (100%)
SMF_CPU_LOAD_NODES_LIMIT k8s cpu resource limit to set unset (none)
SMF_CPU_LOAD_NODES_REQUEST k8s cpu resource request to set unset (none)
cpu_load_post_deploy_sleep Seconds to sleep for cpu-load deployment to settle 30

SMF_CPU_LOAD_NODES must be set to a non-empty string to enable the cpu-load functionality. cpu-load uses a daemonSet to deploy one stress-ng single container pod to each active node in the cluster.

Any of the SMF_CPU_LOAD_NODES_* variables can be set, or unset, and the daemonSet pods will be configured appropriately.

Examples

The combinations of settings available allow a lot of flexibility. Below are some common example setups:

50% CPU load on all cores of all nodes (stress-ng)

Here we allow stress-ng to spawn workers to cover all the CPUs on each node, but ask it to restrict its bandwidth use to 50% of the CPU. We do not use the k8s limits.

export SMF_CPU_LOAD_NODES=true
#export SMF_CPU_LOAD_NODES_NCPU=
export SMF_CPU_LOAD_NODES_PERCENT=50
#export SMF_CPU_LOAD_NODES_LIMIT=999m
#export SMF_CPU_LOAD_NODES_REQUEST=999m

50% CPU load on 1 un-pinned core of all nodes (k8s limits)

Here we set stress-ng to run a single worker thread at 100% CPU, but use the k8s resource limits to restrict actual CPU usage to 50%. Because the k8s limit and request are not whole interger units, if the static policy is in place on the k8s cluster, the pods will be classified as Guaranteed QoS, but will not get pinned to a specific cpuset.

export SMF_CPU_LOAD_NODES=true
export SMF_CPU_LOAD_NODES_NCPU=1
export SMF_CPU_LOAD_NODES_PERCENT=100
export SMF_CPU_LOAD_NODES_LIMIT=500m
export SMF_CPU_LOAD_NODES_REQUEST=500m

50% CPU load pinned to 1 core, on all nodes

Here we set stress-ng to run a single worker thread at 50% CPU, and use the k8s resource limits to classify the pod as Guaranteed, and as we are using whole integer units of CPU resource requests, if the static policy manager is in play, the thread will be pinned to a single cpu cpuset.

export SMF_CPU_LOAD_NODES=true
export SMF_CPU_LOAD_NODES_NCPU=1
export SMF_CPU_LOAD_NODES_PERCENT=50
export SMF_CPU_LOAD_NODES_LIMIT=1
export SMF_CPU_LOAD_NODES_REQUEST=1