asjfoajs opened a new issue, #8697:
URL: https://github.com/apache/rocketmq/issues/8697
### Is Your Feature Request Related to a Problem?
At present, when starting the broker, passing JVM parameters is not
supported. For example, setting the JVM heap size is directly set in the
runbroker. sh script through ` JAVA-POT="${JAVA-POT} - server - Xms8g - Xmx8g"
`, which is not suitable for containerized deployment. When using containerized
deployment, you want to pass JVM parameters yourself.
### Describe the Solution You'd Like
1. Add DockerFile to receive JVM parameters
ENV JVM_OPT_XMX="4g"
ENV JVM_OPT_XMS="4g"
ENV JVM_OPT_XMN="2g"
2.Modify runbroker.sh
```bash
if [ "$JVM_OPT_XMX" = "" ]; then
export JVM_OPT_XMX="4g"
fi
if [ "$JVM_OPT_XMS" = "" ]; then
export JVM_OPT_XMS="4g"
fi
if [ "$JVM_OPT_XMN" = "" ]; then
export JVM_OPT_XMN="2g"
fi
JAVA_OPT="${JAVA_OPT} -server -Xms${Xms} -Xmx${Xmx} -Xmn${Xmn}"
```
### Describe Alternatives You've Considered
Since it is not possible to impose restrictions on the image, how did
RocketMQ operator do it? View the images/broker/apine directory, which is the
memory size obtained through cgroup, then generate a script and rename it to
runbroker.sh.
```shell
calculate_heap_sizes()
{
case "`uname`" in
Linux)
system_memory_in_mb=`free -m| sed -n '2p' | awk '{print $2}'`
if [ -f /sys/fs/cgroup/memory/memory.limit_in_bytes ]; then
system_memory_in_mb_in_docker=$(($(cat
/sys/fs/cgroup/memory/memory.limit_in_bytes)/1024/1024))
elif [ -f /sys/fs/cgroup/memory.max ]; then
system_memory_in_mb_in_docker=$(($(cat
/sys/fs/cgroup/memory.max)/1024/1024))
else
error_exit "Can not get memory, please check cgroup"
fi
if [ $system_memory_in_mb_in_docker -lt $system_memory_in_mb
];then
system_memory_in_mb=$system_memory_in_mb_in_docker
fi
system_cpu_cores=`egrep -c 'processor([[:space:]]+):.*'
/proc/cpuinfo`
if [ -f /sys/fs/cgroup/cpu/cpu.cfs_quota_us ]; then
system_cpu_cores_in_docker=$(($(cat
/sys/fs/cgroup/cpu/cpu.cfs_quota_us)/$(cat
/sys/fs/cgroup/cpu/cpu.cfs_period_us)))
elif [ -f /sys/fs/cgroup/cpu.max ]; then
QUOTA=$(cut -d ' ' -f 1 /sys/fs/cgroup/cpu.max)
PERIOD=$(cut -d ' ' -f 2 /sys/fs/cgroup/cpu.max)
if [ "$QUOTA" == "max" ]; then # no limit, see
https://docs.kernel.org/admin-guide/cgroup-v2.html#cgroup-v2-cpu
system_cpu_cores_in_docker=$system_cpu_cores
else
system_cpu_cores_in_docker=$(($QUOTA/$PERIOD))
fi
else
error_exit "Can not get cpu, please check cgroup"
fi
if [ $system_cpu_cores_in_docker -lt $system_cpu_cores -a
$system_cpu_cores_in_docker -ne 0 ];then
system_cpu_cores=$system_cpu_cores_in_docker
fi
;;
FreeBSD)
system_memory_in_bytes=`sysctl hw.physmem | awk '{print $2}'`
system_memory_in_mb=`expr $system_memory_in_bytes / 1024 / 1024`
system_cpu_cores=`sysctl hw.ncpu | awk '{print $2}'`
;;
SunOS)
system_memory_in_mb=`prtconf | awk '/Memory size:/ {print $3}'`
system_cpu_cores=`psrinfo | wc -l`
;;
Darwin)
system_memory_in_bytes=`sysctl hw.memsize | awk '{print $2}'`
system_memory_in_mb=`expr $system_memory_in_bytes / 1024 / 1024`
system_cpu_cores=`sysctl hw.ncpu | awk '{print $2}'`
;;
*)
# assume reasonable defaults for e.g. a modern desktop or
# cheap server
system_memory_in_mb="2048"
system_cpu_cores="2"
;;
esac
# some systems like the raspberry pi don't report cores, use at least 1
if [ "$system_cpu_cores" -lt "1" ]
then
system_cpu_cores="1"
fi
# set max heap size based on the following
# max(min(1/2 ram, 1024MB), min(1/4 ram, 8GB))
# calculate 1/2 ram and cap to 1024MB
# calculate 1/4 ram and cap to 8192MB
# pick the max
half_system_memory_in_mb=`expr $system_memory_in_mb / 2`
quarter_system_memory_in_mb=`expr $half_system_memory_in_mb / 2`
if [ "$half_system_memory_in_mb" -gt "1024" ]
then
half_system_memory_in_mb="1024"
fi
if [ "$quarter_system_memory_in_mb" -gt "8192" ]
then
quarter_system_memory_in_mb="8192"
fi
if [ "$half_system_memory_in_mb" -gt "$quarter_system_memory_in_mb" ]
then
max_heap_size_in_mb="$half_system_memory_in_mb"
else
max_heap_size_in_mb="$quarter_system_memory_in_mb"
fi
MAX_HEAP_SIZE="${max_heap_size_in_mb}M"
# Young gen: min(max_sensible_per_modern_cpu_core * num_cores, 1/4 *
heap size)
max_sensible_yg_per_core_in_mb="100"
max_sensible_yg_in_mb=`expr $max_sensible_yg_per_core_in_mb "*"
$system_cpu_cores`
desired_yg_in_mb=`expr $max_heap_size_in_mb / 4`
if [ "$desired_yg_in_mb" -gt "$max_sensible_yg_in_mb" ]
then
HEAP_NEWSIZE="${max_sensible_yg_in_mb}M"
else
HEAP_NEWSIZE="${desired_yg_in_mb}M"
fi
}
```
```shell
# Dynamically calculate parameters, for reference.
Xms=$MAX_HEAP_SIZE
Xmx=$MAX_HEAP_SIZE
Xmn=$HEAP_NEWSIZE
```
```shell
# Set for `JAVA_OPT`.
JAVA_OPT="${JAVA_OPT} -server -Xms${Xms} -Xmx${Xmx} -Xmn${Xmn}"
JAVA_OPT="${JAVA_OPT} -XX:+UseConcMarkSweepGC
-XX:+UseCMSCompactAtFullCollection -XX:CMSInitiatingOccupancyFraction=70
-XX:+CMSParallelRemarkEnabled -XX:SoftRefLRUPolicyMSPerMB=0
-XX:+CMSClassUnloadingEnabled -XX:SurvivorRatio=8 -XX:-UseParNewGC"
JAVA_OPT="${JAVA_OPT} -verbose:gc -Xloggc:/dev/shm/rmq_srv_gc.log
-XX:+PrintGCDetails"
JAVA_OPT="${JAVA_OPT} -XX:-OmitStackTraceInFastThrow"
JAVA_OPT="${JAVA_OPT} -XX:-UseLargePages"
JAVA_OPT="${JAVA_OPT}
-Djava.ext.dirs=${JAVA_HOME}/jre/lib/ext:${BASE_DIR}/lib"
#JAVA_OPT="${JAVA_OPT} -Xdebug
-Xrunjdwp:transport=dt_socket,address=9555,server=y,suspend=n"
JAVA_OPT="${JAVA_OPT} ${JAVA_OPT_EXT}"
JAVA_OPT="${JAVA_OPT} -cp ${CLASSPATH}"
```
### Additional Context
_No response_
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]