Blame view

decision/templates/cassandra39/cassandra-env.sh 11.6 KB
8146dcf82   Thanasis Naskos   first commit
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
  # Licensed to the Apache Software Foundation (ASF) under one
  # or more contributor license agreements.  See the NOTICE file
  # distributed with this work for additional information
  # regarding copyright ownership.  The ASF licenses this file
  # to you under the Apache License, Version 2.0 (the
  # "License"); you may not use this file except in compliance
  # with the License.  You may obtain a copy of the License at
  #
  #     http://www.apache.org/licenses/LICENSE-2.0
  #
  # Unless required by applicable law or agreed to in writing, software
  # distributed under the License is distributed on an "AS IS" BASIS,
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  # See the License for the specific language governing permissions and
  # limitations under the License.
  
  calculate_heap_sizes()
  {
      case "`uname`" in
          Linux)
              system_memory_in_mb=`free -m | awk '/:/ {print $2;exit}'`
              system_cpu_cores=`egrep -c 'processor([[:space:]]+):.*' /proc/cpuinfo`
          ;;
          FreeBSD)
              system_memory_in_bytes=`sysctl hw.physmem | awk '{print $2}'`
              system_memory_in_mb=`expr $system_memory_in_bytes / 1024 / 1024`
              system_cpu_cores=`sysctl hw.ncpu | awk '{print $2}'`
          ;;
          SunOS)
              system_memory_in_mb=`prtconf | awk '/Memory size:/ {print $3}'`
              system_cpu_cores=`psrinfo | wc -l`
          ;;
          Darwin)
              system_memory_in_bytes=`sysctl hw.memsize | awk '{print $2}'`
              system_memory_in_mb=`expr $system_memory_in_bytes / 1024 / 1024`
              system_cpu_cores=`sysctl hw.ncpu | awk '{print $2}'`
          ;;
          *)
              # assume reasonable defaults for e.g. a modern desktop or
              # cheap server
              system_memory_in_mb="2048"
              system_cpu_cores="2"
          ;;
      esac
  
      # some systems like the raspberry pi don't report cores, use at least 1
      if [ "$system_cpu_cores" -lt "1" ]
      then
          system_cpu_cores="1"
      fi
  
      # set max heap size based on the following
      # max(min(1/2 ram, 1024MB), min(1/4 ram, 8GB))
      # calculate 1/2 ram and cap to 1024MB
      # calculate 1/4 ram and cap to 8192MB
      # pick the max
      half_system_memory_in_mb=`expr $system_memory_in_mb / 2`
      quarter_system_memory_in_mb=`expr $half_system_memory_in_mb / 2`
      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
  }
  
  # Determine the sort of JVM we'll be running on.
  java_ver_output=`"${JAVA:-java}" -version 2>&1`
  jvmver=`echo "$java_ver_output" | grep '[openjdk|java] version' | awk -F'"' 'NR==1 {print $2}' | cut -d\- -f1`
  JVM_VERSION=${jvmver%_*}
  JVM_PATCH_VERSION=${jvmver#*_}
  
  if [ "$JVM_VERSION" \< "1.8" ] ; then
      echo "Cassandra 3.0 and later require Java 8u40 or later."
      exit 1;
  fi
  
  if [ "$JVM_VERSION" \< "1.8" ] && [ "$JVM_PATCH_VERSION" -lt 40 ] ; then
      echo "Cassandra 3.0 and later require Java 8u40 or later."
      exit 1;
  fi
  
  jvm=`echo "$java_ver_output" | grep -A 1 'java version' | awk 'NR==2 {print $1}'`
  case "$jvm" in
      OpenJDK)
          JVM_VENDOR=OpenJDK
          # this will be "64-Bit" or "32-Bit"
          JVM_ARCH=`echo "$java_ver_output" | awk 'NR==3 {print $2}'`
          ;;
      "Java(TM)")
          JVM_VENDOR=Oracle
          # this will be "64-Bit" or "32-Bit"
          JVM_ARCH=`echo "$java_ver_output" | awk 'NR==3 {print $3}'`
          ;;
      *)
          # Help fill in other JVM values
          JVM_VENDOR=other
          JVM_ARCH=unknown
          ;;
  esac
  
  #GC log path has to be defined here because it needs to access CASSANDRA_HOME
  JVM_OPTS="$JVM_OPTS -Xloggc:${CASSANDRA_HOME}/logs/gc.log"
  
  # Here we create the arguments that will get passed to the jvm when
  # starting cassandra.
  
  # Read user-defined JVM options from jvm.options file
  JVM_OPTS_FILE=$CASSANDRA_CONF/jvm.options
  for opt in `grep "^-" $JVM_OPTS_FILE`
  do
    JVM_OPTS="$JVM_OPTS $opt"
  done
  
  # Check what parameters were defined on jvm.options file to avoid conflicts
  echo $JVM_OPTS | grep -q Xmn
  DEFINED_XMN=$?
  echo $JVM_OPTS | grep -q Xmx
  DEFINED_XMX=$?
  echo $JVM_OPTS | grep -q Xms
  DEFINED_XMS=$?
  echo $JVM_OPTS | grep -q UseConcMarkSweepGC
  USING_CMS=$?
  echo $JVM_OPTS | grep -q UseG1GC
  USING_G1=$?
  
  # Override these to set the amount of memory to allocate to the JVM at
  # start-up. For production use you may wish to adjust this for your
  # environment. MAX_HEAP_SIZE is the total amount of memory dedicated
  # to the Java heap. HEAP_NEWSIZE refers to the size of the young
  # generation. Both MAX_HEAP_SIZE and HEAP_NEWSIZE should be either set
  # or not (if you set one, set the other).
  #
  # The main trade-off for the young generation is that the larger it
  # is, the longer GC pause times will be. The shorter it is, the more
  # expensive GC will be (usually).
  #
  # The example HEAP_NEWSIZE assumes a modern 8-core+ machine for decent pause
  # times. If in doubt, and if you do not particularly want to tweak, go with
  # 100 MB per physical CPU core.
  
  #MAX_HEAP_SIZE="6G"
  #HEAP_NEWSIZE="200M"
  
  # Set this to control the amount of arenas per-thread in glibc
  #export MALLOC_ARENA_MAX=4
  
  # only calculate the size if it's not set manually
  if [ "x$MAX_HEAP_SIZE" = "x" ] && [ "x$HEAP_NEWSIZE" = "x" -o $USING_G1 -eq 0 ]; then
      calculate_heap_sizes
  elif [ "x$MAX_HEAP_SIZE" = "x" ] ||  [ "x$HEAP_NEWSIZE" = "x" -a $USING_G1 -ne 0 ]; then
      echo "please set or unset MAX_HEAP_SIZE and HEAP_NEWSIZE in pairs when using CMS GC (see cassandra-env.sh)"
      exit 1
  fi
  
  if [ "x$MALLOC_ARENA_MAX" = "x" ] ; then
      export MALLOC_ARENA_MAX=4
  fi
  
  # We only set -Xms and -Xmx if they were not defined on jvm.options file
  # If defined, both Xmx and Xms should be defined together.
  if [ $DEFINED_XMX -ne 0 ] && [ $DEFINED_XMS -ne 0 ]; then
       JVM_OPTS="$JVM_OPTS -Xms${MAX_HEAP_SIZE}"
       JVM_OPTS="$JVM_OPTS -Xmx${MAX_HEAP_SIZE}"
  elif [ $DEFINED_XMX -ne 0 ] || [ $DEFINED_XMS -ne 0 ]; then
       echo "Please set or unset -Xmx and -Xms flags in pairs on jvm.options file."
       exit 1
  fi
  
  # We only set -Xmn flag if it was not defined in jvm.options file
  # and if the CMS GC is being used
  # If defined, both Xmn and Xmx should be defined together.
  if [ $DEFINED_XMN -eq 0 ] && [ $DEFINED_XMX -ne 0 ]; then
      echo "Please set or unset -Xmx and -Xmn flags in pairs on jvm.options file."
      exit 1
  elif [ $DEFINED_XMN -ne 0 ] && [ $USING_CMS -eq 0 ]; then
      JVM_OPTS="$JVM_OPTS -Xmn${HEAP_NEWSIZE}"
  fi
  
  if [ "$JVM_ARCH" = "64-Bit" ] && [ $USING_CMS -eq 0 ]; then
      JVM_OPTS="$JVM_OPTS -XX:+UseCondCardMark"
  fi
  
  # provides hints to the JIT compiler
  JVM_OPTS="$JVM_OPTS -XX:CompileCommandFile=$CASSANDRA_CONF/hotspot_compiler"
  
  # add the jamm javaagent
  JVM_OPTS="$JVM_OPTS -javaagent:$CASSANDRA_HOME/lib/jamm-0.3.0.jar"
  
  # set jvm HeapDumpPath with CASSANDRA_HEAPDUMP_DIR
  if [ "x$CASSANDRA_HEAPDUMP_DIR" != "x" ]; then
      JVM_OPTS="$JVM_OPTS -XX:HeapDumpPath=$CASSANDRA_HEAPDUMP_DIR/cassandra-`date +%s`-pid$$.hprof"
  fi
  
  # jmx: metrics and administration interface
  #
  # add this if you're having trouble connecting:
  # JVM_OPTS="$JVM_OPTS -Djava.rmi.server.hostname=<public name>"
  #
  # see
  # https://blogs.oracle.com/jmxetc/entry/troubleshooting_connection_problems_in_jconsole
  # for more on configuring JMX through firewalls, etc. (Short version:
  # get it working with no firewall first.)
  #
  # Cassandra ships with JMX accessible *only* from localhost.  
  # To enable remote JMX connections, uncomment lines below
  # with authentication and/or ssl enabled. See https://wiki.apache.org/cassandra/JmxSecurity 
  #
  if [ "x$LOCAL_JMX" = "x" ]; then
      LOCAL_JMX=yes
  fi
  
  # Specifies the default port over which Cassandra will be available for
  # JMX connections.
  # For security reasons, you should not expose this port to the internet.  Firewall it if needed.
  JMX_PORT="7199"
  
  if [ "$LOCAL_JMX" = "yes" ]; then
    JVM_OPTS="$JVM_OPTS -Dcassandra.jmx.local.port=$JMX_PORT"
    JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.authenticate=false"
  else
    JVM_OPTS="$JVM_OPTS -Dcassandra.jmx.remote.port=$JMX_PORT"
    # if ssl is enabled the same port cannot be used for both jmx and rmi so either
    # pick another value for this property or comment out to use a random port (though see CASSANDRA-7087 for origins)
    JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.rmi.port=$JMX_PORT"
  
    # turn on JMX authentication. See below for further options
    JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.authenticate=true"
  
    # jmx ssl options
    #JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.ssl=true"
    #JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.ssl.need.client.auth=true"
    #JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.ssl.enabled.protocols=<enabled-protocols>"
    #JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.ssl.enabled.cipher.suites=<enabled-cipher-suites>"
    #JVM_OPTS="$JVM_OPTS -Djavax.net.ssl.keyStore=/path/to/keystore"
    #JVM_OPTS="$JVM_OPTS -Djavax.net.ssl.keyStorePassword=<keystore-password>"
    #JVM_OPTS="$JVM_OPTS -Djavax.net.ssl.trustStore=/path/to/truststore"
    #JVM_OPTS="$JVM_OPTS -Djavax.net.ssl.trustStorePassword=<truststore-password>"
  fi
  
  # jmx authentication and authorization options. By default, auth is only
  # activated for remote connections but they can also be enabled for local only JMX
  ## Basic file based authn & authz
  JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.password.file=/etc/cassandra/jmxremote.password"
  #JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.access.file=/etc/cassandra/jmxremote.access"
  ## Custom auth settings which can be used as alternatives to JMX's out of the box auth utilities.
  ## JAAS login modules can be used for authentication by uncommenting these two properties.
  ## Cassandra ships with a LoginModule implementation - org.apache.cassandra.auth.CassandraLoginModule -
  ## which delegates to the IAuthenticator configured in cassandra.yaml. See the sample JAAS configuration
  ## file cassandra-jaas.config
  #JVM_OPTS="$JVM_OPTS -Dcassandra.jmx.remote.login.config=CassandraLogin"
  #JVM_OPTS="$JVM_OPTS -Djava.security.auth.login.config=$CASSANDRA_HOME/conf/cassandra-jaas.config"
  
  ## Cassandra also ships with a helper for delegating JMX authz calls to the configured IAuthorizer,
  ## uncomment this to use it. Requires one of the two authentication options to be enabled
  #JVM_OPTS="$JVM_OPTS -Dcassandra.jmx.authorizer=org.apache.cassandra.auth.jmx.AuthorizationProxy"
  
  # To use mx4j, an HTML interface for JMX, add mx4j-tools.jar to the lib/
  # directory.
  # See http://wiki.apache.org/cassandra/Operations#Monitoring_with_MX4J
  # By default mx4j listens on 0.0.0.0:8081. Uncomment the following lines
  # to control its listen address and port.
  #MX4J_ADDRESS="-Dmx4jaddress=127.0.0.1"
  #MX4J_PORT="-Dmx4jport=8081"
  
  # Cassandra uses SIGAR to capture OS metrics CASSANDRA-7838
  # for SIGAR we have to set the java.library.path
  # to the location of the native libraries.
  JVM_OPTS="$JVM_OPTS -Djava.library.path=$CASSANDRA_HOME/lib/sigar-bin"
  
  JVM_OPTS="$JVM_OPTS $MX4J_ADDRESS"
  JVM_OPTS="$JVM_OPTS $MX4J_PORT"
  JVM_OPTS="$JVM_OPTS $JVM_EXTRA_OPTS"