diff --git a/flake.nix b/flake.nix index c061667..84a5f86 100644 --- a/flake.nix +++ b/flake.nix @@ -197,6 +197,7 @@ inputs.pvv-calendar-bot.nixosModules.default inputs.minecraft-heatmap.nixosModules.default self.nixosModules.gickup + self.nixosModules.hugepages self.nixosModules.matrix-ooye ]; overlays = [ @@ -309,6 +310,7 @@ bluemap = ./modules/bluemap.nix; drumknotty = ./modules/drumknotty; gickup = ./modules/gickup; + hugepages = ./modules/hugepages.nix; matrix-ooye = ./modules/matrix-ooye.nix; python-http-handlers = ./modules/python-http-handlers.nix; robots-txt = ./modules/robots-txt.nix; diff --git a/hosts/bicep/services/mysql/default.nix b/hosts/bicep/services/mysql/default.nix index a162053..1d4f230 100644 --- a/hosts/bicep/services/mysql/default.nix +++ b/hosts/bicep/services/mysql/default.nix @@ -2,6 +2,8 @@ let cfg = config.services.mysql; dataDir = "/data/mysql"; + + innodbBufferPoolMB = 128; in { imports = [ ./backup.nix ]; @@ -26,6 +28,10 @@ in # Useful for the mysqld prometheus exporter userstat = 1; + # Memory settings + innodb_buffer_pool_size = "${toString innodbBufferPoolMB}M"; + "large-pages" = 1; + # This was needed in order to be able to use all of the old users # during migration from knakelibrak to bicep in Sep. 2023 secure_auth = 0; @@ -47,6 +53,10 @@ in }]; }; + boot.kernel.hugepages.reservations.mysql = lib.mkIf cfg.enable ( + builtins.ceil (innodbBufferPoolMB / config.boot.kernel.hugepages.size) + ); + networking.firewall.allowedTCPPorts = lib.mkIf cfg.enable [ 3306 ]; systemd.tmpfiles.settings."10-mysql".${dataDir}.d = lib.mkIf cfg.enable { diff --git a/hosts/bicep/services/postgresql/default.nix b/hosts/bicep/services/postgresql/default.nix index d4e31b7..57b0470 100644 --- a/hosts/bicep/services/postgresql/default.nix +++ b/hosts/bicep/services/postgresql/default.nix @@ -1,6 +1,8 @@ { config, lib, pkgs, values, ... }: let cfg = config.services.postgresql; + + sharedBuffersMB = 8192; in { imports = [ @@ -29,7 +31,7 @@ in superuser_reserved_connections = 3; # Memory Settings - shared_buffers = "8192 MB"; + shared_buffers = "${toString sharedBuffersMB} MB"; work_mem = "32 MB"; maintenance_work_mem = "420 MB"; effective_cache_size = "22 GB"; @@ -93,6 +95,10 @@ in }; }; + boot.kernel.hugepages.reservations.postgresql = lib.mkIf cfg.enable ( + builtins.ceil (sharedBuffersMB / config.boot.kernel.hugepages.size) + ); + systemd.tmpfiles.settings."10-postgresql"."/data/postgresql".d = lib.mkIf cfg.enable { user = config.systemd.services.postgresql.serviceConfig.User; group = config.systemd.services.postgresql.serviceConfig.Group; diff --git a/modules/hugepages.nix b/modules/hugepages.nix new file mode 100644 index 0000000..5b64318 --- /dev/null +++ b/modules/hugepages.nix @@ -0,0 +1,38 @@ +{ config, lib, ... }: +let + cfg = config.boot.kernel.hugepages; +in +{ + options.boot.kernel.hugepages = { + size = lib.mkOption { + type = lib.types.enum [ 2 1024 ]; + default = 2; + description = '' + Hugepage size in MB. + + You can use this value to calculate the amount of memory you will have available as hugepages. + ''; + }; + + reservations = lib.mkOption { + type = lib.types.attrsOf lib.types.ints.unsigned; + default = { }; + description = '' + Number of hugepages each service wants reserved in vm.nr_hugepages, + keyed by service name. + ''; + }; + }; + + config = { + boot.kernelParams = let + num = { + "2" = "2M"; + "1024" = "1G"; + }.${toString cfg.size}; + in [ "hugepagesz=${num}" ]; + + boot.kernel.sysctl."vm.nr_hugepages" = + lib.foldl' (a: b: a + b) 0 (lib.attrValues cfg.reservations); + }; +}