@@ -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+ }
0 commit comments