Skip to content

Commit ffd9617

Browse files
committed
CLOUD-2842 - Xms and Xms are different when limits are higher than 5Gi using JAVA_MAX_MEM_RATIO and JAVA_INITIAL_MEM_RATIO
1 parent be123a8 commit ffd9617

File tree

3 files changed

+151
-2
lines changed

3 files changed

+151
-2
lines changed

jboss/container/java/jvm/bash/artifacts/opt/jboss/container/java/jvm/container-limits

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ container_memory() {
4747
local max_mem_unbounded="$(max_unbounded)"
4848
if [ -r "${mem_file}" ]; then
4949
local max_mem="$(cat ${mem_file})"
50+
# note that this may return a value that is the maximum 64-bit signed integer, rounded to the nearest page (by dropping the last bits).
51+
# When this occurs, the comparision with MemTotal in /proc/meminfo will result it no value being returned.
5052
if [ ${max_mem} -lt ${max_mem_unbounded} ]; then
5153
echo "${max_mem}"
5254
fi

jboss/container/java/jvm/bash/artifacts/opt/jboss/container/java/jvm/java-default-options

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ max_memory() {
6666
return
6767
fi
6868

69-
# Check for the 'real memory size' and caluclate mx from a ratio
69+
# Check for the 'real memory size' and calculate mx from a ratio
7070
# given (default is 50%)
7171
if [ "x$CONTAINER_MAX_MEMORY" != x ]; then
7272
local max_mem="${CONTAINER_MAX_MEMORY}"
@@ -98,12 +98,20 @@ initial_memory() {
9898
local max_ratio=${JAVA_MAX_MEM_RATIO:-${__DEFAULT_JAVA_MAX_MEM_RATIO}}
9999
local initial_ratio=${JAVA_INITIAL_MEM_RATIO:-${__DEFAULT_JAVA_INITIAL_MEM_RATIO}}
100100
local ms=$(echo "${max_mem} ${max_ratio} ${initial_ratio} 1048576" | awk '{printf "%d\n" , ($1*(($2*$3)/10000))/$4 + 0.5}')
101-
local max_initial_memory=${JAVA_MAX_INITIAL_MEM:-${__DEFAULT_JAVA_MAX_INITIAL_MEM}}
101+
102+
# since CONTAINER_MAX_MEMORY is available (set by cgroups /sys/fs/cgroup/memory/memory.limit_in_bytes) then use that as the default)
103+
local cmm=$(echo "${CONTAINER_MAX_MEMORY} 1048576" | awk '{printf "%d\n" , ($1/$2) + 0.5}')
104+
local max_initial_memory=${JAVA_MAX_INITIAL_MEM:-${cmm}}
105+
102106
if [ "${ms}" -lt "${max_initial_memory}" ] ; then
103107
echo "-Xms${ms}m"
104108
else
105109
echo "-Xms${max_initial_memory}m"
106110
fi
111+
else
112+
# in this case, CONTAINER_MAX_MEMORY is not available from cgroups, but either JAVA_MAX_INITIAL_MEM has been specified,
113+
# or the default value (__DEFAULT_JAVA_MAX_INITIAL_MEM) should be used
114+
echo "-Xms${JAVA_MAX_INITIAL_MEM:-${__DEFAULT_JAVA_MAX_INITIAL_MEM}}m"
107115
fi
108116
}
109117

Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
export JBOSS_CONTAINER_JAVA_JVM_MODULE=${BATS_TEST_DIRNAME}/../../../bash/artifacts/opt/jboss/container/java/jvm/
2+
load $BATS_TEST_DIRNAME/../../../bash/artifacts/opt/jboss/container/java/jvm/java-default-options
3+
4+
@test "Test default initial memory value" {
5+
expected="-Xms4096m"
6+
run initial_memory
7+
echo "Result: ${output}"
8+
echo "Expected: ${expected}"
9+
[ "${expected}" = "${output}" ]
10+
}
11+
12+
@test "Test default initial memory values with valid CONTAINER_MAX_MEMORY" {
13+
expected="-Xms64m"
14+
CONTAINER_MAX_MEMORY=536870912
15+
run initial_memory
16+
echo "Result: ${output}"
17+
echo "Expected: ${expected}"
18+
[ "${expected}" = "${output}" ]
19+
}
20+
21+
@test "Test 6g initial memory values" {
22+
expected="-Xms768m"
23+
CONTAINER_MAX_MEMORY=6442450944
24+
JAVA_MAX_INITIAL_MEM=6144
25+
run initial_memory
26+
echo "Result: ${output}"
27+
echo "Expected: ${expected}"
28+
[ "${expected}" = "${output}" ]
29+
}
30+
31+
@test "Test 6g initial memory values no CMM" {
32+
expected="-Xms6144m"
33+
JAVA_MAX_INITIAL_MEM=6144
34+
run initial_memory
35+
echo "Result: ${output}"
36+
echo "Expected: ${expected}"
37+
[ "${expected}" = "${output}" ]
38+
}
39+
40+
@test "Test default max memory values" {
41+
expected="" # expect nothing
42+
run max_memory
43+
echo "Result: ${output}"
44+
echo "Expected: ${expected}"
45+
[ "${expected}" = "${output}" ]
46+
}
47+
48+
@test "Test default max memory values with valid CONTAINER_MAX_MEMORY" {
49+
expected="-Xmx256m"
50+
CONTAINER_MAX_MEMORY=536870912
51+
run max_memory
52+
echo "Result: ${output}"
53+
echo "Expected: ${expected}"
54+
[ "${expected}" = "${output}" ]
55+
}
56+
57+
@test "Test default max memory values with CONTAINER_MAX_MEMORY=512mb" {
58+
expected="-Xmx256m"
59+
CONTAINER_MAX_MEMORY=536870912
60+
run max_memory
61+
echo "Result: ${output}"
62+
echo "Expected: ${expected}"
63+
[ "${expected}" = "${output}" ]
64+
}
65+
66+
@test "Test 6g max memory values with CONTAINER_MAX_MEMORY set to 6g" {
67+
expected="-Xmx3072m"
68+
CONTAINER_MAX_MEMORY=6442450944
69+
run max_memory
70+
echo "Result: ${output}"
71+
echo "Expected: ${expected}"
72+
[ "${expected}" = "${output}" ]
73+
}
74+
75+
@test "Test default 0.9 max 1.0 initial " {
76+
min_expected="-Xms4096m" # should be empty
77+
max_expected=""
78+
JAVA_MAX_MEM_RATIO=90
79+
JAVA_INITIAL_MEM_RATIO=100
80+
run initial_memory
81+
min=${output}
82+
echo "Min Result: ${output}"
83+
echo "Min Expected: ${min_expected}"
84+
[ "${min_expected}" = "${min}" ]
85+
run max_memory
86+
max=${output}
87+
echo "Max Result: ${output}"
88+
echo "Max Expected: ${max_expected}"
89+
}
90+
91+
@test "Test 6g 0.9 max 1.0 initial " {
92+
min_expected="-Xms5530m"
93+
max_expected="-Xmx5530m"
94+
CONTAINER_MAX_MEMORY=6442450944
95+
JAVA_MAX_MEM_RATIO=90
96+
JAVA_INITIAL_MEM_RATIO=100
97+
run initial_memory
98+
min=${output}
99+
echo "Min Result: ${output}"
100+
echo "Min Expected: ${min_expected}"
101+
[ "${min_expected}" = "${min}" ]
102+
run max_memory
103+
max=${output}
104+
echo "Max Result: ${output}"
105+
echo "Max Expected: ${max_expected}"
106+
[ "${max_expected}" = "${max}" ]
107+
}
108+
109+
@test "Test default 4g 0.9 max 1.0 max only " {
110+
min_expected="-Xms4096m" # should be unset
111+
max_expected="-Xmx3686m"
112+
JAVA_MAX_MEM_RATIO=90
113+
JAVA_INITIAL_MEM_RATIO=100
114+
run initial_memory
115+
min=${output}
116+
echo "Min Result: ${output}"
117+
echo "Min Expected: ${min_expected}"
118+
[ "${min_expected}" = "${min}" ]
119+
run max_memory
120+
max=${output}
121+
echo "Max Result: ${output}"
122+
echo "Max Expected: ${max_expected}"
123+
}
124+
125+
@test "Test default 4g 1.0 max 1.0 max only " {
126+
min_expected="-Xms4096m"
127+
max_expected="-Xmx4096m"
128+
JAVA_MAX_MEM_RATIO=100
129+
JAVA_INITIAL_MEM_RATIO=100
130+
run initial_memory
131+
min=${output}
132+
echo "Min Result: ${output}"
133+
echo "Min Expected: ${min_expected}"
134+
[ "${min_expected}" = "${min}" ]
135+
run max_memory
136+
max=${output}
137+
echo "Max Result: ${output}"
138+
echo "Max Expected: ${max_expected}"
139+
}

0 commit comments

Comments
 (0)