From 2c0811cfe99725ff80717c4569201b7012be1012 Mon Sep 17 00:00:00 2001 From: Simon Gardling Date: Fri, 27 Feb 2026 00:04:07 -0500 Subject: [PATCH] minecraft: make more responsive --- configuration.nix | 6 ++++++ flake.nix | 22 +++++++++++----------- services/minecraft.nix | 41 ++++++++++++++++++++++++++++++++++++++++- tests/minecraft.nix | 4 ++++ 4 files changed, 61 insertions(+), 12 deletions(-) diff --git a/configuration.nix b/configuration.nix index aad090a..6212c0c 100644 --- a/configuration.nix +++ b/configuration.nix @@ -158,6 +158,12 @@ # Higher backlog for the large number of concurrent torrent connections "net.core.netdev_max_backlog" = 5000; + + # Minecraft server optimizations + # Disable autogroup for better scheduling of game server threads + "kernel.sched_autogroup_enabled" = 0; + # Huge pages for Minecraft JVM (4000MB heap / 2MB per page + ~200 overhead) + "vm.nr_hugepages" = 2200; }; }; diff --git a/flake.nix b/flake.nix index 5251504..2285cc2 100644 --- a/flake.nix +++ b/flake.nix @@ -326,16 +326,16 @@ checks.${system} = testSuite; packages.${system} = { - tests = pkgs.linkFarm "all-tests" ( - pkgs.lib.mapAttrsToList (name: test: { - name = name; - path = test; - }) testSuite - ); - } - // (pkgs.lib.mapAttrs' (name: test: { - name = "test-${name}"; - value = test; - }) testSuite); + tests = pkgs.linkFarm "all-tests" ( + pkgs.lib.mapAttrsToList (name: test: { + name = name; + path = test; + }) testSuite + ); + } + // (pkgs.lib.mapAttrs' (name: test: { + name = "test-${name}"; + value = test; + }) testSuite); }; } diff --git a/services/minecraft.nix b/services/minecraft.nix index 78eefa9..3b94e8c 100644 --- a/services/minecraft.nix +++ b/services/minecraft.nix @@ -35,7 +35,38 @@ let heap_size = "4000M"; in - "-Xmx${heap_size} -Xms${heap_size} -XX:+UseZGC -XX:+ZGenerational"; + lib.concatStringsSep " " [ + # Memory + "-Xmx${heap_size}" + "-Xms${heap_size}" + # GC + "-XX:+UseZGC" + "-XX:+ZGenerational" + # Base JVM optimizations (brucethemoose/Minecraft-Performance-Flags-Benchmarks) + "-XX:+UnlockExperimentalVMOptions" + "-XX:+UnlockDiagnosticVMOptions" + "-XX:+AlwaysActAsServerClassMachine" + "-XX:+AlwaysPreTouch" + "-XX:+DisableExplicitGC" + "-XX:+UseNUMA" + "-XX:+PerfDisableSharedMem" + "-XX:+UseFastUnorderedTimeStamps" + "-XX:+UseCriticalJavaThreadPriority" + "-XX:ThreadPriorityPolicy=1" + "-XX:AllocatePrefetchStyle=3" + "-XX:-DontCompileHugeMethods" + "-XX:MaxNodeLimit=240000" + "-XX:NodeLimitFudgeFactor=8000" + "-XX:ReservedCodeCacheSize=400M" + "-XX:NonNMethodCodeHeapSize=12M" + "-XX:ProfiledCodeHeapSize=194M" + "-XX:NonProfiledCodeHeapSize=194M" + "-XX:NmethodSweepActivity=1" + "-XX:+UseVectorCmov" + # Large pages (requires vm.nr_hugepages sysctl) + "-XX:+UseLargePages" + "-XX:LargePageSizeInBytes=2m" + ]; serverProperties = { server-port = service_configs.ports.minecraft; @@ -116,6 +147,14 @@ }; }; + systemd.services.minecraft-server-main = { + serviceConfig = { + Nice = -5; + IOSchedulingPriority = 0; + LimitMEMLOCK = "infinity"; # Required for large pages + }; + }; + services.caddy.virtualHosts = lib.mkIf (config.services.caddy.enable) { "map.${service_configs.https.domain}".extraConfig = '' root * ${service_configs.minecraft.parent_dir}/${service_configs.minecraft.server_name}/squaremap/web diff --git a/tests/minecraft.nix b/tests/minecraft.nix index b2e0956..7a27d21 100644 --- a/tests/minecraft.nix +++ b/tests/minecraft.nix @@ -60,6 +60,10 @@ testPkgs.testers.runNixOSTest { wants = lib.mkForce [ ]; after = lib.mkForce [ ]; requires = lib.mkForce [ ]; + serviceConfig = { + Nice = lib.mkForce 0; + LimitMEMLOCK = lib.mkForce "infinity"; + }; }; # Test-specific overrides only - reduce memory for testing