Skip to content

Commit

Permalink
[RHPAM-4777] - Dynamic resources script is reading wrong container sy…
Browse files Browse the repository at this point in the history
…s files on cgroupsv2 (#423) (#425)

Signed-off-by: Your Name <fspolti@redhat.com>
Co-authored-by: Filippe Spolti <filippespolti@gmail.com>
  • Loading branch information
rdnovell and spolti committed Nov 27, 2023
1 parent 9ce8d6b commit 5f1a67e
Showing 1 changed file with 63 additions and 17 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,19 @@
#
# This script is meant to be sourced.

if [ "${SCRIPT_DEBUG}" = "true" ] ; then
set -x
fi

# query the resources based on cgroups version
# cgroups v1 points to tmpfs
# cgroups v2 points to cgroup2fs
CGROUPS_VERSION="v1"
tmp_fs=$(stat -fc %T /sys/fs/cgroup)
if [ "${tmp_fs}" = "cgroup2fs" ]; then
CGROUPS_VERSION="v2"
fi

ceiling() {
awk -vnumber="$1" -vdiv="$2" '
function ceiling(x){
Expand All @@ -21,16 +34,36 @@ ceiling() {

# Based on the cgroup limits, figure out the max number of core we should utilize
core_limit() {
local cpu_period_file="/sys/fs/cgroup/cpu/cpu.cfs_period_us"
local cpu_quota_file="/sys/fs/cgroup/cpu/cpu.cfs_quota_us"
if [ -r "${cpu_period_file}" ]; then
local cpu_period="$(cat ${cpu_period_file})"

if [ -r "${cpu_quota_file}" ]; then
local cpu_quota="$(cat ${cpu_quota_file})"
# cfs_quota_us == -1 --> no restrictions
if [ "x$cpu_quota" != "x-1" ]; then
ceiling "$cpu_quota" "$cpu_period"
if [ "${CGROUPS_VERSION}" = "v1" ]; then
local cpu_period_file="/sys/fs/cgroup/cpu/cpu.cfs_period_us"
local cpu_quota_file="/sys/fs/cgroup/cpu/cpu.cfs_quota_us"
if [ -r "${cpu_period_file}" ]; then
local cpu_period="$(cat ${cpu_period_file})"
if [ -r "${cpu_quota_file}" ]; then
local cpu_quota="$(cat ${cpu_quota_file})"
# cfs_quota_us == -1 --> no restrictions
if [ "x$cpu_quota" != "x-1" ]; then
ceiling "$cpu_quota" "$cpu_period"
fi
fi
fi
else
# v2
# on cgroupsv2 the period and quota a queried from the same file
local cpu_max_file="/sys/fs/cgroup/cpu.max"
# when both are set we will have the following output:
# $MAX $PERIOD
# where the first number is the quota/max and the second is the period
# if the quota/max is not set then we will have only the period set:
# max 100000
if [ -r "${cpu_max_file}" ]; then
local cpu_max="$(cat ${cpu_max_file})"
if [ "x$cpu_max" != "x" ]; then
local cpu_quota="$(echo $cpu_max | awk '{print $1}')"
local cpu_period="$(echo $cpu_max | awk '{print $2}')"
if [ "$cpu_quota" != "max" ] && [ "x$cpu_period" != "x" ]; then
ceiling "$cpu_quota" "$cpu_period"
fi
fi
fi
fi
Expand All @@ -41,14 +74,27 @@ max_unbounded() {
}

container_memory() {
# High number which is the max limit unit which memory is supposed to be
# unbounded.
local mem_file="/sys/fs/cgroup/memory/memory.limit_in_bytes"
local max_mem_unbounded="$(max_unbounded)"
if [ -r "${mem_file}" ]; then
local max_mem="$(cat ${mem_file})"
if [ ${max_mem} -lt ${max_mem_unbounded} ]; then
echo "${max_mem}"
# High number which is the max limit unit which memory is supposed to be unbounded.
if [ "${CGROUPS_VERSION}" = "v1" ]; then
local mem_file="/sys/fs/cgroup/memory/memory.limit_in_bytes"
if [ -r "${mem_file}" ]; then
local max_mem="$(cat ${mem_file})"
if [ ${max_mem} -lt ${max_mem_unbounded} ]; then
echo "${max_mem}"
fi
fi
else
# v2
local mem_file="/sys/fs/cgroup/memory.max"
if [ -r "${mem_file}" ]; then
local max_mem="$(cat ${mem_file})"
# if not set, it will contain only the string "max"
if [ "$max_mem" != "max" ]; then
if [ ${max_mem} -lt ${max_mem_unbounded} ]; then
echo "${max_mem}"
fi
fi
fi
fi
}
Expand Down

0 comments on commit 5f1a67e

Please sign in to comment.