diff --git a/configuration.nix b/configuration.nix index 674ca57..18f1e25 100644 --- a/configuration.nix +++ b/configuration.nix @@ -118,6 +118,9 @@ hardware.intelgpu.driver = "xe"; + # Per-service 2MB hugepage budget calculated in service-configs.nix. + boot.kernel.sysctl."vm.nr_hugepages" = service_configs.hugepages_2m.total_pages; + boot = { # 6.12 LTS until 2026 kernelPackages = pkgs.linuxPackages_6_12_hardened; diff --git a/service-configs.nix b/service-configs.nix index f96d603..e1fb0c1 100644 --- a/service-configs.nix +++ b/service-configs.nix @@ -60,6 +60,7 @@ rec { postgres = { socket = "/run/postgresql"; dataDir = services_dir + "/sql"; + shared_buffers_m = 128; # PostgreSQL default; update if you change shared_buffers }; immich = { @@ -150,4 +151,25 @@ rec { moviesDir = torrents_path + "/media/movies"; tvDir = torrents_path + "/media/tv"; }; + + # Per-service 2MB hugepage budget. + # Each value is the service's hugepage consumption in MB, derived from + # its actual memory configuration. The kernel sysctl vm.nr_hugepages + # is set to total_pages so every service gets what it needs. + hugepages_2m = rec { + page_size_m = 2; + + # RandomX dataset (2048MB) + cache (256MB) = 2304MB per instance. + # Both monerod and p2pool allocate their own full copy via MAP_HUGETLB. + randomx_instance_m = 2048 + 256; + + services = { + minecraft_m = minecraft.memory.heap_size_m; # JVM heap via -XX:+UseLargePages + monerod_m = randomx_instance_m; # block verification dataset + p2pool_m = randomx_instance_m; # mining dataset + postgres_m = postgres.shared_buffers_m; # huge_pages = try (default) + }; + + total_pages = builtins.foldl' (a: b: a + b) 0 (builtins.attrValues services) / page_size_m; + }; } diff --git a/services/minecraft.nix b/services/minecraft.nix index d6462de..e08919f 100644 --- a/services/minecraft.nix +++ b/services/minecraft.nix @@ -27,14 +27,6 @@ boot.kernel.sysctl = { # Disable autogroup for better scheduling of game server threads "kernel.sched_autogroup_enabled" = 0; - - # We want to determine the number of hugepages based on how many minecraft needs. - # This can be determined by dividing the heap size by the size of a large page. - # Doing this gives us how many large pages are needed. - # Then we add 300 to give some headroom. - "vm.nr_hugepages" = - (service_configs.minecraft.memory.heap_size_m / service_configs.minecraft.memory.large_page_size_m) - + 300; }; services.minecraft-servers = {