mlockall Für Alle
Manchmal kommen Ihnen mehrere Ideen gleichzeitig in den Sinn und mischen sich. Sie prallen aufeinander und in einigen Fällen verschmelzen sie miteinander und pflanzen den Samen für eine interessante neue Hybrididee. Dies ist ein Beispiel dafür, wie mir das vor drei Wochen bei Lucene Revolution passiert ist, und das Endergebnis, das dabei herauskam.
Am letzten Tag der Lucene Revolution nahm ich an Gregg Donovans Sitzung„Living with Garbage“ teil. Während sich der Großteil von Greggs Vortrag um Garbage Collection drehte, gab es zwei unabhängige Kommentare, die er während dieser Sitzung machte und die sich in meinem Kopf zu vermischen begannen.
Idee #1: mlockall
Einer von Greggs Kommentaren bezog sich darauf, dass Etsy gute Ergebnisse bei der Verwendung von nativem Code zum Aufruf von mlockall() in ihrer eingebetteten Solr-Anwendung erzielt hat.
In einer idealen Welt würde jede leistungskritische Java-Anwendung auf dedizierter Hardware mit deaktiviertem Swap laufen – denn nichts verlangsamt die Reaktionsfähigkeit einer Java-Anwendung mehr, als wenn große Teile des Heaps auf die Festplatte ausgelagert werden, wenn ein Garbage Collection-Durchlauf stattfindet. Aber nicht immer kann man seine Software in einer idealen Welt ausführen. An dieser Stelle kann die C-Funktion mlockall() nützlich sein. Sie weist das Betriebssystem an, den gesamten virtuellen Speicher, den der Prozess verwendet, im RAM zu sperren, so dass er nicht ausgelagert werden kann.
Greggs Vortrag war nicht das erste Mal, dass ich von der Verwendung von mlockall mit Java-Anwendungen gehört habe. Vor einiger Zeit hatte jemand erwähnt, dass Apache Cassandra mlockall über JNA verwendet. Damals hielt ich nicht viel davon – es schien mir eine unnötige Komplikation und ein schlechter Ersatz für die Deaktivierung von Swap auf Ihren Produktionsservern zu sein. Wahrscheinlich hätte ich auch nach Greggs Vortrag nicht viel darüber nachgedacht, außer dass es sich in meinem Kopf mit etwas anderem vermischte, das Gregg erwähnt hatte….
Idee #2: Java-Agenten
Während seines Vortrags erwähnte Gregg mehrmals die Ausführung von Java-Anwendungen mit aktivierten Überwachungsagenten wie NewRelic und YourKit. Viele Agenten dieser Art arbeiten mit der Java Instrumentation API, mit der Sie ein jar angeben können, das Code enthält, der noch vor der Hauptmethode der Anwendung ausgeführt werden soll.
Der Hauptgrund für die Implementierung eines Java-Instrumentierungsagenten besteht darin, genau das zu tun, wonach es klingt: die Anwendung zu instrumentieren. Agenten können so ziemlich alles tun, einschließlich der Änderung des Byte-Codes von Klassen in der Anwendung. Aber mir kam der Gedanke, als ich in Greggs Vortrag saß….
„Warum nicht einen winzig kleinen Agenten
erstellen, der nichts anderes tut, als mlockall aufzurufen?“
Idee #1 + Idee #2 = mlockall-agent
Ein paar Tage später, als ich auf einem Flughafen etwas Zeit totschlagen musste, begann ich in der Codebasis von Cassandra herumzustöbern, um zu sehen , wie sie mit mlockall umgehen.
In der Flughafenlounge kam ich nicht viel weiter, als mich über mlockall und JNA zu informieren, aber ein paar Tage später brauchte ich nicht viel Arbeit, um die wichtigsten Teile des Cassandra-Codes in ein neues Projekt zu destillieren, das ich mlockall-agent.jar genannt habe. Es handelt sich um einen einfachen kleinen Agenten, der auf der Kommandozeile angegeben werden kann, wenn Sie Ihre Java-Anwendung ausführen.
java -Xms1024m -Xmx1024m -javaagent:lib/mlockall-agent.jar -jar yourapp.jar
Bei der Verwendung von mlockall-agent.jar gibt es einige wichtige Vorbehalte, vor allem weil es einige wichtige Vorbehalte bei der Verwendung von mlockall im Allgemeinen (achten Sie auf Ihre ulimits) und einige spezielle Vorbehalte bei der Verwendung in Java (stellen Sie sicher, dass Ihr min heap = Ihr max heap ist) gibt. Die Einzelheiten finden Sie in der README.
Ich bin gespannt, was die Leute von dieser Idee halten. Ich hoffe, dass es eine gute, schlüsselfertige Lösung für alle ist, die ihre Jaa-Anwendung im RAM speichern möchten. Wenn Sie ein Feedback oder Vorschläge haben, lassen Sie es mich in den Kommentaren (oder über Pull Requests) wissen.