From 5f1a67e6dfdc0a86e21bbfff986490c0e134e64a Mon Sep 17 00:00:00 2001 From: Ruben Novelli <31356779+rdnovell@users.noreply.github.com> Date: Mon, 27 Nov 2023 18:33:50 +0100 Subject: [PATCH] [RHPAM-4777] - Dynamic resources script is reading wrong container sys files on cgroupsv2 (#423) (#425) Signed-off-by: Your Name Co-authored-by: Filippe Spolti --- .../jboss/container/java/jvm/container-limits | 80 +++++++++++++++---- 1 file changed, 63 insertions(+), 17 deletions(-) diff --git a/jboss/container/java/jvm/bash/artifacts/opt/jboss/container/java/jvm/container-limits b/jboss/container/java/jvm/bash/artifacts/opt/jboss/container/java/jvm/container-limits index e5c0d6af..4147ba62 100644 --- a/jboss/container/java/jvm/bash/artifacts/opt/jboss/container/java/jvm/container-limits +++ b/jboss/container/java/jvm/bash/artifacts/opt/jboss/container/java/jvm/container-limits @@ -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){ @@ -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 @@ -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 }