Author: jbellis
Date: Wed Aug 18 20:02:21 2010
New Revision: 986896

URL: http://svn.apache.org/viewvc?rev=986896&view=rev
Log:
use mlockall via JNA, if present, to prevent Linux from swapping out parts of 
the JVM (CASSANDRA-1214)

Modified:
    cassandra/branches/cassandra-0.6/CHANGES.txt
    cassandra/branches/cassandra-0.6/bin/cassandra.in.sh
    
cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/thrift/CassandraDaemon.java
    
cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/utils/FBUtilities.java

Modified: cassandra/branches/cassandra-0.6/CHANGES.txt
URL: 
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.6/CHANGES.txt?rev=986896&r1=986895&r2=986896&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.6/CHANGES.txt (original)
+++ cassandra/branches/cassandra-0.6/CHANGES.txt Wed Aug 18 20:02:21 2010
@@ -15,6 +15,8 @@
    so slow reads/writes don't block gossip processing (CASSANDRA-1358)
  * faster UUIDType, LongType comparisons (CASSANDRA-1386, 1393)
  * add jmx port configuration to Debian package (CASSANDRA-1202)
+ * use mlockall via JNA, if present, to prevent Linux from swapping
+   out parts of the JVM (CASSANDRA-1214)
 
 
 0.6.4

Modified: cassandra/branches/cassandra-0.6/bin/cassandra.in.sh
URL: 
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.6/bin/cassandra.in.sh?rev=986896&r1=986895&r2=986896&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.6/bin/cassandra.in.sh (original)
+++ cassandra/branches/cassandra-0.6/bin/cassandra.in.sh Wed Aug 18 20:02:21 
2010
@@ -39,7 +39,7 @@ done
 # Arguments to pass to the JVM
 JVM_OPTS=" \
         -ea \
-        -Xms256M \
+        -Xms1G \
         -Xmx1G \
         -XX:+UseParNewGC \
         -XX:+UseConcMarkSweepGC \

Modified: 
cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/thrift/CassandraDaemon.java
URL: 
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/thrift/CassandraDaemon.java?rev=986896&r1=986895&r2=986896&view=diff
==============================================================================
--- 
cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/thrift/CassandraDaemon.java
 (original)
+++ 
cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/thrift/CassandraDaemon.java
 Wed Aug 18 20:02:21 2010
@@ -42,6 +42,7 @@ import org.apache.thrift.transport.TFram
 import org.apache.thrift.TProcessorFactory;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.service.StorageService;
+import org.apache.cassandra.utils.CLibrary;
 import org.apache.cassandra.utils.FBUtilities;
 import org.apache.cassandra.db.Table;
 import org.apache.cassandra.db.CompactionManager;
@@ -62,6 +63,8 @@ public class CassandraDaemon
 
     private void setup() throws IOException, TTransportException
     {
+        FBUtilities.tryMlockall();
+        
         // log4j
         String file = System.getProperty("storage-config") + File.separator + 
"log4j.properties";
         PropertyConfigurator.configure(file);

Modified: 
cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/utils/FBUtilities.java
URL: 
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/utils/FBUtilities.java?rev=986896&r1=986895&r2=986896&view=diff
==============================================================================
--- 
cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/utils/FBUtilities.java
 (original)
+++ 
cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/utils/FBUtilities.java
 Wed Aug 18 20:02:21 2010
@@ -37,6 +37,7 @@ import org.apache.log4j.Logger;
 
 import org.apache.commons.collections.iterators.CollatingIterator;
 
+import com.sun.jna.Native;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.db.DecoratedKey;
 import org.apache.cassandra.db.marshal.AbstractType;
@@ -549,4 +550,50 @@ public class FBUtilities
             throw new RuntimeException(e);
         }
     }
+
+    public static void tryMlockall()
+    {
+        int errno = Integer.MIN_VALUE;
+        try
+        {
+            int result = CLibrary.mlockall(CLibrary.MCL_CURRENT);
+            if (result != 0)
+                errno = Native.getLastError();
+        }
+        catch (UnsatisfiedLinkError e)
+        {
+            // this will have already been logged by CLibrary, no need to 
repeat it
+            return;
+        }
+        catch (Exception e)
+        {
+            logger_.debug("Unable to mlockall", e);
+            // skipping mlockall doesn't seem to be a Big Deal except on 
Linux.  See CASSANDRA-1214
+            if (System.getProperty("os.name").toLowerCase().contains("linux"))
+            {
+                logger_.warn("Unable to lock JVM memory (" + e.getMessage() + 
")."
+                             + " This can result in part of the JVM being 
swapped out, especially with mmapped I/O enabled.");
+            }
+            else if 
(!System.getProperty("os.name").toLowerCase().contains("windows"))
+            {
+                logger_.info("Unable to lock JVM memory: " + e.getMessage());
+            }
+            return;
+        }
+
+        if (errno != Integer.MIN_VALUE)
+        {
+            if (errno == CLibrary.ENOMEM && 
System.getProperty("os.name").toLowerCase().contains("linux"))
+            {
+                logger_.warn("Unable to lock JVM memory (ENOMEM)."
+                             + " This can result in part of the JVM being 
swapped out, especially with mmapped I/O enabled."
+                             + " Increase RLIMIT_MEMLOCK or run Cassandra as 
root.");
+            }
+            else if 
(!System.getProperty("os.name").toLowerCase().contains("mac"))
+            {
+                // OS X allows mlockall to be called, but always returns an 
error
+                logger_.warn("Unknown mlockall error " + errno);
+            }
+        }
+    }
 }


Reply via email to