dvl*_*dvl 9 jvm cassandra database-tuning cassandra-2.1
我有一个4节点集群,每个盒子上有16个核心CPU和100 GB RAM(每个机架上有2个节点).
截至目前,所有都使用Cassandra(v2.1.4)的默认JVM设置运行.使用此设置,每个节点使用13GB RAM和30%CPU.它是一个写入繁重的集群,偶尔会删除或更新.
我是否需要调整Cassandra的JVM设置以利用更多内存?我应该考虑做些什么来进行适当的设置?
Aar*_*ron 11
我是否需要调整Cassandra的JVM设置以利用更多内存?
DataStax 调优Java资源文档实际上有一些非常合理的建议:
许多Cassandra新用户都倾向于将Java堆大小调高,这会消耗大部分底层系统的RAM.在大多数情况下,由于以下原因,增加Java堆大小实际上是有害的:
- 在大多数情况下,Java能够优雅地处理8GB以上的垃圾收集的能力很快就会降低.
- 现代操作系统为经常访问的数据维护操作系统页面缓存,并且非常擅长将这些数据保存在内存中,但可以通过提升的Java堆大小来防止其工作.
如果您有超过2GB的系统内存(这是典型的),请保持Java堆的大小相对较小,以便为页面缓存提供更多内存.
由于您的计算机上有100GB的RAM,(如果您确实在"默认JVM设置"下运行),您的JVM最大堆大小应该限制在8192M.实际上,除非您遇到垃圾收集问题,否则我不会偏离它.
可以在cassandra-env.sh文件中设置Cassandra的JVM资源.如果您很好奇,请查看代码cassandra-env.sh并查找calculate_heap_sizes()方法.这应该可以让您对Cassandra如何计算默认JVM设置有所了解.
我应该考虑做些什么来进行适当的设置?
如果您正在运行OpsCenter(并且您应该运行),请为"已使用堆"和"未使用堆"添加图形.

这将允许您轻松监视群集的JVM堆使用情况.帮助我的另一件事是编写一个bash脚本,其中我基本上劫持了JVM计算cassandra-env.sh.这样我可以在新计算机上运行它,并立即发现我的MAX_HEAP_SIZE和HEAP_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
Run Code Online (Sandbox Code Playgroud)
更新20160212:
另外,请务必查看Amy Tobey的2.1 Cassandra Tuning Guide.她提供了一些有关如何使群集以最佳方式运行的重要提示.
| 归档时间: |
|
| 查看次数: |
14627 次 |
| 最近记录: |