Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Additional JVM tunable options #263

Merged
merged 5 commits into from
Jan 7, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
19 changes: 17 additions & 2 deletions README.md
Expand Up @@ -164,6 +164,8 @@ Attributes for fine tuning CMS/ParNew, the GC algorithm recommended for Cassandr
* `node[:cassandra][:gc_max_tenuring_threshold]` -XX:MaxTenuringThreshold JVM parameter (default: 1)
* `node[:cassandra][:gc_cms_initiating_occupancy_fraction]` -XX:CMSInitiatingOccupancyFraction JVM parameter (default: 75)

Descriptions for these JVM parameters can be found [here](http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html#PerformanceTuning) and [here](http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html#cms.starting_a_cycle).

Attributes for enabling G1 GC.

* `node[:cassandra][:jvm][:g1]` (default: false)
Expand All @@ -172,8 +174,21 @@ Attributes for enabling GC detail/logging.

* `node[:cassandra][:jvm][:gcdetail]` (default: false)

Descriptions for these JVM parameters can be found [here](http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html#PerformanceTuning) and [here](http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html#cms.starting_a_cycle).

Attributes for fine tuning the G1 GC algorithm:

* `node[:cassandra][:jvm][:g1_rset_updating_pause_time_percent]` (default: 10)
* `node[:cassandra][:jvm][:g1_heap_region_size]` -XX:G1HeapRegionSize (default: 0)
* `node[:cassandra][:jvm][:max_gc_pause_millis]` -XX:MaxGCPauseMillis (default: 200)
* `node[:cassandra][:jvm][:heap_occupancy_threshold]` -XX:InitiatingHeapOccupancyPercent (default: 45)
* `node[:cassandra][:jvm][:max_parallel_gc_threads]` This will set -XX:ParallelGCThreads to the number of cores on the machine (default: false)
* `node[:cassandra][:jvm][:max_conc_gc_threads]` This will set -XX:ConcGCThreads to the number of cores on the machine (default: false)
* `node[:cassandra][:jvm][:parallel_ref_proc]` -XX:ParallelRefProcEnabled (default: false)
* `node[:cassandra][:jvm][:always_pre_touch]` -XX:AlwaysPreTouch (default: false)
* `node[:cassandra][:jvm][:use_biased_locking]` -XX:UseBiasedLocking (default: true)
* `node[:cassandra][:jvm][:use_tlab]` -XX:UseTLAB (default: true)
* `node[:cassandra][:jvm][:resize_tlab]` -XX:ResizeTLAB (default: true)

Oracle JVM 8 tuning parameters: [here](https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/)

### Seed Discovery Attributes

Expand Down
12 changes: 12 additions & 0 deletions attributes/default.rb
Expand Up @@ -103,6 +103,18 @@
default['cassandra']['jvm']['g1'] = false
default['cassandra']['jvm']['gcdetail'] = false

default['cassandra']['jvm']['max_gc_pause_millis'] = 200
default['cassandra']['jvm']['heap_occupancy_threshold'] = 45
default['cassandra']['jvm']['parallel_ref_proc'] = false
default['cassandra']['jvm']['max_parallel_gc_threads'] = false
default['cassandra']['jvm']['max_conc_gc_threads'] = false
default['cassandra']['jvm']['g1_rset_updating_pause_time_percent'] = 10
default['cassandra']['jvm']['g1_heap_region_size'] = 0
default['cassandra']['jvm']['always_pre_touch'] = false
default['cassandra']['jvm']['use_biased_locking'] = true
default['cassandra']['jvm']['use_tlab'] = true
default['cassandra']['jvm']['resize_tlab'] = true

default['cassandra']['gc_survivor_ratio'] = 8
default['cassandra']['gc_max_tenuring_threshold'] = 1
default['cassandra']['gc_cms_initiating_occupancy_fraction'] = 75
Expand Down
2 changes: 2 additions & 0 deletions spec/config_spec.rb
Expand Up @@ -13,6 +13,7 @@
node.set['cassandra']['setup_priam'] = true
node.set['cassandra']['setup_jna'] = true
node.set['cassandra']['notify_restart'] = true
node.set['cassandra']['jvm']['g1'] = true

# provide a testable hash to verify template generation
node.set['cassandra']['metrics_reporter']['config'] = { 'test1' => 'value1', 'test2' => %w(value2 value3) }
Expand Down Expand Up @@ -100,6 +101,7 @@
node.set['cassandra']['setup_priam'] = true
node.set['cassandra']['setup_jna'] = true
node.set['cassandra']['notify_restart'] = true
node.set['cassandra']['jvm']['g1'] = true

# provide a testable hash to verify template generation
node.set['cassandra']['metrics_reporter']['config'] = { 'test1' => 'value1', 'test2' => %w(value2 value3) }
Expand Down
27 changes: 21 additions & 6 deletions spec/rendered_templates/cassandra-env.sh
Expand Up @@ -230,17 +230,32 @@ fi
JVM_OPTS="$JVM_OPTS -XX:StringTableSize=1000003"

# GC tuning options
# -Xmx
JVM_OPTS="$JVM_OPTS -XX:+UseParNewGC"
JVM_OPTS="$JVM_OPTS -XX:+UseConcMarkSweepGC"
JVM_OPTS="$JVM_OPTS -XX:+CMSParallelRemarkEnabled"
JVM_OPTS="$JVM_OPTS -XX:+UseG1GC"
JVM_OPTS="$JVM_OPTS -XX:SurvivorRatio=8"
JVM_OPTS="$JVM_OPTS -XX:MaxTenuringThreshold=1"
JVM_OPTS="$JVM_OPTS -XX:CMSInitiatingOccupancyFraction=75"
JVM_OPTS="$JVM_OPTS -XX:+UseCMSInitiatingOccupancyOnly"
JVM_OPTS="$JVM_OPTS -XX:+UseTLAB"


JVM_OPTS="$JVM_OPTS -XX:G1RSetUpdatingPauseTimePercent=10"

JVM_OPTS="$JVM_OPTS -XX:G1HeapRegionSize=0"

JVM_OPTS="$JVM_OPTS -XX:MaxGCPauseMillis=200"

JVM_OPTS="$JVM_OPTS -XX:InitiatingHeapOccupancyPercent=45"

JVM_OPTS="$JVM_OPTS -XX:-ParallelRefProcEnabled"



JVM_OPTS="$JVM_OPTS -XX:-AlwaysPreTouch"

JVM_OPTS="$JVM_OPTS -XX:+UseBiasedLocking"

JVM_OPTS="$JVM_OPTS -XX:+UseTLAB"

JVM_OPTS="$JVM_OPTS -XX:+ResizeTLAB"

# note: bash evals '1.7.x' as > '1.7' so this is really a >= 1.7 jvm check
JVM_VERSION_SHORT=$(printf "%.3s" $JVM_VERSION)
if [ "$JVM_VERSION_SHORT" = "1.7" ] && [ "$JVM_ARCH" = "64-Bit" ] ; then
Expand Down
55 changes: 54 additions & 1 deletion templates/default/cassandra-env.sh.erb
Expand Up @@ -263,7 +263,6 @@ fi
JVM_OPTS="$JVM_OPTS -XX:StringTableSize=1000003"

# GC tuning options
# -Xmx
<% if node['cassandra']['jvm'] && node['cassandra']['jvm']['g1'] -%>
JVM_OPTS="$JVM_OPTS -XX:+UseG1GC"
JVM_OPTS="$JVM_OPTS -XX:SurvivorRatio=<%= node['cassandra']['gc_survivor_ratio'] %>"
Expand All @@ -281,6 +280,60 @@ JVM_OPTS="$JVM_OPTS -XX:+UseTLAB"
<% end -%>


<% if node['cassandra']['jvm']['g1'] && node['cassandra']['jvm']['g1_rset_updating_pause_time_percent'] -%>
JVM_OPTS="$JVM_OPTS -XX:G1RSetUpdatingPauseTimePercent=<%= node['cassandra']['jvm']['g1_rset_updating_pause_time_percent'] %>"
<% end -%>

<% if node['cassandra']['jvm']['g1'] && node['cassandra']['jvm']['g1_heap_region_size'] -%>
JVM_OPTS="$JVM_OPTS -XX:G1HeapRegionSize=<%= node['cassandra']['jvm']['g1_heap_region_size'] %>"
<% end -%>

<% if node['cassandra']['jvm']['max_gc_pause_millis'] -%>
JVM_OPTS="$JVM_OPTS -XX:MaxGCPauseMillis=<%= node['cassandra']['jvm']['max_gc_pause_millis'] %>"
<% end -%>

<% if node['cassandra']['jvm']['heap_occupancy_threshold'] -%>
JVM_OPTS="$JVM_OPTS -XX:InitiatingHeapOccupancyPercent=<%= node['cassandra']['jvm']['heap_occupancy_threshold'] %>"
<% end -%>

<% if node['cassandra']['jvm']['parallel_ref_proc'] -%>
JVM_OPTS="$JVM_OPTS -XX:+ParallelRefProcEnabled"
<% else %>
JVM_OPTS="$JVM_OPTS -XX:-ParallelRefProcEnabled"
<% end -%>

<% if node['cassandra']['jvm']['max_parallel_gc_threads'] -%>
JVM_OPTS="$JVM_OPTS -XX:ParallelGCThreads=$system_cpu_cores"
<% end -%>

<% if node['cassandra']['jvm']['max_conc_gc_threads'] -%>
JVM_OPTS="$JVM_OPTS -XX:ConcGCThreads=$system_cpu_cores"
<% end -%>

<% if node['cassandra']['jvm']['always_pre_touch'] -%>
JVM_OPTS="$JVM_OPTS -XX:+AlwaysPreTouch"
<% else %>
JVM_OPTS="$JVM_OPTS -XX:-AlwaysPreTouch"
<% end -%>

<% if node['cassandra']['jvm']['use_biased_locking'] -%>
JVM_OPTS="$JVM_OPTS -XX:+UseBiasedLocking"
<% else %>
JVM_OPTS="$JVM_OPTS -XX:-UseBiasedLocking"
<% end -%>

<% if node['cassandra']['jvm']['use_tlab'] -%>
JVM_OPTS="$JVM_OPTS -XX:+UseTLAB"
<% else %>
JVM_OPTS="$JVM_OPTS -XX:-UseTLAB"
<% end -%>

<% if node['cassandra']['jvm']['resize_tlab'] -%>
JVM_OPTS="$JVM_OPTS -XX:+ResizeTLAB"
<% else %>
JVM_OPTS="$JVM_OPTS -XX:-ResizeTLAB"
<% end -%>

# note: bash evals '1.7.x' as > '1.7' so this is really a >= 1.7 jvm check
JVM_VERSION_SHORT=$(printf "%.3s" $JVM_VERSION)
if [ "$JVM_VERSION_SHORT" = "1.7" ] && [ "$JVM_ARCH" = "64-Bit" ] ; then
Expand Down