Skip to content

Commit 2720de9

Browse files
authored
Merge pull request #105 from infosiftr/vm_memory_high_watermark
Add "vm_memory_high_watermark" to the generated config, sourced from the value of the "memory.limit_in_bytes" cgroup restriction
2 parents 253abcc + d2bd71d commit 2720de9

File tree

4 files changed

+150
-4
lines changed

4 files changed

+150
-4
lines changed

3.6/alpine/Dockerfile

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,6 @@ RUN set -ex; \
7575
ENV HOME /var/lib/rabbitmq
7676

7777
RUN mkdir -p /var/lib/rabbitmq /etc/rabbitmq \
78-
&& echo '[ { rabbit, [ { loopback_users, [ ] } ] } ].' > /etc/rabbitmq/rabbitmq.config \
7978
&& chown -R rabbitmq:rabbitmq /var/lib/rabbitmq /etc/rabbitmq \
8079
&& chmod -R 777 /var/lib/rabbitmq /etc/rabbitmq
8180
VOLUME /var/lib/rabbitmq

3.6/alpine/docker-entrypoint.sh

Lines changed: 75 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ rabbitConfigKeys=(
6464
default_user
6565
default_vhost
6666
hipe_compile
67+
vm_memory_high_watermark
6768
)
6869
fileConfigKeys=(
6970
management_ssl_cacertfile
@@ -95,6 +96,10 @@ for conf in "${allConfigKeys[@]}"; do
9596
var="RABBITMQ_${conf^^}"
9697
val="${!var:-}"
9798
if [ "$val" ]; then
99+
if [ "${configDefaults[$conf]:-}" ] && [ "${configDefaults[$conf]}" = "$val" ]; then
100+
# if the value set is the same as the default, treat it as if it isn't set
101+
continue
102+
fi
98103
haveConfig=1
99104
case "$conf" in
100105
ssl_*) haveSslConfig=1 ;;
@@ -235,13 +240,82 @@ rabbit_env_config() {
235240
join $'\n' "${ret[@]}"
236241
}
237242

238-
if [ "$1" = 'rabbitmq-server' ] && [ "$haveConfig" ]; then
243+
shouldWriteConfig="$haveConfig"
244+
if [ ! -f /etc/rabbitmq/rabbitmq.config ]; then
245+
shouldWriteConfig=1
246+
fi
247+
248+
if [ "$1" = 'rabbitmq-server' ] && [ "$shouldWriteConfig" ]; then
239249
fullConfig=()
240250

241251
rabbitConfig=(
242252
"{ loopback_users, $(rabbit_array) }"
243253
)
244254

255+
# determine whether to set "vm_memory_high_watermark" (based on cgroups)
256+
if [ -r /sys/fs/cgroup/memory/memory.limit_in_bytes ] && [ -r /proc/meminfo ]; then
257+
memLimitB="$(< /sys/fs/cgroup/memory/memory.limit_in_bytes)"
258+
memLimitKb="$(( memLimitB / 1024 ))"
259+
260+
memTotalKb="$(awk -F ':? +' '$1 == "MemTotal" { print $2; exit }' /proc/meminfo)"
261+
262+
if [ "$memLimitKb" -gt "$memTotalKb" ]; then
263+
memLimitB=
264+
memLimitKb=
265+
fi
266+
267+
# https://github.com/docker-library/rabbitmq/pull/105#issuecomment-242165822
268+
vmMemoryHighWatermark=
269+
if [ "${RABBITMQ_VM_MEMORY_HIGH_WATERMARK:-}" ]; then
270+
vmMemoryHighWatermark="$(
271+
awk -v lim="$memLimitB" '
272+
/^[0-9]*[.][0-9]+$|^[0-9]+([.][0-9]+)?%$/ {
273+
perc = $0;
274+
if (perc ~ /%$/) {
275+
gsub(/%$/, "", perc);
276+
perc = perc / 100;
277+
}
278+
if (perc > 1.0 || perc <= 0.0) {
279+
printf "error: invalid percentage for vm_memory_high_watermark: %s (must be > 0%%, <= 100%%)\n", $0 > "/dev/stderr";
280+
exit 1;
281+
}
282+
if (lim) {
283+
printf "{ absolute, %d }\n", lim * perc;
284+
} else {
285+
printf "%0.03f\n", perc;
286+
}
287+
next;
288+
}
289+
/^[0-9]+$/ {
290+
printf "{ absolute, %s }\n", $0;
291+
next;
292+
}
293+
/^[0-9]+([.][0-9]+)?[a-zA-Z]+$/ {
294+
printf "{ absolute, \"%s\" }\n", $0;
295+
next;
296+
}
297+
{
298+
printf "error: unexpected input for vm_memory_high_watermark: %s\n", $0;
299+
exit 1;
300+
}
301+
' <(echo "$RABBITMQ_VM_MEMORY_HIGH_WATERMARK")
302+
)"
303+
elif [ -n "$memLimitB" ]; then
304+
# if there is a cgroup limit, default to 40% of _that_ (as recommended by upstream)
305+
vmMemoryHighWatermark="{ absolute, $(( $memLimitB * 40 / 100 )) }"
306+
# otherwise let the default behavior win (40% of the total available)
307+
fi
308+
if [ "$vmMemoryHighWatermark" ]; then
309+
# https://www.rabbitmq.com/memory.html#memsup-usage
310+
rabbitConfig+=( "{ vm_memory_high_watermark, $vmMemoryHighWatermark }" )
311+
fi
312+
elif [ "${RABBITMQ_VM_MEMORY_HIGH_WATERMARK:-}" ]; then
313+
echo >&2 'warning: RABBITMQ_VM_MEMORY_HIGH_WATERMARK was specified, but one of the following is not readable:'
314+
echo >&2 ' - /sys/fs/cgroup/memory/memory.limit_in_bytes'
315+
echo >&2 ' - /proc/meminfo'
316+
echo >&2 '(so "vm_memory_high_watermark" will not be set)'
317+
fi
318+
245319
if [ "$haveSslConfig" ]; then
246320
IFS=$'\n'
247321
rabbitSslOptions=( $(rabbit_env_config 'ssl' "${sslConfigKeys[@]}") )

3.6/debian/Dockerfile

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,6 @@ ENV PATH /usr/lib/rabbitmq/bin:$PATH
7575
ENV HOME /var/lib/rabbitmq
7676

7777
RUN mkdir -p /var/lib/rabbitmq /etc/rabbitmq \
78-
&& echo '[ { rabbit, [ { loopback_users, [ ] } ] } ].' > /etc/rabbitmq/rabbitmq.config \
7978
&& chown -R rabbitmq:rabbitmq /var/lib/rabbitmq /etc/rabbitmq \
8079
&& chmod -R 777 /var/lib/rabbitmq /etc/rabbitmq
8180
VOLUME /var/lib/rabbitmq

3.6/debian/docker-entrypoint.sh

Lines changed: 75 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ rabbitConfigKeys=(
6464
default_user
6565
default_vhost
6666
hipe_compile
67+
vm_memory_high_watermark
6768
)
6869
fileConfigKeys=(
6970
management_ssl_cacertfile
@@ -95,6 +96,10 @@ for conf in "${allConfigKeys[@]}"; do
9596
var="RABBITMQ_${conf^^}"
9697
val="${!var:-}"
9798
if [ "$val" ]; then
99+
if [ "${configDefaults[$conf]:-}" ] && [ "${configDefaults[$conf]}" = "$val" ]; then
100+
# if the value set is the same as the default, treat it as if it isn't set
101+
continue
102+
fi
98103
haveConfig=1
99104
case "$conf" in
100105
ssl_*) haveSslConfig=1 ;;
@@ -235,13 +240,82 @@ rabbit_env_config() {
235240
join $'\n' "${ret[@]}"
236241
}
237242

238-
if [ "$1" = 'rabbitmq-server' ] && [ "$haveConfig" ]; then
243+
shouldWriteConfig="$haveConfig"
244+
if [ ! -f /etc/rabbitmq/rabbitmq.config ]; then
245+
shouldWriteConfig=1
246+
fi
247+
248+
if [ "$1" = 'rabbitmq-server' ] && [ "$shouldWriteConfig" ]; then
239249
fullConfig=()
240250

241251
rabbitConfig=(
242252
"{ loopback_users, $(rabbit_array) }"
243253
)
244254

255+
# determine whether to set "vm_memory_high_watermark" (based on cgroups)
256+
if [ -r /sys/fs/cgroup/memory/memory.limit_in_bytes ] && [ -r /proc/meminfo ]; then
257+
memLimitB="$(< /sys/fs/cgroup/memory/memory.limit_in_bytes)"
258+
memLimitKb="$(( memLimitB / 1024 ))"
259+
260+
memTotalKb="$(awk -F ':? +' '$1 == "MemTotal" { print $2; exit }' /proc/meminfo)"
261+
262+
if [ "$memLimitKb" -gt "$memTotalKb" ]; then
263+
memLimitB=
264+
memLimitKb=
265+
fi
266+
267+
# https://github.com/docker-library/rabbitmq/pull/105#issuecomment-242165822
268+
vmMemoryHighWatermark=
269+
if [ "${RABBITMQ_VM_MEMORY_HIGH_WATERMARK:-}" ]; then
270+
vmMemoryHighWatermark="$(
271+
awk -v lim="$memLimitB" '
272+
/^[0-9]*[.][0-9]+$|^[0-9]+([.][0-9]+)?%$/ {
273+
perc = $0;
274+
if (perc ~ /%$/) {
275+
gsub(/%$/, "", perc);
276+
perc = perc / 100;
277+
}
278+
if (perc > 1.0 || perc <= 0.0) {
279+
printf "error: invalid percentage for vm_memory_high_watermark: %s (must be > 0%%, <= 100%%)\n", $0 > "/dev/stderr";
280+
exit 1;
281+
}
282+
if (lim) {
283+
printf "{ absolute, %d }\n", lim * perc;
284+
} else {
285+
printf "%0.03f\n", perc;
286+
}
287+
next;
288+
}
289+
/^[0-9]+$/ {
290+
printf "{ absolute, %s }\n", $0;
291+
next;
292+
}
293+
/^[0-9]+([.][0-9]+)?[a-zA-Z]+$/ {
294+
printf "{ absolute, \"%s\" }\n", $0;
295+
next;
296+
}
297+
{
298+
printf "error: unexpected input for vm_memory_high_watermark: %s\n", $0;
299+
exit 1;
300+
}
301+
' <(echo "$RABBITMQ_VM_MEMORY_HIGH_WATERMARK")
302+
)"
303+
elif [ -n "$memLimitB" ]; then
304+
# if there is a cgroup limit, default to 40% of _that_ (as recommended by upstream)
305+
vmMemoryHighWatermark="{ absolute, $(( $memLimitB * 40 / 100 )) }"
306+
# otherwise let the default behavior win (40% of the total available)
307+
fi
308+
if [ "$vmMemoryHighWatermark" ]; then
309+
# https://www.rabbitmq.com/memory.html#memsup-usage
310+
rabbitConfig+=( "{ vm_memory_high_watermark, $vmMemoryHighWatermark }" )
311+
fi
312+
elif [ "${RABBITMQ_VM_MEMORY_HIGH_WATERMARK:-}" ]; then
313+
echo >&2 'warning: RABBITMQ_VM_MEMORY_HIGH_WATERMARK was specified, but one of the following is not readable:'
314+
echo >&2 ' - /sys/fs/cgroup/memory/memory.limit_in_bytes'
315+
echo >&2 ' - /proc/meminfo'
316+
echo >&2 '(so "vm_memory_high_watermark" will not be set)'
317+
fi
318+
245319
if [ "$haveSslConfig" ]; then
246320
IFS=$'\n'
247321
rabbitSslOptions=( $(rabbit_env_config 'ssl' "${sslConfigKeys[@]}") )

0 commit comments

Comments
 (0)