From 9091beec4fb4b2eb833c2c6974a7d453bf43b1a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Igor=20Gali=C4=87?= Date: Wed, 4 May 2016 13:42:11 +0200 Subject: [PATCH 1/2] server: autoscale JVM heap options rationale: the jvm settings for graylog server can be automatically scaled based on the available memory. We set min & max heap to memory/2, capping it at below 32G, to ensure the JVM will be able to use -XX:+UseCompressedOops (see https://www.elastic.co/guide/en/elasticsearch/guide/current/heap-sizing.html) By default, PermSize and MaxPermSize is also set to the same value. We leave the GC settings alone, since they are very sensible values for Graylog2. However, we allow to provide additional java options, such as -javaagent, or jmx options, which are useful for monitoring. While we try hard to preserve backwards compatibility in the defaults files, but this will cause restarts in *default* installations. --- manifests/server.pp | 6 ++++++ manifests/server/configure.pp | 3 +++ manifests/server/params.pp | 5 ++++- spec/classes/server_spec.rb | 18 +++++++++++++++++- templates/server.default.erb | 8 +++++++- templates/server.sysconfig.erb | 8 +++++++- 6 files changed, 44 insertions(+), 4 deletions(-) diff --git a/manifests/server.pp b/manifests/server.pp index 20eae98..39431ff 100644 --- a/manifests/server.pp +++ b/manifests/server.pp @@ -63,7 +63,10 @@ $inputbuffer_ring_size = $graylog2::server::params::inputbuffer_ring_size, $inputbuffer_wait_strategy = $graylog2::server::params::inputbuffer_wait_strategy, $is_master = $graylog2::server::params::is_master, + $max_heap = $graylog2::server::params::max_heap, + $perm_size = $graylog2::server::params::perm_size, $java_opts = $graylog2::server::params::java_opts, + $java_opts_extra = $graylog2::server::params::java_opts_extra, $lb_recognition_period_seconds = $graylog2::server::params::lb_recognition_period_seconds, $ldap_connection_timeout = $graylog2::server::params::ldap_connection_timeout, $message_journal_dir = $graylog2::server::params::message_journal_dir, @@ -206,7 +209,10 @@ inputbuffer_ring_size => $inputbuffer_ring_size, inputbuffer_wait_strategy => $inputbuffer_wait_strategy, is_master => $is_master, + max_heap => $max_heap, + perm_size => $perm_size, java_opts => $java_opts, + java_opts_extra => $java_opts_extra, lb_recognition_period_seconds => $lb_recognition_period_seconds, ldap_connection_timeout => $ldap_connection_timeout, message_journal_dir => $message_journal_dir, diff --git a/manifests/server/configure.pp b/manifests/server/configure.pp index 3f72ae3..51b555f 100644 --- a/manifests/server/configure.pp +++ b/manifests/server/configure.pp @@ -60,7 +60,10 @@ $inputbuffer_ring_size, $inputbuffer_wait_strategy, $is_master, + $max_heap, + $perm_size, $java_opts, + $java_opts_extra, $lb_recognition_period_seconds, $ldap_connection_timeout, $message_journal_dir, diff --git a/manifests/server/params.pp b/manifests/server/params.pp index 76b00f6..3d64b91 100644 --- a/manifests/server/params.pp +++ b/manifests/server/params.pp @@ -79,7 +79,10 @@ $inputbuffer_ring_size = '65536' $inputbuffer_wait_strategy = 'blocking' $is_master = true - $java_opts = '-Xms1g -Xmx1g -XX:NewRatio=1 -XX:PermSize=128m -XX:MaxPermSize=256m -server -XX:+ResizeTLAB -XX:+UseConcMarkSweepGC -XX:+CMSConcurrentMTEnabled -XX:+CMSClassUnloadingEnabled -XX:+UseParNewGC -XX:-OmitStackTraceInFastThrow' + $max_heap = clamp(1024, $::memorysize_mb / 2, 32000) + $perm_size = '256m' + $java_opts = '-server -XX:+ResizeTLAB -XX:+UseConcMarkSweepGC -XX:+CMSConcurrentMTEnabled -XX:+CMSClassUnloadingEnabled -XX:+UseParNewGC -XX:-OmitStackTraceInFastThrow' + $java_opts_extra = '' $lb_recognition_period_seconds = '3' $ldap_connection_timeout = '2000' $message_journal_dir = '/var/lib/graylog-server/journal' diff --git a/spec/classes/server_spec.rb b/spec/classes/server_spec.rb index 3741be8..1f6e941 100644 --- a/spec/classes/server_spec.rb +++ b/spec/classes/server_spec.rb @@ -20,6 +20,7 @@ let(:default_facts) do { :osfamily => dist, + :memorysize_mb => 12000, } end @@ -40,7 +41,7 @@ should contain_package('graylog-server').with_ensure('installed') } it { - should contain_file(defaults_path).with_content(/^GRAYLOG_SERVER_JAVA_OPTS="-Xms1g -Xmx1g -XX:NewRatio=1 -XX:PermSize=128m -XX:MaxPermSize=256m -server -XX:\+ResizeTLAB -XX:\+UseConcMarkSweepGC -XX:\+CMSConcurrentMTEnabled -XX:\+CMSClassUnloadingEnabled -XX:\+UseParNewGC -XX:-OmitStackTraceInFastThrow"/) + should contain_file(defaults_path).with_content(/^GRAYLOG_SERVER_JAVA_OPTS="-Xms6000 -Xmx6000 -XX:NewRatio=1 -XX:PermSize=256m -XX:MaxPermSize=256m -server -XX:\+ResizeTLAB -XX:\+UseConcMarkSweepGC -XX:\+CMSConcurrentMTEnabled -XX:\+CMSClassUnloadingEnabled -XX:\+UseParNewGC -XX:-OmitStackTraceInFastThrow"/) } end @@ -60,4 +61,19 @@ end end + context 'should allow to set Xms and Xmx through max_heap, and PermSize through perm_size' do + let(:facts) do + { + }.merge default_facts + end + let(:params) do + { + :max_heap => '3g', + :perm_size => '300m', + }.merge default_params + end + it { + should contain_file(defaults_path).with_content(/^GRAYLOG_SERVER_JAVA_OPTS="-Xms3g -Xmx3g -XX:NewRatio=1 -XX:PermSize=300m -XX:MaxPermSize=300m -server -XX:\+ResizeTLAB -XX:\+UseConcMarkSweepGC -XX:\+CMSConcurrentMTEnabled -XX:\+CMSClassUnloadingEnabled -XX:\+UseParNewGC -XX:-OmitStackTraceInFastThrow"/) + } + end end diff --git a/templates/server.default.erb b/templates/server.default.erb index 7727b8f..7459192 100644 --- a/templates/server.default.erb +++ b/templates/server.default.erb @@ -3,8 +3,14 @@ # Path to the java executable. JAVA=/usr/bin/java +<%- if @java_opts.include? '-Xms' -%> # Default Java options for heap and garbage collection. -GRAYLOG_SERVER_JAVA_OPTS="<%= @java_opts %>" +GRAYLOG_SERVER_JAVA_OPTS="<%= @java_opts %><%= @java_opts_extra %>" +<%- else -%> +# Default Java options for heap and garbage collection. +<%- jvm_memory="-Xms#{@max_heap} -Xmx#{@max_heap} -XX:NewRatio=1 -XX:PermSize=#{@perm_size} -XX:MaxPermSize=#{@perm_size}" -%> +GRAYLOG_SERVER_JAVA_OPTS="<%= jvm_memory %> <%= @java_opts %><%= @java_opts_extra %>" +<%- end -%> # Pass some extra args to graylog-server. (i.e. "-d" to enable debug mode) GRAYLOG_SERVER_ARGS="<%= @extra_args %>" diff --git a/templates/server.sysconfig.erb b/templates/server.sysconfig.erb index b912ab7..431be1c 100644 --- a/templates/server.sysconfig.erb +++ b/templates/server.sysconfig.erb @@ -3,8 +3,14 @@ # Path to the java executable. JAVA=/usr/bin/java +<%- if @java_opts.include? '-Xms' -%> # Might be used to adjust the Java heap size. (i.e. "-Xms1024m -Xmx2048m") -GRAYLOG_SERVER_JAVA_OPTS="<%= @java_opts %>" +GRAYLOG_SERVER_JAVA_OPTS="<%= @java_opts %><%= @java_opts_extra %>" +<%- else -%> +# Might be used to adjust the Java heap size. (i.e. "-Xms1024m -Xmx2048m") +<%- jvm_memory="-Xms#{@max_heap} -Xmx#{@max_heap} -XX:NewRatio=1 -XX:PermSize=#{@perm_size} -XX:MaxPermSize=#{@perm_size}" -%> +GRAYLOG_SERVER_JAVA_OPTS="<%= jvm_memory %> <%= @java_opts %><%= @java_opts_extra %>" +<%- end -%> # Pass some extra args to graylog-server. (i.e. "-d" to enable debug mode) GRAYLOG_SERVER_ARGS="<%= @extra_args %>" From 51835461bab3825cffe13d875ff59900c0cca542 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Igor=20Gali=C4=87?= Date: Mon, 9 May 2016 20:15:22 +0200 Subject: [PATCH 2/2] autoscale perm_size PermSize is now set to 1/20 of the Heap size, with a lower bound of 256m and a max of 1G. we also clarify that m here, since by efault memory options passed to the jvm are kB --- manifests/server.pp | 4 ++-- manifests/server/params.pp | 2 +- spec/classes/server_spec.rb | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/manifests/server.pp b/manifests/server.pp index 39431ff..3db3e0a 100644 --- a/manifests/server.pp +++ b/manifests/server.pp @@ -63,8 +63,8 @@ $inputbuffer_ring_size = $graylog2::server::params::inputbuffer_ring_size, $inputbuffer_wait_strategy = $graylog2::server::params::inputbuffer_wait_strategy, $is_master = $graylog2::server::params::is_master, - $max_heap = $graylog2::server::params::max_heap, - $perm_size = $graylog2::server::params::perm_size, + $max_heap = "${graylog2::server::params::max_heap}m", + $perm_size = "${graylog2::server::params::perm_size}m", $java_opts = $graylog2::server::params::java_opts, $java_opts_extra = $graylog2::server::params::java_opts_extra, $lb_recognition_period_seconds = $graylog2::server::params::lb_recognition_period_seconds, diff --git a/manifests/server/params.pp b/manifests/server/params.pp index 3d64b91..42d56cc 100644 --- a/manifests/server/params.pp +++ b/manifests/server/params.pp @@ -80,7 +80,7 @@ $inputbuffer_wait_strategy = 'blocking' $is_master = true $max_heap = clamp(1024, $::memorysize_mb / 2, 32000) - $perm_size = '256m' + $perm_size = clamp(256, $max_heap / 20, 1024) $java_opts = '-server -XX:+ResizeTLAB -XX:+UseConcMarkSweepGC -XX:+CMSConcurrentMTEnabled -XX:+CMSClassUnloadingEnabled -XX:+UseParNewGC -XX:-OmitStackTraceInFastThrow' $java_opts_extra = '' $lb_recognition_period_seconds = '3' diff --git a/spec/classes/server_spec.rb b/spec/classes/server_spec.rb index 1f6e941..9c285ff 100644 --- a/spec/classes/server_spec.rb +++ b/spec/classes/server_spec.rb @@ -41,7 +41,7 @@ should contain_package('graylog-server').with_ensure('installed') } it { - should contain_file(defaults_path).with_content(/^GRAYLOG_SERVER_JAVA_OPTS="-Xms6000 -Xmx6000 -XX:NewRatio=1 -XX:PermSize=256m -XX:MaxPermSize=256m -server -XX:\+ResizeTLAB -XX:\+UseConcMarkSweepGC -XX:\+CMSConcurrentMTEnabled -XX:\+CMSClassUnloadingEnabled -XX:\+UseParNewGC -XX:-OmitStackTraceInFastThrow"/) + should contain_file(defaults_path).with_content(/^GRAYLOG_SERVER_JAVA_OPTS="-Xms6000m -Xmx6000m -XX:NewRatio=1 -XX:PermSize=300m -XX:MaxPermSize=300m -server -XX:\+ResizeTLAB -XX:\+UseConcMarkSweepGC -XX:\+CMSConcurrentMTEnabled -XX:\+CMSClassUnloadingEnabled -XX:\+UseParNewGC -XX:-OmitStackTraceInFastThrow"/) } end