From fc20cb29de78f645254dada04b3ede3ae6c1e0d4 Mon Sep 17 00:00:00 2001 From: changxue2022 Date: Fri, 25 Apr 2025 14:59:02 +0800 Subject: [PATCH] docker: support configuring JVM memory environment variables in docker-compose file:IOTDB_JMX_OPTS for datanode,CONFIGNODE_JMX_OPTS for confignode --- .../docker-compose-host-3c3d.yml | 2 ++ .../docker-compose-standalone.yml | 4 ++- .../DockerCompose/replace-conf-from-env.sh | 11 +++--- .../assembly/resources/conf/confignode-env.sh | 31 +++++++++++----- .../assembly/resources/conf/datanode-env.sh | 35 +++++++++++++------ 5 files changed, 59 insertions(+), 24 deletions(-) diff --git a/docker/src/main/DockerCompose/docker-compose-host-3c3d.yml b/docker/src/main/DockerCompose/docker-compose-host-3c3d.yml index ab88c54f2548..242505d9d93b 100644 --- a/docker/src/main/DockerCompose/docker-compose-host-3c3d.yml +++ b/docker/src/main/DockerCompose/docker-compose-host-3c3d.yml @@ -29,6 +29,7 @@ services: - schema_replication_factor=3 - schema_region_consensus_protocol_class=org.apache.iotdb.consensus.ratis.RatisConsensus - config_node_consensus_protocol_class=org.apache.iotdb.consensus.ratis.RatisConsensus + - CONFIGNODE_JMX_OPTS=-Xms1G -Xmx1G -XX:MaxDirectMemorySize=256M volumes: - /etc/hosts:/etc/hosts:ro - ./data/confignode:/iotdb/data @@ -48,6 +49,7 @@ services: - dn_data_region_consensus_port=10760 - data_replication_factor=3 - data_region_consensus_protocol_class=org.apache.iotdb.consensus.iot.IoTConsensus + - IOTDB_JMX_OPTS=-Xms4G -Xmx4G -XX:MaxDirectMemorySize=1G volumes: - /etc/hosts:/etc/hosts:ro - ./data/datanode:/iotdb/data/ diff --git a/docker/src/main/DockerCompose/docker-compose-standalone.yml b/docker/src/main/DockerCompose/docker-compose-standalone.yml index 7193acfdcde3..e3c4a19b6be8 100644 --- a/docker/src/main/DockerCompose/docker-compose-standalone.yml +++ b/docker/src/main/DockerCompose/docker-compose-standalone.yml @@ -36,7 +36,9 @@ services: - dn_schema_region_consensus_port=10750 - dn_data_region_consensus_port=10760 - dn_seed_config_node=iotdb-service:10710 - volumes: + - IOTDB_JMX_OPTS=-Xms4G -Xmx4G -XX:MaxDirectMemorySize=1G + - CONFIGNODE_JMX_OPTS=-Xms1G -Xmx1G -XX:MaxDirectMemorySize=256M + volumes: - ./data:/iotdb/data - ./logs:/iotdb/logs networks: diff --git a/docker/src/main/DockerCompose/replace-conf-from-env.sh b/docker/src/main/DockerCompose/replace-conf-from-env.sh index eb183033119c..00a48050d7e6 100755 --- a/docker/src/main/DockerCompose/replace-conf-from-env.sh +++ b/docker/src/main/DockerCompose/replace-conf-from-env.sh @@ -34,17 +34,18 @@ function process_single(){ if [[ "${content:0:1}" != "#" ]]; then sed -i "${line_no}d" ${filename} fi - sed -i "${line_no} i${key_value}" ${filename} + sed -i "${line_no}a${key_value}" ${filename} else - echo "append $key $filename" - line_no=$(wc -l $filename) - sed -i "${line_no} a${key_value}" ${filename} + echo "append $key $filename" + line_no=$(wc -l $filename|cut -d ' ' -f1) + sed -i "${line_no}a${key_value}" ${filename} fi } function replace_configs(){ for v in $(env); do - if [[ "${v}" =~ "=" && "${v}" =~ "_" && ! "${v}" =~ "JAVA_" ]]; then + key_name="${v%%=*}" + if [[ "${key_name}" == "${key_name,,}" && ! 2w$key_name =~ ^_ ]]; then # echo "###### $v ####" for f in ${target_files}; do process_single $v ${conf_path}/$f diff --git a/iotdb-core/confignode/src/assembly/resources/conf/confignode-env.sh b/iotdb-core/confignode/src/assembly/resources/conf/confignode-env.sh index 065f08dee35c..aa19da4ebea4 100644 --- a/iotdb-core/confignode/src/assembly/resources/conf/confignode-env.sh +++ b/iotdb-core/confignode/src/assembly/resources/conf/confignode-env.sh @@ -20,6 +20,10 @@ # You can set ConfigNode memory size, example '2G' or '2048M' MEMORY_SIZE= +# on heap memory size +#ON_HEAP_MEMORY="2G" +# off heap memory size +#OFF_HEAP_MEMORY="512M" # You can put your env variable here # export JAVA_HOME=$JAVA_HOME @@ -250,12 +254,23 @@ else fi -calculate_memory_sizes +if [[ "$CONFIGNODE_JMX_OPTS" =~ -Xms ]];then + item_arr=(${CONFIGNODE_JMX_OPTS}) + for item in ${item_arr[@]};do + if [[ -n "$item" ]]; then + if [[ "$item" =~ -Xmx ]]; then + ON_HEAP_MEMORY=${item#*mx} + elif [[ "$item" =~ -XX:MaxDirectMemorySize= ]]; then + OFF_HEAP_MEMORY=${item#*=} + fi + fi + done +elif [[ -n "$ON_HEAP_MEMORY" ]]; then + echo "ON_HEAP_MEMORY=$ON_HEAP_MEMORY" +else + calculate_memory_sizes +fi -# on heap memory size -#ON_HEAP_MEMORY="2G" -# off heap memory size -#OFF_HEAP_MEMORY="512M" if [ "${OFF_HEAP_MEMORY%"G"}" != "$OFF_HEAP_MEMORY" ] then @@ -300,9 +315,9 @@ else fi CONFIGNODE_JMX_OPTS="$CONFIGNODE_JMX_OPTS -Diotdb.jmx.local=$JMX_LOCAL" -CONFIGNODE_JMX_OPTS="$CONFIGNODE_JMX_OPTS -Xms${ON_HEAP_MEMORY}" -CONFIGNODE_JMX_OPTS="$CONFIGNODE_JMX_OPTS -Xmx${ON_HEAP_MEMORY}" -CONFIGNODE_JMX_OPTS="$CONFIGNODE_JMX_OPTS -XX:MaxDirectMemorySize=${OFF_HEAP_MEMORY}" +if [[ ! "$CONFIGNODE_JMX_OPTS" =~ -Xms ]]; then CONFIGNODE_JMX_OPTS="$CONFIGNODE_JMX_OPTS -Xms${ON_HEAP_MEMORY}"; fi +if [[ ! "$CONFIGNODE_JMX_OPTS" =~ -Xmx ]]; then CONFIGNODE_JMX_OPTS="$CONFIGNODE_JMX_OPTS -Xmx${ON_HEAP_MEMORY}"; fi +if [[ ! "$CONFIGNODE_JMX_OPTS" =~ -XX:MaxDirectMemorySize ]]; then CONFIGNODE_JMX_OPTS="$CONFIGNODE_JMX_OPTS -XX:MaxDirectMemorySize=${OFF_HEAP_MEMORY}"; fi CONFIGNODE_JMX_OPTS="$CONFIGNODE_JMX_OPTS -Djdk.nio.maxCachedBufferSize=${MAX_CACHED_BUFFER_SIZE}" IOTDB_JMX_OPTS="$IOTDB_JMX_OPTS -XX:+CrashOnOutOfMemoryError" # if you want to dump the heap memory while OOM happening, you can use the following command, remember to replace ${heap_dump_dir}/confignode_heapdump.hprof with your own file path and the folder where this file is located needs to be created in advance diff --git a/iotdb-core/datanode/src/assembly/resources/conf/datanode-env.sh b/iotdb-core/datanode/src/assembly/resources/conf/datanode-env.sh index e9e59f43405f..b1e9e342485e 100755 --- a/iotdb-core/datanode/src/assembly/resources/conf/datanode-env.sh +++ b/iotdb-core/datanode/src/assembly/resources/conf/datanode-env.sh @@ -20,6 +20,11 @@ # You can set DataNode memory size, example '2G' or '2048M' MEMORY_SIZE= +# on heap memory size +#ON_HEAP_MEMORY="2G" +# off heap memory size +#OFF_HEAP_MEMORY="512M" + # You can put your env variable here # export JAVA_HOME=$JAVA_HOME @@ -261,12 +266,22 @@ else fi -calculate_memory_sizes - -# on heap memory size -#ON_HEAP_MEMORY="2G" -# off heap memory size -#OFF_HEAP_MEMORY="512M" +if [[ "$IOTDB_JMX_OPTS" =~ -Xms ]];then + item_arr=(${IOTDB_JMX_OPTS}) + for item in ${item_arr[@]};do + if [[ -n "$item" ]]; then + if [[ "$item" =~ -Xmx ]]; then + ON_HEAP_MEMORY=${item#*mx} + elif [[ "$item" =~ -XX:MaxDirectMemorySize= ]]; then + OFF_HEAP_MEMORY=${item#*=} + fi + fi + done +elif [[ -n "$ON_HEAP_MEMORY" ]]; then + echo "ON_HEAP_MEMORY=$ON_HEAP_MEMORY" +else + calculate_memory_sizes +fi if [ "${OFF_HEAP_MEMORY%"G"}" != "$OFF_HEAP_MEMORY" ] @@ -311,10 +326,11 @@ else echo "setting local JMX..." fi + IOTDB_JMX_OPTS="$IOTDB_JMX_OPTS -Diotdb.jmx.local=$JMX_LOCAL" -IOTDB_JMX_OPTS="$IOTDB_JMX_OPTS -Xms${ON_HEAP_MEMORY}" -IOTDB_JMX_OPTS="$IOTDB_JMX_OPTS -Xmx${ON_HEAP_MEMORY}" -IOTDB_JMX_OPTS="$IOTDB_JMX_OPTS -XX:MaxDirectMemorySize=${OFF_HEAP_MEMORY}" +if [[ ! "$CONFIGNODE_JMX_OPTS" =~ -Xms ]]; then IOTDB_JMX_OPTS="$IOTDB_JMX_OPTS -Xms${ON_HEAP_MEMORY}"; fi +if [[ ! "$CONFIGNODE_JMX_OPTS" =~ -Xmx ]]; then IOTDB_JMX_OPTS="$IOTDB_JMX_OPTS -Xmx${ON_HEAP_MEMORY}"; fi +if [[ ! "$CONFIGNODE_JMX_OPTS" =~ -XX:MaxDirectMemorySize= ]]; then IOTDB_JMX_OPTS="$IOTDB_JMX_OPTS -XX:MaxDirectMemorySize=${OFF_HEAP_MEMORY}"; fi IOTDB_JMX_OPTS="$IOTDB_JMX_OPTS -Djdk.nio.maxCachedBufferSize=${MAX_CACHED_BUFFER_SIZE}" IOTDB_JMX_OPTS="$IOTDB_JMX_OPTS -XX:+CrashOnOutOfMemoryError" IOTDB_JMX_OPTS="$IOTDB_JMX_OPTS -XX:+UseAdaptiveSizePolicy" @@ -345,7 +361,6 @@ IOTDB_JMX_OPTS="$IOTDB_JMX_OPTS -XX:+SafepointTimeout" # if you want to dump the heap memory while OOM happening, you can use the following command, remember to replace ${heap_dump_dir}/datanode_heapdump.hprof with your own file path and the folder where this file is located needs to be created in advance # IOTDB_JMX_OPTS="$IOTDB_JMX_OPTS -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${heap_dump_dir}/datanode_heapdump.hprof" - echo "DataNode on heap memory size = ${ON_HEAP_MEMORY}B, off heap memory size = ${OFF_HEAP_MEMORY}B" echo "If you want to change this configuration, please check conf/datanode-env.sh."