mirror of
https://github.com/kata-containers/kata-containers.git
synced 2025-04-27 19:35:32 +00:00
This PR improves the variable definition in memory inside the container script for metrics. This change declares and assigns the variables separately to avoid masking return values. Signed-off-by: Gabriela Cervantes <gabriela.cervantes.tellez@intel.com>
139 lines
4.1 KiB
Bash
Executable File
139 lines
4.1 KiB
Bash
Executable File
#!/bin/bash
|
|
# Copyright (c) 2017-2023 Intel Corporation
|
|
#
|
|
# SPDX-License-Identifier: Apache-2.0
|
|
#
|
|
# Description of the test:
|
|
# This test launches a busybox container and inside
|
|
# memory free, memory available and total memory
|
|
# is measured by using /proc/meminfo.
|
|
|
|
set -e
|
|
|
|
# General env
|
|
SCRIPT_PATH=$(dirname "$(readlink -f "$0")")
|
|
source "${SCRIPT_PATH}/../lib/common.bash"
|
|
|
|
TEST_NAME="memory footprint inside container"
|
|
VERSIONS_FILE="${SCRIPT_PATH}/../../versions.yaml"
|
|
IMAGE='quay.io/prometheus/busybox:latest'
|
|
CMD="sleep 10; cat /proc/meminfo"
|
|
# We specify here in 'k', as that then matches the results we get from the meminfo,
|
|
# which makes later direct comparison easier.
|
|
MEMSIZE="${MEMSIZE:-$((2048*1024))}"
|
|
|
|
# this variable determines the number of attempts when a test
|
|
# result is considered not valid (a zero value or a negative value)
|
|
MAX_FAILED_ATTEMPTS=3
|
|
memtotalAvg=0
|
|
units_memtotal=""
|
|
memfreeAvg=0
|
|
units_memfree=""
|
|
memavailableAvg=0
|
|
units_memavailable=""
|
|
|
|
# count_iters: is the index of the current iteration
|
|
count_iters=0
|
|
|
|
# valid_result: if value stored is '1' the result is valid, '0' otherwise
|
|
valid_result=0
|
|
|
|
function parse_results() {
|
|
local raw_results="${1}"
|
|
|
|
# Variables used for sum cummulative values in the case of two or more reps.
|
|
# and used to compute average results for 'json' output format.
|
|
local memtotal_acu="${2:-0}"
|
|
local memfree_acu="${3:-0}"
|
|
local memavailable_acu="${4:-0}"
|
|
|
|
local memtotal
|
|
memtotal=$(echo "${raw_results}" | awk '/MemTotal/ {print $2}')
|
|
units_memtotal=$(echo "${raw_results}" | awk '/MemTotal/ {print $3}')
|
|
|
|
local memfree
|
|
memfree=$(echo "${raw_results}" | awk '/MemFree/ {print $2}')
|
|
units_memfree=$(echo "${raw_results}" | awk '/MemFree/ {print $3}')
|
|
|
|
local memavailable
|
|
memavailable=$(echo "${raw_results}" | awk '/MemAvailable/ {print $2}')
|
|
units_memavailable=$(echo "${raw_results}" | awk '/MemAvailable/ {print $3}')
|
|
|
|
# check results: if any result is zero or negative, it is considered as invalid, and the test will be repeated.
|
|
if (( $(echo "${memtotal} <= 0" | bc -l) )) || (( $(echo "${memfree} <= 0" | bc -l) )) || (( $(echo "${memavailable} <= 0" | bc -l) )); then
|
|
MAX_FAILED_ATTEMPTS=$((MAX_FAILED_ATTEMPTS-1))
|
|
valid_result=0
|
|
info "Skipping invalid result: memtotal: ${memtotal} memfree: ${memfree} memavailable: ${memavailable}"
|
|
return 0
|
|
fi
|
|
|
|
memtotalAvg=$((memtotal+memtotal_acu))
|
|
memfreeAvg=$((memfree+memfree_acu))
|
|
memavailableAvg=$((memavailable+memavailable_acu))
|
|
valid_result=1
|
|
info "Iteration# ${count_iters} memtotal: ${memtotal} memfree: ${memfree} memavailable: ${memavailable}"
|
|
}
|
|
|
|
function store_results_json() {
|
|
metrics_json_start_array
|
|
memtotalAvg=$(echo "scale=2; ${memtotalAvg} / ${count_iters}" | bc)
|
|
memfreeAvg=$(echo "scale=2; ${memfreeAvg} / ${count_iters}" | bc)
|
|
memavailableAvg=$(echo "scale=2; ${memavailableAvg} / ${count_iters}" | bc)
|
|
|
|
local json="$(cat << EOF
|
|
{
|
|
"memrequest": {
|
|
"Result" : ${MEMSIZE},
|
|
"Units" : "Kb"
|
|
},
|
|
"memtotal": {
|
|
"Result" : ${memtotalAvg},
|
|
"Units" : "${units_memtotal}"
|
|
},
|
|
"memfree": {
|
|
"Result" : ${memfreeAvg},
|
|
"Units" : "${units_memfree}"
|
|
},
|
|
"memavailable": {
|
|
"Result" : ${memavailableAvg},
|
|
"Units" : "${units_memavailable}"
|
|
},
|
|
"repetitions": {
|
|
"Result" : ${count_iters}
|
|
}
|
|
}
|
|
EOF
|
|
)"
|
|
metrics_json_add_array_element "$json"
|
|
metrics_json_end_array "Results"
|
|
metrics_json_save
|
|
}
|
|
|
|
function main() {
|
|
# switch to select output format
|
|
local num_iterations=${1:-1}
|
|
info "Iterations: ${num_iterations}"
|
|
|
|
# Check tools/commands dependencies
|
|
cmds=("awk" "ctr")
|
|
init_env
|
|
check_cmds "${cmds[@]}"
|
|
check_images "${IMAGE}"
|
|
metrics_json_init
|
|
while [ "${count_iters}" -lt "${num_iterations}" ]; do
|
|
local output
|
|
output=$(sudo -E "${CTR_EXE}" run --memory-limit $((MEMSIZE*1024)) --rm --runtime="${CTR_RUNTIME}" "${IMAGE}" busybox sh -c "${CMD}" 2>&1)
|
|
parse_results "${output}" "${memtotalAvg}" "${memfreeAvg}" "${memavailableAvg}"
|
|
|
|
# quit if number of attempts exceeds the allowed value.
|
|
[ "${MAX_FAILED_ATTEMPTS}" -eq 0 ] && die "Max number of attempts exceeded."
|
|
[ "${valid_result}" -eq 1 ] && count_iters=$((count_iters+1))
|
|
done
|
|
store_results_json
|
|
clean_env_ctr
|
|
}
|
|
|
|
# Parameters
|
|
# @1: num_iterations {integer}
|
|
main "$@"
|