집에서 아이들을 위해 로컬 마인크래프트 서버를 운영하고 있는데, 더 많은 아이들이 접속할수록 렉이 문제가 되었고... 최근에는 실제 게임이 멈춥니다(단일 게임의 "틱"이 60초 이상 걸리면 게임이 멈춥니다). 자동으로 JVM을 종료합니다).
일부 권장 JVM 플래그를 실험하면 커널이 자동으로(그리고 자동으로!) 백그라운드 Java 프로세스를 중지하는데 그 이유는 잘 모르겠습니다.
호스트 시스템은 Fedora 31을 실행하는 32GB RAM을 갖춘 쿼드 코어 i7(8스레드)입니다.
Java는 Oracle의 SE 런타임입니다.
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 플래그를 추가하면 OS가 백그라운드 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 &
원래 JVM 플래그 세트를 사용하여 독립적으로 테스트하여 XMS/XMX 변경 사항이 책임이 없다는 것을 확인했습니다.
이 명령을 실행하면 JVM이 시작되고 게임 서버가 초기화되기 시작한 후 갑자기 중지됩니다. OS는 다음을 보고합니다.[1] 중지됨
수동으로 전경으로 가져오면 정상적으로 실행이 재개됩니다(전경에서 실행해도 정상적으로 작동합니다). 이를 백그라운드로 되돌리려고 하면 프로세스가 자동으로 다시 중지됩니다.
그러나 다음을 사용하여 동일한 명령 문자열을 실행하면안돼, 그러면 프로세스가 예상대로 작동합니다. 즉, 게임의 Java 프로세스가 실제로 백그라운드에서 실행됩니다.
커널 및/또는 Java 전문가에 대한 질문입니다. JVM 플래그에서 OS가 백그라운드에서 실행될 때 프로세스를 중지시키는 원인은 무엇입니까?
편집 - 추가 정보
구문 분석을 통해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