Skip to content

Commit e123ada

Browse files
Respect pre-set env vars and add cgroup memory detection in env scripts (#17765)
1 parent 4c1f833 commit e123ada

5 files changed

Lines changed: 129 additions & 173 deletions

File tree

scripts/conf/confignode-env.sh

Lines changed: 4 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@
1919
#
2020

2121
# You can set ConfigNode memory size, example '2G' or '2048M'
22-
MEMORY_SIZE=
22+
# If the MEMORY_SIZE environment variable is already set, its value will be used.
23+
MEMORY_SIZE=${MEMORY_SIZE:-}
2324

2425
# You can put your env variable here
2526
# export JAVA_HOME=$JAVA_HOME
@@ -63,91 +64,6 @@ esac
6364
# whether we allow enable heap dump files
6465
IOTDB_ALLOW_HEAP_DUMP="true"
6566

66-
calculate_memory_sizes()
67-
{
68-
case "`uname`" in
69-
Linux)
70-
system_memory_in_mb=`free -m| sed -n '2p' | awk '{print $2}'`
71-
system_cpu_cores=`egrep -c 'processor([[:space:]]+):.*' /proc/cpuinfo`
72-
;;
73-
FreeBSD)
74-
system_memory_in_bytes=`sysctl hw.physmem | awk '{print $2}'`
75-
system_memory_in_mb=`expr $system_memory_in_bytes / 1024 / 1024`
76-
system_cpu_cores=`sysctl hw.ncpu | awk '{print $2}'`
77-
;;
78-
SunOS)
79-
system_memory_in_mb=`prtconf | awk '/Memory size:/ {print $3}'`
80-
system_cpu_cores=`psrinfo | wc -l`
81-
;;
82-
Darwin)
83-
system_memory_in_bytes=`sysctl hw.memsize | awk '{print $2}'`
84-
system_memory_in_mb=`expr $system_memory_in_bytes / 1024 / 1024`
85-
system_cpu_cores=`sysctl hw.ncpu | awk '{print $2}'`
86-
;;
87-
*)
88-
# assume reasonable defaults for e.g. a modern desktop or
89-
# cheap server
90-
system_memory_in_mb="2048"
91-
system_cpu_cores="2"
92-
;;
93-
esac
94-
95-
# some systems like the raspberry pi don't report cores, use at least 1
96-
if [ "$system_cpu_cores" -lt "1" ]
97-
then
98-
system_cpu_cores="1"
99-
fi
100-
101-
# suggest using memory, system memory 3 / 10
102-
suggest_using_memory_in_mb=`expr $system_memory_in_mb / 10 \* 3`
103-
104-
if [ -n "$MEMORY_SIZE" ]
105-
then
106-
if [ "${MEMORY_SIZE%"G"}" != "$MEMORY_SIZE" ] || [ "${MEMORY_SIZE%"M"}" != "$MEMORY_SIZE" ]
107-
then
108-
if [ "${MEMORY_SIZE%"G"}" != "$MEMORY_SIZE" ]
109-
then
110-
memory_size_in_mb=`expr ${MEMORY_SIZE%"G"} "*" 1024`
111-
else
112-
memory_size_in_mb=`expr ${MEMORY_SIZE%"M"}`
113-
fi
114-
else
115-
echo "Invalid format of MEMORY_SIZE, please use the format like 2048M or 2G"
116-
exit 1
117-
fi
118-
else
119-
# set memory size to suggest using memory, if suggest using memory is greater than 8GB, set memory size to 8GB
120-
if [ "$suggest_using_memory_in_mb" -gt "8192" ]
121-
then
122-
memory_size_in_mb="8192"
123-
else
124-
memory_size_in_mb=$suggest_using_memory_in_mb
125-
fi
126-
fi
127-
128-
# set on heap memory size
129-
# when memory_size_in_mb is less than 4 * 1024, we will set on heap memory size to memory_size_in_mb / 4 * 3
130-
# when memory_size_in_mb is greater than 4 * 1024 and less than 16 * 1024, we will set on heap memory size to memory_size_in_mb / 5 * 4
131-
# when memory_size_in_mb is greater than 16 * 1024 and less than 128 * 1024, we will set on heap memory size to memory_size_in_mb / 8 * 7
132-
# when memory_size_in_mb is greater than 128 * 1024, we will set on heap memory size to memory_size_in_mb - 16 * 1024
133-
if [ "$memory_size_in_mb" -lt "4096" ]
134-
then
135-
on_heap_memory_size_in_mb=`expr $memory_size_in_mb / 4 \* 3`
136-
elif [ "$memory_size_in_mb" -lt "16384" ]
137-
then
138-
on_heap_memory_size_in_mb=`expr $memory_size_in_mb / 5 \* 4`
139-
elif [ "$memory_size_in_mb" -lt "131072" ]
140-
then
141-
on_heap_memory_size_in_mb=`expr $memory_size_in_mb / 8 \* 7`
142-
else
143-
on_heap_memory_size_in_mb=`expr $memory_size_in_mb - 16384`
144-
fi
145-
off_heap_memory_size_in_mb=`expr $memory_size_in_mb - $on_heap_memory_size_in_mb`
146-
147-
ON_HEAP_MEMORY="${on_heap_memory_size_in_mb}M"
148-
OFF_HEAP_MEMORY="${off_heap_memory_size_in_mb}M"
149-
}
150-
15167
get_cn_system_dir() {
15268
local config_file="$1"
15369
local cn_system_dir=""
@@ -234,7 +150,8 @@ illegal_access_params="$illegal_access_params --add-opens=java.base/java.io=ALL-
234150
illegal_access_params="$illegal_access_params --add-opens=java.base/java.net=ALL-UNNAMED"
235151

236152

237-
calculate_memory_sizes
153+
# ConfigNode: suggest 30% of system memory (3/10), cap at 8 GB.
154+
calculate_memory_sizes 3 10 8192
238155

239156
# on heap memory size
240157
#ON_HEAP_MEMORY="2G"

scripts/conf/datanode-env.sh

Lines changed: 4 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@
1919
#
2020

2121
# You can set DataNode memory size, example '2G' or '2048M'
22-
MEMORY_SIZE=
22+
# If the MEMORY_SIZE environment variable is already set, its value will be used.
23+
MEMORY_SIZE=${MEMORY_SIZE:-}
2324

2425

2526
# You can put your env variable here
@@ -64,86 +65,6 @@ esac
6465
# whether we allow enable heap dump files
6566
IOTDB_ALLOW_HEAP_DUMP="true"
6667

67-
calculate_memory_sizes()
68-
{
69-
case "`uname`" in
70-
Linux)
71-
system_memory_in_mb=`free -m| sed -n '2p' | awk '{print $2}'`
72-
system_cpu_cores=`egrep -c 'processor([[:space:]]+):.*' /proc/cpuinfo`
73-
;;
74-
FreeBSD)
75-
system_memory_in_bytes=`sysctl hw.physmem | awk '{print $2}'`
76-
system_memory_in_mb=`expr $system_memory_in_bytes / 1024 / 1024`
77-
system_cpu_cores=`sysctl hw.ncpu | awk '{print $2}'`
78-
;;
79-
SunOS)
80-
system_memory_in_mb=`prtconf | awk '/Memory size:/ {print $3}'`
81-
system_cpu_cores=`psrinfo | wc -l`
82-
;;
83-
Darwin)
84-
system_memory_in_bytes=`sysctl hw.memsize | awk '{print $2}'`
85-
system_memory_in_mb=`expr $system_memory_in_bytes / 1024 / 1024`
86-
system_cpu_cores=`sysctl hw.ncpu | awk '{print $2}'`
87-
;;
88-
*)
89-
# assume reasonable defaults for e.g. a modern desktop or
90-
# cheap server
91-
system_memory_in_mb="2048"
92-
system_cpu_cores="2"
93-
;;
94-
esac
95-
96-
# some systems like the raspberry pi don't report cores, use at least 1
97-
if [ "$system_cpu_cores" -lt "1" ]
98-
then
99-
system_cpu_cores="1"
100-
fi
101-
102-
# suggest using memory, system memory 1 / 2
103-
suggest_using_memory_in_mb=`expr $system_memory_in_mb / 2`
104-
105-
if [ -n "$MEMORY_SIZE" ]
106-
then
107-
if [ "${MEMORY_SIZE%"G"}" != "$MEMORY_SIZE" ] || [ "${MEMORY_SIZE%"M"}" != "$MEMORY_SIZE" ]
108-
then
109-
if [ "${MEMORY_SIZE%"G"}" != "$MEMORY_SIZE" ]
110-
then
111-
memory_size_in_mb=`expr ${MEMORY_SIZE%"G"} "*" 1024`
112-
else
113-
memory_size_in_mb=`expr ${MEMORY_SIZE%"M"}`
114-
fi
115-
else
116-
echo "Invalid format of MEMORY_SIZE, please use the format like 2048M or 2G"
117-
exit 1
118-
fi
119-
else
120-
memory_size_in_mb=$suggest_using_memory_in_mb
121-
fi
122-
123-
# set on heap memory size
124-
# when memory_size_in_mb is less than 4 * 1024, we will set on heap memory size to memory_size_in_mb / 4 * 3
125-
# when memory_size_in_mb is greater than 4 * 1024 and less than 16 * 1024, we will set on heap memory size to memory_size_in_mb / 5 * 4
126-
# when memory_size_in_mb is greater than 16 * 1024 and less than 128 * 1024, we will set on heap memory size to memory_size_in_mb / 8 * 7
127-
# when memory_size_in_mb is greater than 128 * 1024, we will set on heap memory size to memory_size_in_mb - 16 * 1024
128-
if [ "$memory_size_in_mb" -lt "4096" ]
129-
then
130-
on_heap_memory_size_in_mb=`expr $memory_size_in_mb / 4 \* 3`
131-
elif [ "$memory_size_in_mb" -lt "16384" ]
132-
then
133-
on_heap_memory_size_in_mb=`expr $memory_size_in_mb / 5 \* 4`
134-
elif [ "$memory_size_in_mb" -lt "131072" ]
135-
then
136-
on_heap_memory_size_in_mb=`expr $memory_size_in_mb / 8 \* 7`
137-
else
138-
on_heap_memory_size_in_mb=`expr $memory_size_in_mb - 16384`
139-
fi
140-
off_heap_memory_size_in_mb=`expr $memory_size_in_mb - $on_heap_memory_size_in_mb`
141-
142-
ON_HEAP_MEMORY="${on_heap_memory_size_in_mb}M"
143-
OFF_HEAP_MEMORY="${off_heap_memory_size_in_mb}M"
144-
}
145-
146-
14768
# find first dir of dn_data_dirs from properties file
14869
get_first_data_dir() {
14970
local config_file="$1"
@@ -242,7 +163,8 @@ illegal_access_params="$illegal_access_params --add-opens=java.base/java.nio=ALL
242163
illegal_access_params="$illegal_access_params --add-opens=java.base/java.io=ALL-UNNAMED"
243164
illegal_access_params="$illegal_access_params --add-opens=java.base/java.net=ALL-UNNAMED"
244165

245-
calculate_memory_sizes
166+
# DataNode: suggest 50% of system memory (1/2), no cap.
167+
calculate_memory_sizes 1 2 0
246168

247169
# on heap memory size
248170
#ON_HEAP_MEMORY="2G"

scripts/conf/iotdb-common.sh

Lines changed: 116 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -392,4 +392,119 @@ get_iotdb_include() {
392392
esac
393393
done
394394
echo "$VARS"
395-
}
395+
}
396+
397+
# Calculate ON_HEAP_MEMORY and OFF_HEAP_MEMORY from system resources.
398+
#
399+
# $1 numerator of the suggested memory fraction (e.g. 1 for DataNode, 3 for ConfigNode)
400+
# $2 denominator of the suggested memory fraction (e.g. 2 for DataNode, 10 for ConfigNode)
401+
# $3 max suggested memory in MB; 0 means no cap (e.g. 0 for DataNode, 8192 for ConfigNode)
402+
#
403+
# Respects the MEMORY_SIZE environment variable (e.g. '2G' or '2048M') when set.
404+
calculate_memory_sizes()
405+
{
406+
local suggest_numerator=${1:-1}
407+
local suggest_denominator=${2:-2}
408+
local max_suggest_mb=${3:-0}
409+
410+
case "`uname`" in
411+
Linux)
412+
system_memory_in_mb=`free -m| sed -n '2p' | awk '{print $2}'`
413+
# When running in a container/pod, use cgroup memory limit instead of host memory.
414+
# This reads the root cgroup, which is what containers see; it does NOT walk
415+
# /proc/self/cgroup, so cgroup-restricted processes on bare metal are not covered.
416+
if [ -f /sys/fs/cgroup/memory.max ]; then
417+
# cgroup v2
418+
cgroup_mem=`cat /sys/fs/cgroup/memory.max`
419+
if [ "$cgroup_mem" != "max" ]; then
420+
cgroup_mem_in_mb=`expr $cgroup_mem / 1024 / 1024`
421+
if [ "$cgroup_mem_in_mb" -lt "$system_memory_in_mb" ]; then
422+
system_memory_in_mb=$cgroup_mem_in_mb
423+
fi
424+
fi
425+
elif [ -f /sys/fs/cgroup/memory/memory.limit_in_bytes ]; then
426+
# v1 has no "max" sentinel — when unset, this file holds a huge integer (~PAGE_COUNTER_MAX);
427+
# the -lt check below naturally rejects it, so no explicit guard is needed.
428+
cgroup_mem=`cat /sys/fs/cgroup/memory/memory.limit_in_bytes`
429+
cgroup_mem_in_mb=`expr $cgroup_mem / 1024 / 1024`
430+
if [ "$cgroup_mem_in_mb" -lt "$system_memory_in_mb" ]; then
431+
system_memory_in_mb=$cgroup_mem_in_mb
432+
fi
433+
fi
434+
system_cpu_cores=`egrep -c 'processor([[:space:]]+):.*' /proc/cpuinfo`
435+
;;
436+
FreeBSD)
437+
system_memory_in_bytes=`sysctl hw.physmem | awk '{print $2}'`
438+
system_memory_in_mb=`expr $system_memory_in_bytes / 1024 / 1024`
439+
system_cpu_cores=`sysctl hw.ncpu | awk '{print $2}'`
440+
;;
441+
SunOS)
442+
system_memory_in_mb=`prtconf | awk '/Memory size:/ {print $3}'`
443+
system_cpu_cores=`psrinfo | wc -l`
444+
;;
445+
Darwin)
446+
system_memory_in_bytes=`sysctl hw.memsize | awk '{print $2}'`
447+
system_memory_in_mb=`expr $system_memory_in_bytes / 1024 / 1024`
448+
system_cpu_cores=`sysctl hw.ncpu | awk '{print $2}'`
449+
;;
450+
*)
451+
# assume reasonable defaults for e.g. a modern desktop or
452+
# cheap server
453+
system_memory_in_mb="2048"
454+
system_cpu_cores="2"
455+
;;
456+
esac
457+
458+
# some systems like the raspberry pi don't report cores, use at least 1
459+
if [ "$system_cpu_cores" -lt "1" ]
460+
then
461+
system_cpu_cores="1"
462+
fi
463+
464+
suggest_using_memory_in_mb=`expr $system_memory_in_mb / $suggest_denominator \* $suggest_numerator`
465+
466+
if [ -n "$MEMORY_SIZE" ]
467+
then
468+
if [ "${MEMORY_SIZE%"G"}" != "$MEMORY_SIZE" ] || [ "${MEMORY_SIZE%"M"}" != "$MEMORY_SIZE" ]
469+
then
470+
if [ "${MEMORY_SIZE%"G"}" != "$MEMORY_SIZE" ]
471+
then
472+
memory_size_in_mb=`expr ${MEMORY_SIZE%"G"} "*" 1024`
473+
else
474+
memory_size_in_mb=`expr ${MEMORY_SIZE%"M"}`
475+
fi
476+
else
477+
echo "Invalid format of MEMORY_SIZE, please use the format like 2048M or 2G"
478+
exit 1
479+
fi
480+
else
481+
if [ "$max_suggest_mb" -gt "0" ] && [ "$suggest_using_memory_in_mb" -gt "$max_suggest_mb" ]
482+
then
483+
memory_size_in_mb=$max_suggest_mb
484+
else
485+
memory_size_in_mb=$suggest_using_memory_in_mb
486+
fi
487+
fi
488+
489+
# set on heap memory size
490+
# when memory_size_in_mb is less than 4 * 1024, we will set on heap memory size to memory_size_in_mb / 4 * 3
491+
# when memory_size_in_mb is greater than 4 * 1024 and less than 16 * 1024, we will set on heap memory size to memory_size_in_mb / 5 * 4
492+
# when memory_size_in_mb is greater than 16 * 1024 and less than 128 * 1024, we will set on heap memory size to memory_size_in_mb / 8 * 7
493+
# when memory_size_in_mb is greater than 128 * 1024, we will set on heap memory size to memory_size_in_mb - 16 * 1024
494+
if [ "$memory_size_in_mb" -lt "4096" ]
495+
then
496+
on_heap_memory_size_in_mb=`expr $memory_size_in_mb / 4 \* 3`
497+
elif [ "$memory_size_in_mb" -lt "16384" ]
498+
then
499+
on_heap_memory_size_in_mb=`expr $memory_size_in_mb / 5 \* 4`
500+
elif [ "$memory_size_in_mb" -lt "131072" ]
501+
then
502+
on_heap_memory_size_in_mb=`expr $memory_size_in_mb / 8 \* 7`
503+
else
504+
on_heap_memory_size_in_mb=`expr $memory_size_in_mb - 16384`
505+
fi
506+
off_heap_memory_size_in_mb=`expr $memory_size_in_mb - $on_heap_memory_size_in_mb`
507+
508+
ON_HEAP_MEMORY="${on_heap_memory_size_in_mb}M"
509+
OFF_HEAP_MEMORY="${off_heap_memory_size_in_mb}M"
510+
}

scripts/conf/windows/confignode-env.bat

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,9 @@
1919

2020
@echo off
2121

22-
@REM You can set datanode memory size, example '2G' or '2048M'
23-
set MEMORY_SIZE=
22+
@REM You can set confignode memory size, example '2G' or '2048M'
23+
@REM If the MEMORY_SIZE environment variable is already set, its value will be used.
24+
if not defined MEMORY_SIZE set MEMORY_SIZE=
2425

2526
@REM true or false
2627
@REM DO NOT FORGET TO MODIFY THE PASSWORD FOR SECURITY (%CONFIGNODE_CONF%\jmx.password and %{CONFIGNODE_CONF%\jmx.access)

scripts/conf/windows/datanode-env.bat

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@
2020
@echo off
2121

2222
@REM You can set datanode memory size, example '2G' or '2048M'
23-
set MEMORY_SIZE=
23+
@REM If the MEMORY_SIZE environment variable is already set, its value will be used.
24+
if not defined MEMORY_SIZE set MEMORY_SIZE=
2425

2526
@REM true or false
2627
@REM DO NOT FORGET TO MODIFY THE PASSWORD FOR SECURITY (%IOTDB_CONF%\jmx.password and %{IOTDB_CONF%\jmx.access)

0 commit comments

Comments
 (0)