Erstellen kann die JVM mit -XX:+UseLargePages aktiviert
Ich habe ein Java service, der läuft momentan mit einer 14GB heap. Ich bin begierig darauf, zu versuchen, die -XX:+UseLargePages option, um zu sehen, wie könnte dies Auswirkungen auf die Leistung des Systems. Habe ich so konfiguriert das Betriebssystem wie beschrieben von Oracle mit entsprechenden shared-memory und Seite Werte (diese kann auch berechnet werden mit ein online-tool).
Wenn das Betriebssystem konfiguriert ist, kann ich sehen, dass es ordnet die zu erwartende Menge an Speicher als riesige-Seiten. Jedoch, dem Start der VM mit der -XX:+UseLargePages
option gesetzt, stets Ergebnisse in einer der folgenden Fehler:
Wenn -Xms
/-Xmx
ist fast gleich an die große Seite-Zuordnung:
Failed to reserve shared memory (errno = 28). //'No space left on device'
Wenn -Xms
/-Xmx
ist weniger als die große Seite-Zuordnung:
Failed to reserve shared memory (errno = 12). //'Out of memory'
Ich wollte versuchen die Einführung einiger Spielraum - also auf einer 32-GB-system, das ich reserviert 24 GB shared memory und hugepages zur Verwendung mit einer JVM-Konfiguration mit einem 20-GB-Haufen, von denen nur 14GB werden derzeit genutzt. Ich habe auch verifiziert, dass der Benutzer die Ausführung der JVM hat die Gruppe Rechte, die im Einklang mit /proc/sys/vm/hugetlb_shm_group
.
Kann jemand mir einige Hinweise, wo ich vielleicht schief geht und was könnte ich als Nächstes versuchen?
Zuweisungen/Nutzung:
-Xms
/-Xmx
- 20GB- Genutzt heap - 14GB
/proc/sys/kernel/shmmax
- 25769803776 (24GB)/proc/sys/vm/nr_hugepages
- 12288
Umgebung:
- Memory System - 32GB
- System Seite Größe - 2048KB
- debian 2.6.26-2-amd64
- Sun JVM 1.6.0_20-b02
Lösung
Dank @jfgagne für die Bereitstellung einer Antwort, zu einer Lösung führen. Zusätzlich zu den
Einstellung (angegeben als 4KB-Seiten), hatte ich Einträge hinzufügen, um
/proc/sys/kernel/shmall/etc/security/limits.conf
wie beschrieben auf Thomas' blog. Allerdings, wie Sie meine Anwendung gestartet wird mit jsvc
hatte ich auch zum duplizieren der Einstellungen für den Benutzer root (beachten Sie, dass die Grenzwerte sind angegeben in KB):
root soft memlock 25165824
root hard memlock 25165824
pellegrino soft memlock 25165824
pellegrino hard memlock 25165824
Es ist auch erwähnenswert, dass Einstellungen können getestet werden schnell durch starten der JVM mit der -version
argument:
java -XX:+UseLargePages -Xmx20g -version
- Tolle doc zu diesem Thema unter dataforte.net/blog/2010/03/12/... Sie könnten, statt der Festlegung von Grenzwerten für root, Bearbeiten Sie /etc/pam.d/su und /etc/pam.d/sudo und sicherzustellen, dass Sie die folgende Zeile enthalten, so dass die oben genannten Speicher-Grenzen angewendet werden:
session required pam_limits.so
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie riesige Seiten mit Java, es ist nicht nur der Haufen mit großen Seiten, aber es gibt auch die PermGen: vergessen Sie nicht zu reservieren Platz für Sie. Es scheint, das ist, warum Sie haben einen anderen Fehlercode Meldung angezeigt, wenn Sie gesetzt
Xmx
in der Nähe der Betrag, den der riesige Seiten.Gibt es auch die
shmall
kernel-parameter, der eingestellt werden muss, die Sie nicht erwähnen, vielleicht ist es das, was blockiert Sie. In Ihrem Fall ist, sollten Sie es so einrichten, 6291456.Die Letzte Sache zu sagen: bei der Verwendung von großen Seiten, die
Xms
parameter wird nicht mehr verwendet: Java behält sich alleXmx
im gemeinsamen Speicher mit großen Seiten.shmall
4K-Seiten?