Я запустил локальный сервер Minecraft для своих детей дома, и по мере того, как к нему присоединялось все больше людей, задержка стала проблемой... а в последнее время и вовсе игра вылетает (когда один игровой «тик» длится более 60 секунд, игра автоматически отключает JVM).
Эксперименты с некоторыми рекомендуемыми флагами JVM привели к тому, что ядро автоматически (и молча!) остановило фоновый процесс Java, и я не уверен, почему.
Хост-машина представляет собой четырехъядерный процессор i7 (8 потоков) с 32 ГБ оперативной памяти, работающий под управлением Fedora 31.
Java — это среда выполнения SE от 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)
Первоначально рабочая строка команды запуска игры была такой:
java -Xms2G -Xmx4G -server -XX:+UseG1GC -Djava.net.preferIPv4Stack=true -Djava.net.preferIPv6Addresses=false -jar minecraft_server.1.15.2.jar nogui &
Добавление рекомендуемых флагов JVM для оптимизации производительности привело к тому, что ОС молча остановила фоновый процесс Java:
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 &
Я убедился, что изменения XMS/XMX не были причиной, протестировав их независимо, используя мой исходный набор флагов JVM.
Выполнение этой команды приводит к запуску JVM и началу инициализации игрового сервера, а затем к внезапной остановке. ОС сообщает:[1] Остановлено
Я могу вручную перевести его на передний план, и он продолжит нормально выполняться (он также работает нормально, когда я запускаю его на переднем плане). Любая попытка вернуть его на задний план приводит к тому, что процесс снова автоматически останавливается.
Однако, если я запущу ту же командную строку, используянет, то процесс ведет себя так, как и ожидалось... то есть, процесс Java игры фактически работает в фоновом режиме.
Итак, мой вопрос всем гуру ядра и/или Java: что в моих флагах JVM заставляет ОС останавливать процесс, когда он запущен в фоновом режиме?
ИЗМЕНИТЬ - Дополнительная информация
Анализ черезnohup.outфайл, я вижу эту ошибку, которая НЕ возникает при запуске процесса jvm на переднем плане.
[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