Cassandra的最佳JVM设置
我有一个4节点集群,每个机箱上有16核CPU和100 GB RAM(每个机架上有2个节点) 到目前为止,所有这些都使用Cassandra(v2.1.4)的默认JVM设置运行。通过此设置,每个节点使用13GB RAM和30%的CPU。它是一个写操作繁重的集群,偶尔会进行删除或更新 我是否需要调整Cassandra的JVM设置以利用更多内存?为了进行适当的设置,我应该查看哪些内容 我是否需要调整Cassandra的JVM设置以利用更多内存 DataStax文档实际上在这方面有一些非常合理的建议: 许多刚接触Cassandra的用户也很想提高Java堆的大小 高,这消耗了基础系统的大部分RAM。在里面 在大多数情况下,增加Java堆大小实际上是有害的 这些理由:Cassandra的最佳JVM设置,cassandra,jvm,database-tuning,cassandra-2.1,Cassandra,Jvm,Database Tuning,Cassandra 2.1,我有一个4节点集群,每个机箱上有16核CPU和100 GB RAM(每个机架上有2个节点) 到目前为止,所有这些都使用Cassandra(v2.1.4)的默认JVM设置运行。通过此设置,每个节点使用13GB RAM和30%的CPU。它是一个写操作繁重的集群,偶尔会进行删除或更新 我是否需要调整Cassandra的JVM设置以利用更多内存?为了进行适当的设置,我应该查看哪些内容 我是否需要调整Cassandra的JVM设置以利用更多内存 DataStax文档实际上在这方面有一些非常合理的建议: 许
- 在大多数情况下,Java能够优雅地处理垃圾 超过8GB的数据集将迅速减少李>
- 现代操作系统 为频繁访问的数据维护操作系统页面缓存,并且 善于将这些数据保存在内存中,但可以防止这样做 它的工作是通过提升Java堆大小来完成的
Cassandra env.sh
文件中设置。如果您感到好奇,请查看cassandra env.sh
的代码,并查找calculate\u heap\u size()
方法。这将让您了解Cassandra如何计算默认JVM设置
为了进行适当的设置,我应该查看哪些内容
如果您正在运行(并且应该运行),请为“Heap Used”和“Non Heap Used”添加一个图表
这将允许您轻松监视集群的JVM堆使用情况。另一件对我有帮助的事情是编写一个bash脚本,在这个脚本中,我基本上劫持了来自cassandra env.sh
的JVM计算。这样,我就可以在新机器上运行它,并立即知道我的MAX\u HEAP\u SIZE
和HEAP\u NEWSIZE
将是什么:
#!/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:
另外,一定要退房。她有一些关于如何使集群最佳运行的好建议。系统cpu核心设置不正确。编辑了要执行的正确的一个
#!/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