Cassandra的最佳JVM设置

10

我有一个由4个节点组成的集群,每个节点都有16核CPU和100GB RAM(每个机箱上有2个节点)。

目前,所有节点都使用Cassandra(v2.1.4)的默认JVM设置在运行。使用此设置,每个节点使用13GB RAM和30% CPU。这是一个写入较多的集群,偶尔会进行删除或更新操作。

我需要调整Cassandra的JVM设置以利用更多内存吗?我应该关注哪些方面来做出适当的设置?

2个回答

11
我需要调整Cassandra的JVM设置以利用更多内存吗?
DataStax Tuning Java Resources文档实际上对此提供了一些非常有建设性的建议:
许多新手倾向于将Java堆大小调得过高,这会消耗大部分底层系统的RAM。在大多数情况下,增加Java堆大小实际上是不利的,原因如下:
  • 在大多数情况下,Java处理超过8GB的垃圾回收的能力会迅速减弱。
  • 现代操作系统为经常访问的数据维护OS页面缓存,并且非常擅长将这些数据保留在内存中,但是Java堆大小的提高可能会阻止其正常工作。
如果您拥有超过2GB的系统内存(这是典型的),请将Java堆的大小保持相对较小,以便为页面缓存留出更多的内存。

如果您的机器配备了100GB RAM(如果您确实在使用“默认JVM设置”),则JVM的最大堆大小应该被限制在8192M。实际上,除非您遇到垃圾回收方面的问题,否则我不会偏离这个值。

Cassandra的JVM资源可以在文件中进行设置。如果您感兴趣,请查看代码,并查找方法。这应该能让您了解Cassandra如何计算默认的JVM设置。

我需要考虑哪些因素来进行适当的设置?

如果您正在运行OpsCenter(您应该这样做),请添加一个“Heap Used”和“Non Heap Used”的图表。

OpsCenter graphing Heap Used and Non Heap Used together

这将使您能够轻松监控集群的JVM堆使用情况。另一件对我有帮助的事情是编写一个bash脚本,在其中基本上劫持了中的JVM计算。这样我就可以在新机器上运行它,并立即知道我的和会是什么:
#!/bin/bash
clear
echo "This is how Cassandra will determine its default Heap and GC Generation sizes."

system_memory_in_mb=`free -m | awk '/Mem:/ {print $2}'`
half_system_memory_in_mb=`expr $system_memory_in_mb / 2`
quarter_system_memory_in_mb=`expr $half_system_memory_in_mb / 2`

echo "   memory = $system_memory_in_mb"
echo "     half = $half_system_memory_in_mb"
echo "  quarter = $quarter_system_memory_in_mb"

echo "cpu cores = "`egrep -c 'processor([[:space:]]+):.*' /proc/cpuinfo`

#cassandra-env logic duped here
#this should help you to see how much memory is being allocated
#to the JVM
    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

echo "Max heap size = " $MAX_HEAP_SIZE
echo " New gen size = " $HEAP_NEWSIZE

更新于20160212:

另外,请务必查看Amy Tobey的2.1 Cassandra调整指南。她有一些关于如何使您的集群运行得更加优化的极好的建议。


1

system_cpu_cores未正确设置。编辑正确的设置以执行。

#!/bin/bash
clear
echo "This is how Cassandra will determine its default Heap and GC Generation sizes."

system_memory_in_mb=`free -m | awk '/Mem:/ {print $2}'`
half_system_memory_in_mb=`expr $system_memory_in_mb / 2`
quarter_system_memory_in_mb=`expr $half_system_memory_in_mb / 2`
system_cpu_cores=`cat /proc/cpuinfo   | grep -i processor | wc -l`
echo "   memory = $system_memory_in_mb"
echo "     half = $half_system_memory_in_mb"
echo "  quarter = $quarter_system_memory_in_mb"

echo "cpu cores = `egrep -c 'processor([[:space:]]+):.*' /proc/cpuinfo`"

#cassandra-env logic duped here
#this should help you to see how much memory is being allocated
#to the JVM
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

echo "Max heap size = " $MAX_HEAP_SIZE
echo " New gen size = " $HEAP_NEWSIZE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接