15 votos

¿Por qué mi servidor de Minecraft utiliza siempre el 100% de la memoria RAM disponible?

Tengo un servidor de Minecraft (1.16.5) alojado en un VPS que tiene 16 GB de ram, juego con 8 amigos en el servidor y está usando toda mi ram, jugamos vanilla survival, pero no veo como esto puede causar que el servidor use 12 GB de ram.

El comando de inicio es:

java -Xms14G -Xmx14G -XX:+UseG1GC -XX:+UnlockExperimentalVMOptions -XX:MaxGCPauseMillis=50 -XX:+DisableExplicitGC -XX:TargetSurvivorRatio=90 -XX:G1NewSizePercent=50 -XX:G1MaxNewSizePercent=80 -XX:InitiatingHeapOccupancyPercent=10 -XX:G1MixedGCLiveThresholdPercent=50 -XX:+AggressiveOpts -jar server.jar

Estoy usando paper que ha ayudado mucho con el rendimiento, y he configurado algunas opciones en el bukkit.yml, spigot.yml, paper.yml y el server.properties.

¿Hay alguna razón para que mi servidor esté usando tanta ram?

3 votos

Como nota al margen, ¿de dónde has sacado estos ajustes? Es posible que estos ajustes sean para alguien con una configuración diferente y específica.

0 votos

Estuve mirando una pasta de /timings y me mostró que tenía banderas desactualizadas, así que copié los argumentos que habían puesto en ese post y retoqué algunos

1 votos

¿Qué tan rápido llega al 100%? La JVM es conocida por las fugas de memoria.

54voto

Tony Puntos 1

Estás configurando estas dos opciones:

-Xms14G -Xmx14G

Esto significa que la JVM debe comenzar con 14 GB (-Xms) y crecer hasta un máximo de 14 GB (-Xmx) amontonar Uso de la RAM. El uso real de RAM será mayor, ya que java necesita algo de espacio para sí mismo, para las clases cargadas, para las internas temporales de recolección de basura, etc. Lo que a su vez significa que la JVM asignará cerca de 16 GB desde el principio.

Ahora, en un sistema Linux, esto no físicamente asignar los 14 GB de heap justo al inicio - la JVM pide a Linux que asigne 14 GB, Linux le dice a la JVM "aquí tienes", pero esas páginas de ram sólo se asignarán a la JVM una vez que se escriban. Tomará desde varios segundos hasta 1-2 horas de tiempo de juego hasta que la JVM realmente escriba en toda la RAM, así que hasta ese punto, el SO tendrá al menos parte de la RAM para sí mismo. Una vez que los 14 GB estén llenos, Java iniciará su primera recolección de basura - por lo que liberará una gran cantidad de memoria internamente pero no devolverá esa memoria a tu sistema.

Lo que significa que tu Linux tiene muy poca caché de disco, lo que significa mucho más acceso al disco de lo necesario, lo que generalmente significa mucho retraso. (Esto podría ser algo mejor en un VPS donde el acceso al disco va a través del host que podría tener algo de caché en sí mismo).

Lo que realmente debes hacer es bajar tu -Xms y -Xmx a la mitad de la memoria RAM disponible, que en tu caso serían 8 GB. A continuación, comprueba cuánta RAM necesita realmente tu Minecraft, activando el registro de GC y comprobando los archivos de registro.

Para Java 14 (que debería utilizar junto con Paper), añada esto a su invocación java:

-Xlog:gc*:gc.log:time,level,tags:filecount=5,filesize=1024K

Esto generará un archivo llamado gc.log en el directorio de su servidor (además, con el paso del tiempo, unas cuantas generaciones anteriores denominadas gc.log.0 y así sucesivamente. Esos archivos tienen información sobre cada ejecución de la GC, las líneas interesantes son las que se parecen a esto:

Pause Young (Normal) (G1 Evacuation Pause) 10247M->2108M(16384M) 9.477ms

En este caso, el parámetro -Xmx era 16G Aquí es donde el 16484M viene de. La recolección de basura comenzó a ejecutarse cuando se usaron 10247 MB, y terminó con 2108 MB después de la recolección de basura. Lo que significa que no se puede bajar de ~ 2 GB porque eso es lo que realmente necesita Java, y no debería bajar del doble de este valor. Todo lo que esté por encima de, en mi caso, 4 GB, es un lujo que puedes gastar si lo tienes, pero no te ayudará mucho, y de hecho puede ser perjudicial porque se come la caché del disco del sistema.

Así que:

  • ajuste sus parámetros de memoria a 8 GB
  • Activar el registro de la GC, jugar durante un día, y comprobar cuánta pila necesita realmente el servidor después de recogida de basuras
  • asignar 2-3 veces este valor a -Xmx, y este valor a -Xms
  • si necesitas mucho menos de los 2 GB de mi caso, todavía puedes subir hasta la mitad de la cantidad máxima de lo que tiene el VPS; 8 GB en tu caso
  • si necesitas mucho más, por ejemplo, necesitas 8 GB después de recolección de basura (que sólo debería ocurrir si tiene una tonelada de plugins o varios que se comportan mal), aumente la RAM de su VPS a aproximadamente 3-4 veces el valor después de la recolección de basura, y siga estableciendo -Xmx a la mitad de su RAM disponible/el doble del valor necesario después de GC.

Si todavía está utilizando Java 8, las opciones de inicio cambian a

-verbose:gc -Xloggc:gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=1M 

y las entradas del archivo de registro se parecerán más a esto:

[Eden: 8176.0M(8176.0M)->0.0B(8176.0M) Survivors: 16.0M->16.0M Heap: 10.7G(16.0G)->2790.4M(16.0G)]

En este caso, es el Heap valor que le interesa: aquí, 16 GB de -Xmx 10,7 GB utilizados antes de la GC, 2790 MB después de la GC.

1 votos

Wow, gracias por una respuesta tan detallada, esto realmente hizo las cosas claras, todavía estoy usando Java 8 ya que estoy usando el panel de Pterodactyl y no sé realmente cómo actualizar que todavía, tendrá que averiguar que por lo que va a utilizar las opciones de Java 8 en primer lugar. Me pondré en contacto con usted si necesito más ayuda.

0 votos

El heap oscila entre 3,5GB y 4,5GB.Que después de la GC lo hace entre 1GB y 1,5GB. Ahora que he bajado los GB's asignados a 8 parece que sigue usando el 100% de eso. Si algo cambia en las próximas horas volveré sobre esto.

1 votos

@Mark_Ed: Si se pone -Xms y -Xmx al mismo número, entonces ese es el comportamiento esperado. Se siempre utilizar al menos el -Xms número una vez que ha conseguido llenar realmente esa cantidad de memoria al menos una vez, porque eso es lo que -Xms significa : "Por favor, utiliza al menos esta cantidad de memoria".

6voto

user163757 Puntos 1728

Uno de los argumentos de JVM me tiene preocupado - -XX:+DisableExplicitGC .

Los servidores de Minecraft-Java están basados en Java, y por lo tanto se ejecutan en una máquina virtual de Java (JVM). Los argumentos que proporcionas en tu comando de inicio le dicen a la JVM cómo operar, con qué configuración, etc.

Según Documentación de Oracle (Oracle es propietaria de Java):

Utilice -XX:+DisableExplicitGC para desactivar las llamadas a System.gc() . Tenga en cuenta que la JVM sigue realizando la recolección de basura cuando es necesario.

Al proporcionar este argumento, le está diciendo a la JVM de su servidor que desactive el sistema Recogida de basura . Sin entrar en demasiados detalles, el Garbage Collector gestiona la memoria de un programa Java de forma automática. Como dice la cita, todavía realizará la recolección de basura cuando sea necesario, pero parece que no es necesario en su caso (tal vez porque todavía tiene ~2Gb o RAM de sobra, basado en su Xmx ). Una fuente dice que al establecer esto, podría estar retrasando los eventos de recolección de basura durante más tiempo .

Por lo tanto, yo intentaría cambiar el argumento a -XX:-DisableExplicitGC o tal vez simplemente eliminarlo directamente.

0 votos

Los comentarios no son para ampliar la discusión; esta conversación ha sido trasladado al chat .

0 votos

Dudo que Minecraft llame a System.gc para empezar. La opción no debería ser peligroso .

2 votos

Explicación de @user253751 por qué esta opción es peligroso está en el chat de arriba, de lo contrario es una teorización sin fundamento. En resumen, la JVM utiliza llamadas explícitas a gc internamente, y también hay memoria directa cuyo límite es igual a xmx (14 gb en este caso), no está limitado sólo con el espacio de la pila y la clase. La parte con la redacción incorrecta es que deshabilita el gc del sistema - realmente retrasa el gc del sistema pero todavía conduce a la muerte OOM.

JugonesTop.com

Jugonestop es una comunidad para amantes del gaming. Puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X