Adjust "vm_memory_high_watermark" code to be more forgiving about large data (such as a reported memory limit of 18446744073709551615/MAX_UINT)
This commit is contained in:
parent
2720de9977
commit
1509b142f0
|
|
@ -253,17 +253,23 @@ if [ "$1" = 'rabbitmq-server' ] && [ "$shouldWriteConfig" ]; then
|
||||||
)
|
)
|
||||||
|
|
||||||
# determine whether to set "vm_memory_high_watermark" (based on cgroups)
|
# determine whether to set "vm_memory_high_watermark" (based on cgroups)
|
||||||
if [ -r /sys/fs/cgroup/memory/memory.limit_in_bytes ] && [ -r /proc/meminfo ]; then
|
memTotalKb=
|
||||||
memLimitB="$(< /sys/fs/cgroup/memory/memory.limit_in_bytes)"
|
if [ -r /proc/meminfo ]; then
|
||||||
memLimitKb="$(( memLimitB / 1024 ))"
|
|
||||||
|
|
||||||
memTotalKb="$(awk -F ':? +' '$1 == "MemTotal" { print $2; exit }' /proc/meminfo)"
|
memTotalKb="$(awk -F ':? +' '$1 == "MemTotal" { print $2; exit }' /proc/meminfo)"
|
||||||
|
fi
|
||||||
if [ "$memLimitKb" -gt "$memTotalKb" ]; then
|
memLimitB=
|
||||||
memLimitB=
|
if [ -r /sys/fs/cgroup/memory/memory.limit_in_bytes ]; then
|
||||||
memLimitKb=
|
# "18446744073709551615" is a valid value for "memory.limit_in_bytes", which is too big for Bash math to handle
|
||||||
fi
|
# "$(( 18446744073709551615 / 1024 ))" = 0; "$(( 18446744073709551615 * 40 / 100 ))" = 0
|
||||||
|
memLimitB="$(awk -v totKb="$memTotalKb" '{
|
||||||
|
limB = $0;
|
||||||
|
limKb = limB / 1024;
|
||||||
|
if (!totKb || limKb < totKb) {
|
||||||
|
printf "%.0f\n", limB;
|
||||||
|
}
|
||||||
|
}' /sys/fs/cgroup/memory/memory.limit_in_bytes)"
|
||||||
|
fi
|
||||||
|
if [ -n "$memTotalKb" ] || [ -n "$memLimitB" ]; then
|
||||||
# https://github.com/docker-library/rabbitmq/pull/105#issuecomment-242165822
|
# https://github.com/docker-library/rabbitmq/pull/105#issuecomment-242165822
|
||||||
vmMemoryHighWatermark=
|
vmMemoryHighWatermark=
|
||||||
if [ "${RABBITMQ_VM_MEMORY_HIGH_WATERMARK:-}" ]; then
|
if [ "${RABBITMQ_VM_MEMORY_HIGH_WATERMARK:-}" ]; then
|
||||||
|
|
@ -302,7 +308,7 @@ if [ "$1" = 'rabbitmq-server' ] && [ "$shouldWriteConfig" ]; then
|
||||||
)"
|
)"
|
||||||
elif [ -n "$memLimitB" ]; then
|
elif [ -n "$memLimitB" ]; then
|
||||||
# if there is a cgroup limit, default to 40% of _that_ (as recommended by upstream)
|
# if there is a cgroup limit, default to 40% of _that_ (as recommended by upstream)
|
||||||
vmMemoryHighWatermark="{ absolute, $(( $memLimitB * 40 / 100 )) }"
|
vmMemoryHighWatermark="{ absolute, $(awk -v lim="$memLimitB" 'BEGIN { printf "%.0f\n", lim * 0.4; exit }') }"
|
||||||
# otherwise let the default behavior win (40% of the total available)
|
# otherwise let the default behavior win (40% of the total available)
|
||||||
fi
|
fi
|
||||||
if [ "$vmMemoryHighWatermark" ]; then
|
if [ "$vmMemoryHighWatermark" ]; then
|
||||||
|
|
@ -310,10 +316,8 @@ if [ "$1" = 'rabbitmq-server' ] && [ "$shouldWriteConfig" ]; then
|
||||||
rabbitConfig+=( "{ vm_memory_high_watermark, $vmMemoryHighWatermark }" )
|
rabbitConfig+=( "{ vm_memory_high_watermark, $vmMemoryHighWatermark }" )
|
||||||
fi
|
fi
|
||||||
elif [ "${RABBITMQ_VM_MEMORY_HIGH_WATERMARK:-}" ]; then
|
elif [ "${RABBITMQ_VM_MEMORY_HIGH_WATERMARK:-}" ]; then
|
||||||
echo >&2 'warning: RABBITMQ_VM_MEMORY_HIGH_WATERMARK was specified, but one of the following is not readable:'
|
echo >&2 'warning: RABBITMQ_VM_MEMORY_HIGH_WATERMARK was specified, but current system memory or cgroup memory limit cannot be determined'
|
||||||
echo >&2 ' - /sys/fs/cgroup/memory/memory.limit_in_bytes'
|
echo >&2 ' (so "vm_memory_high_watermark" will not be set)'
|
||||||
echo >&2 ' - /proc/meminfo'
|
|
||||||
echo >&2 '(so "vm_memory_high_watermark" will not be set)'
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "$haveSslConfig" ]; then
|
if [ "$haveSslConfig" ]; then
|
||||||
|
|
|
||||||
|
|
@ -253,17 +253,23 @@ if [ "$1" = 'rabbitmq-server' ] && [ "$shouldWriteConfig" ]; then
|
||||||
)
|
)
|
||||||
|
|
||||||
# determine whether to set "vm_memory_high_watermark" (based on cgroups)
|
# determine whether to set "vm_memory_high_watermark" (based on cgroups)
|
||||||
if [ -r /sys/fs/cgroup/memory/memory.limit_in_bytes ] && [ -r /proc/meminfo ]; then
|
memTotalKb=
|
||||||
memLimitB="$(< /sys/fs/cgroup/memory/memory.limit_in_bytes)"
|
if [ -r /proc/meminfo ]; then
|
||||||
memLimitKb="$(( memLimitB / 1024 ))"
|
|
||||||
|
|
||||||
memTotalKb="$(awk -F ':? +' '$1 == "MemTotal" { print $2; exit }' /proc/meminfo)"
|
memTotalKb="$(awk -F ':? +' '$1 == "MemTotal" { print $2; exit }' /proc/meminfo)"
|
||||||
|
fi
|
||||||
if [ "$memLimitKb" -gt "$memTotalKb" ]; then
|
memLimitB=
|
||||||
memLimitB=
|
if [ -r /sys/fs/cgroup/memory/memory.limit_in_bytes ]; then
|
||||||
memLimitKb=
|
# "18446744073709551615" is a valid value for "memory.limit_in_bytes", which is too big for Bash math to handle
|
||||||
fi
|
# "$(( 18446744073709551615 / 1024 ))" = 0; "$(( 18446744073709551615 * 40 / 100 ))" = 0
|
||||||
|
memLimitB="$(awk -v totKb="$memTotalKb" '{
|
||||||
|
limB = $0;
|
||||||
|
limKb = limB / 1024;
|
||||||
|
if (!totKb || limKb < totKb) {
|
||||||
|
printf "%.0f\n", limB;
|
||||||
|
}
|
||||||
|
}' /sys/fs/cgroup/memory/memory.limit_in_bytes)"
|
||||||
|
fi
|
||||||
|
if [ -n "$memTotalKb" ] || [ -n "$memLimitB" ]; then
|
||||||
# https://github.com/docker-library/rabbitmq/pull/105#issuecomment-242165822
|
# https://github.com/docker-library/rabbitmq/pull/105#issuecomment-242165822
|
||||||
vmMemoryHighWatermark=
|
vmMemoryHighWatermark=
|
||||||
if [ "${RABBITMQ_VM_MEMORY_HIGH_WATERMARK:-}" ]; then
|
if [ "${RABBITMQ_VM_MEMORY_HIGH_WATERMARK:-}" ]; then
|
||||||
|
|
@ -302,7 +308,7 @@ if [ "$1" = 'rabbitmq-server' ] && [ "$shouldWriteConfig" ]; then
|
||||||
)"
|
)"
|
||||||
elif [ -n "$memLimitB" ]; then
|
elif [ -n "$memLimitB" ]; then
|
||||||
# if there is a cgroup limit, default to 40% of _that_ (as recommended by upstream)
|
# if there is a cgroup limit, default to 40% of _that_ (as recommended by upstream)
|
||||||
vmMemoryHighWatermark="{ absolute, $(( $memLimitB * 40 / 100 )) }"
|
vmMemoryHighWatermark="{ absolute, $(awk -v lim="$memLimitB" 'BEGIN { printf "%.0f\n", lim * 0.4; exit }') }"
|
||||||
# otherwise let the default behavior win (40% of the total available)
|
# otherwise let the default behavior win (40% of the total available)
|
||||||
fi
|
fi
|
||||||
if [ "$vmMemoryHighWatermark" ]; then
|
if [ "$vmMemoryHighWatermark" ]; then
|
||||||
|
|
@ -310,10 +316,8 @@ if [ "$1" = 'rabbitmq-server' ] && [ "$shouldWriteConfig" ]; then
|
||||||
rabbitConfig+=( "{ vm_memory_high_watermark, $vmMemoryHighWatermark }" )
|
rabbitConfig+=( "{ vm_memory_high_watermark, $vmMemoryHighWatermark }" )
|
||||||
fi
|
fi
|
||||||
elif [ "${RABBITMQ_VM_MEMORY_HIGH_WATERMARK:-}" ]; then
|
elif [ "${RABBITMQ_VM_MEMORY_HIGH_WATERMARK:-}" ]; then
|
||||||
echo >&2 'warning: RABBITMQ_VM_MEMORY_HIGH_WATERMARK was specified, but one of the following is not readable:'
|
echo >&2 'warning: RABBITMQ_VM_MEMORY_HIGH_WATERMARK was specified, but current system memory or cgroup memory limit cannot be determined'
|
||||||
echo >&2 ' - /sys/fs/cgroup/memory/memory.limit_in_bytes'
|
echo >&2 ' (so "vm_memory_high_watermark" will not be set)'
|
||||||
echo >&2 ' - /proc/meminfo'
|
|
||||||
echo >&2 '(so "vm_memory_high_watermark" will not be set)'
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "$haveSslConfig" ]; then
|
if [ "$haveSslConfig" ]; then
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue