【问题标题】:Optimal JVM settings for CassandraCassandra 的最佳 JVM 设置
【发布时间】:2015-07-24 07:48:01
【问题描述】:

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

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

我是否需要调整 Cassandra 的 JVM 设置以利用更多内存?为了进行适当的设置,我应该查看哪些内容?

【问题讨论】:

    标签: cassandra jvm database-tuning cassandra-2.1


    【解决方案1】:

    我是否需要调整 Cassandra 的 JVM 设置以利用更多内存?

    DataStax Tuning Java Resources 文档实际上对此有一些非常合理的建议:

    许多刚接触 Cassandra 的用户也想调高 Java 堆大小 高,这会消耗大部分底层系统的 RAM。在 大多数情况下,增加 Java 堆大小实际上对 这些原因:

    • 在大多数情况下,Java 能够优雅地处理垃圾 8GB 以上的收集迅速减少。
    • 现代操作系统 为经常访问的数据维护操作系统页面缓存,并且非常 擅长将这些数据保存在内存中,但可以防止这样做 它的工作是通过提高 Java 堆大小来完成的。

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

    由于您的机器上有 100GB 的 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 将会是什么:

    #!/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。她有一些关于如何让您的集群以最佳方式运行的很棒的技巧。

    【讨论】:

      【解决方案2】:

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-03-01
        • 2015-03-18
        • 1970-01-01
        • 2016-04-17
        • 1970-01-01
        • 1970-01-01
        • 2011-05-02
        • 1970-01-01
        相关资源
        最近更新 更多