首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Cassandra的最佳JVM设置

Cassandra的最佳JVM设置
EN

Stack Overflow用户
提问于 2015-05-13 15:00:08
回答 2查看 17.3K关注 0票数 10

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

到目前为止,所有这些都是使用默认的JVM设置Cassandra (v2.1.4)运行的。使用此设置时,每个节点使用13 30和30%的CPU。它是一个写入繁重的群集,偶尔会进行删除或更新。

我需要调优Cassandra的JVM设置来使用更多的内存吗?要进行适当的设置,我应该查看哪些内容?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-13 21:13:04

我需要调优Cassandra的JVM设置来使用更多的内存吗?

关于这一点,DataStax Tuning Java Resources文档实际上有一些非常合理的建议:

Cassandra的许多新用户都倾向于将

堆大小调得太高,这会消耗底层系统的大部分内存。在大多数情况下,增加Java堆大小实际上是有害的,原因如下:

  • 在大多数情况下,Java优雅地处理8 8GB以上的垃圾收集的能力很快就会减弱。
  • 现代操作系统为频繁访问的数据维护操作系统页缓存,并且非常擅长将这些数据保存在内存中,但由于Java堆大小的增加,可能会阻止它们执行其工作。

如果您有超过2 2GB的系统内存,请保持相对较小的Java堆大小,以便为页面缓存留出更多内存。

由于您的机器上有100 at的RAM (如果您确实在“默认JVM设置”下运行),您的JVM最大堆大小应该限制在8192M。实际上,我不会偏离这一点,除非你遇到垃圾收集的问题。

Cassandra的JVM资源可以在cassandra-env.sh文件中设置。如果您很好奇,可以查看cassandra-env.sh的代码并查找calculate_heap_sizes()方法。这应该会让您深入了解Cassandra是如何计算默认JVM设置的。

要进行适当的设置,我应该查看哪些内容?

如果您正在运行OpsCenter (您应该这样做),请为“使用的堆”和“使用的非堆”添加一个图表。

这将允许您轻松地监视集群的JVM堆使用情况。另一件对我有帮助的事情是,我写了一个bash脚本,在这个脚本中,我基本上劫持了来自cassandra-env.sh的JVM计算。这样我就可以在一台新机器上运行它,并立即知道我的MAX_HEAP_SIZEHEAP_NEWSIZE将是什么:

代码语言:javascript
运行
复制
#!/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's 2.1 Cassandra Tuning Guide。她有一些关于如何让集群以最佳方式运行的很好的建议。

票数 12
EN

Stack Overflow用户

发布于 2016-09-26 04:39:15

system_cpu_cores设置不正确。编辑了要执行的正确代码。

代码语言:javascript
运行
复制
#!/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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30207779

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档