¿Cómo puedes garantizar el buen rendimiento de juegos y emuladores en Linux?

Hay que dedicar esta entrada para exponer un consejo cuya aplicación cada vez se recomienda más con el fin de mejorar el desempeño de ciertos videojuegos y emuladores en Linux: el establecimiento de un valor superior para el parámetro vm.max_map_count.

En los últimos años han aparecido diversas aplicaciones, principalmente ligadas a los videojuegos dentro del escritorio Linux, para las que se recomienda establecer un valor superior en el parámetro vm.max_map_count para así garantizar un buen rendimiento o un funcionamiento estable.

De entre todos los casos conocidos, posiblemente el más mediático haya sido la ejecución del videojuego Hogwarts Legacy a través de Proton. Un número destacado de usuarios reportaron en su momento problemas de rendimiento y la solución no pasó por parchear la capa de compatibilidad, sino por establecer un valor más alto en vm.max_map_count.

Saliéndome de la ejecución de videojuegos, se puede destacar a Ryujinx, el emulador de Nintendo Switch. Si el usuario decide abrir la guía de configuración, es muy probable que vea este mensaje:

-¿Qué es vm.max_map_count?

Sin profundizar, se trata del número máximo de áreas de mapa que puede tener la memoria virtual. Si bien la mayoría de las aplicaciones solo necesitan unos pocos miles de páginas, algunas pueden requerir de más para proporcionar una buena experiencia, como es el caso de ElasticSearch al menos en tiempos pasados.

El valor establecido por defecto en la mayoría de las distribuciones es 65.530 (65530), pero el usuario puede comprobarlo ejecutando el siguiente comando:

cat /proc/sys/vm/max_map_count

Elevar el límite de vm.max_map_count puede aumentar el consumo de memoria en el equipo, pero no de forma inmediata debido a que se usará solo cuando el software lo solicite. En consecuencia, se abre la puerta a permitir una mayor huella de la aplicación en la memoria del kernel.

Dicho con otras palabras, un poco más llanas, subir el valor del parámetro puede incrementar el consumo de memoria por parte de una aplicación y en consecuencia reducir el rendimiento del equipo, así que la prioridad a la hora de modificarlo debería ser alcanzar un punto de equilibrio.

-Modificando el valor de vm.max_map_count

La modificación del valor establecido para el parámetro se hace con sysctl, una utilidad capaz de leer y modificar atributos del kernel. El usuario puede cambiarlo en caliente con el siguiente comando (1048576 es el valor), aunque esta vía solo dura mientras el ordenador no sea apagado o reiniciado:

sudo sysctl -w vm.max_map_count=1048576

Si se quiere cambiar el valor de vm.max_map_count de manera permanente hay que modificar o crear el fichero /etc/sysctl.conf. Aquí voy a usar Vim (vim), pero el usuario puede emplear el editor de texto que quiera, incluso Geany o Gedit si está instalado en formato “tradicional”:

sudo vim /etc/sysctl.conf

Si el archivo ya estaba presente, toca ir hasta abajo del todo para introducir lo siguiente. Si no existía, el proceso es un poco más rápido:

vm.max_map_count=1048576

Tras modificar el fichero se procede a guardar los cambios, cerrar el editor de texto que se esté usando y ejecutar este comando para así aplicar los cambios sin tener que reiniciar:

sudo sysctl -p

El valor 1.048.576 es el acordado por el Comité de Ingeniería y Dirección de Fedora (FESCo) para establecerlo de manera predeterminada en Fedora 39. En un principio se propuso 2.147.483.642, que es el empleado por SteamOS 3, pero algunos vieron esa cantidad como excesiva y tras discutir el asunto se determinó que 1.048.576 era suficiente para obtener los beneficios deseados.

Tenga razón o no el FESCo, voy a dejar el valor establecido por Valve en SteamOS 3 para quien quiera copiarlo:

vm.max_map_count=2147483642

Y recopilando más sugerencias recogidas por el FESCo, parece que por ahí recomiendan establecer 16.777.216 como valor más alto para Counter-Strike 2. No voy a entrar en si es realmente útil o cierto, pero personalmente, he decidido aplicar en openSUSE MicroOS/Aeon lo mismo que se verá a partir de Fedora 39.

vm.max_map_count=16777216

-Conclusión

Si uno no juega desde un escritorio Linux, en un principio no debería ser necesario subir el valor de vm.max_map_count, sin embargo, si uno ejecuta videojuegos de última generación o emuladores de Nintendo Switch, es algo a tener en consideración, sobre todo en los últimos tiempos viendo lo ocurrido con Hogwarts Legacy.