Ich habe für meine Kinder zu Hause einen lokalen Minecraft-Server betrieben und als weitere hinzukamen, wurden Verzögerungen zum Problem … und in letzter Zeit stürzt das Spiel tatsächlich ab (wenn ein einzelner Spiel-„Tick“ länger als 60 Sekunden dauert, fährt das Spiel die JVM automatisch herunter).
Das Experimentieren mit einigen empfohlenen JVM-Flags hat dazu geführt, dass der Kernel den Java-Hintergrundprozess automatisch (und still!) gestoppt hat, und ich bin nicht sicher, warum.
Der Hostcomputer ist ein Quad-Core i7 (8 Threads) mit 32 GB RAM und Fedora 31.
Java ist die SE-Laufzeitumgebung von Oracle:
java version "1.8.0_231"
Java(TM) SE Runtime Environment (build 1.8.0_231-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.231-b11, mixed mode)
Ursprünglich lautete die funktionierende Befehlszeichenfolge zum Starten des Spiels:
java -Xms2G -Xmx4G -server -XX:+UseG1GC -Djava.net.preferIPv4Stack=true -Djava.net.preferIPv6Addresses=false -jar minecraft_server.1.15.2.jar nogui &
Das Hinzufügen der empfohlenen JVM-Flags zur Leistungsoptimierung führte dazu, dass das Betriebssystem den Java-Hintergrundprozess stillschweigend stoppte:
java -Xms10G -Xmx10G -server -XX:+UseG1GC -Djava.net.preferIPv4Stack=true -Djava.net.preferIPv6Addresses=false -XX:+ParallelRefProcEnabled -XX:MaxGCPauseMillis=200 -XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC -XX:-OmitStackTraceInFastThrow -XX:+AlwaysPreTouch -XX:G1NewSizePercent=30 -XX:G1MaxNewSizePercent=40 -XX:G1HeapRegionSize=8M -XX:G1ReservePercent=20 -XX:G1HeapWastePercent=5 -XX:G1MixedGCCountTarget=8 -XX:InitiatingHeapOccupancyPercent=15 -XX:G1MixedGCLiveThresholdPercent=90 -XX:G1RSetUpdatingPauseTimePercent=5 -XX:SurvivorRatio=32 -XX:MaxTenuringThreshold=1 -Dusing.aikars.flags=true -Daikars.new.flags=true -jar minecraft_server.1.15.2.jar nogui &
Ich habe überprüft, dass die XMS/XMX-Änderungen nicht dafür verantwortlich waren, indem ich sie unabhängig voneinander mit meinem ursprünglichen JVM-Flags-Satz getestet habe.
Die Ausführung dieses Befehls führt dazu, dass die JVM gestartet wird und der Spielserver mit der Initialisierung beginnt, dann aber plötzlich anhält. Das Betriebssystem meldet:[1] Gestoppt
Ich kann es manuell in den Vordergrund bringen und es wird normal ausgeführt (es funktioniert auch einwandfrei, wenn ich es im Vordergrund starte). Jeder Versuch, es in den Hintergrund zurückzuholen, führt dazu, dass der Prozess automatisch wieder gestoppt wird.
Wenn ich jedoch die gleiche Befehlszeichenfolge ausführe mitnein, dann verhält sich der Prozess wie erwartet, das heißt, der Java-Prozess des Spiels läuft tatsächlich im Hintergrund.
Meine Frage an alle Kernel- und/oder Java-Gurus lautet also: Was in meinen JVM-Flags veranlasst das Betriebssystem, den Prozess zu stoppen, wenn er im Hintergrund gestartet wird?
BEARBEITEN - Zusätzliche Informationen
Analyse dernohup.outDatei sehe ich diesen Fehler, der NICHT auftritt, wenn der JVM-Prozess im Vordergrund gestartet wird.
[04:12:38] [Server thread/INFO]: Starting minecraft server version 1.15.2
[04:12:38] [Server thread/INFO]: Loading properties
[04:12:38] [Server thread/INFO]: Default game type: SURVIVAL
[04:12:38] [Server thread/INFO]: Generating keypair
[04:12:38] [Server console handler/ERROR]: Exception handling console input
java.io.IOException: Bad file descriptor
at java.io.FileInputStream.readBytes(Native Method) ~[?:1.8.0_231]
at java.io.FileInputStream.read(FileInputStream.java:255) ~[?:1.8.0_231]
at java.io.BufferedInputStream.read1(BufferedInputStream.java:284) ~[?:1.8.0_231]
at java.io.BufferedInputStream.read(BufferedInputStream.java:345) ~[?:1.8.0_231]
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284) ~[?:1.8.0_231]
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326) ~[?:1.8.0_231]
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178) ~[?:1.8.0_231]
at java.io.InputStreamReader.read(InputStreamReader.java:184) ~[?:1.8.0_231]
at java.io.BufferedReader.fill(BufferedReader.java:161) ~[?:1.8.0_231]
at java.io.BufferedReader.readLine(BufferedReader.java:324) ~[?:1.8.0_231]
at java.io.BufferedReader.readLine(BufferedReader.java:389) ~[?:1.8.0_231]
at wd$2.run(SourceFile:110) [minecraft_server.1.15.2.jar:?]
[04:12:38] [Server thread/INFO]: Starting Minecraft server on *:25512
[04:12:38] [Server thread/INFO]: Using epoll channel type