Compare commits

..
Author SHA1 Message Date
h7x4 b350554bf3 bicep/mysql: enable hugepages 2026-07-21 19:42:15 +09:00
h7x4 f41e6c0a74 bicep/postgresql: enable hugepages 2026-07-21 19:38:30 +09:00
h7x4 8bb86ef634 modules/hugepages: init 2026-07-21 18:18:06 +09:00
6 changed files with 78 additions and 53 deletions
+2
View File
@@ -197,6 +197,7 @@
inputs.pvv-calendar-bot.nixosModules.default inputs.pvv-calendar-bot.nixosModules.default
inputs.minecraft-heatmap.nixosModules.default inputs.minecraft-heatmap.nixosModules.default
self.nixosModules.gickup self.nixosModules.gickup
self.nixosModules.hugepages
self.nixosModules.matrix-ooye self.nixosModules.matrix-ooye
]; ];
overlays = [ overlays = [
@@ -309,6 +310,7 @@
bluemap = ./modules/bluemap.nix; bluemap = ./modules/bluemap.nix;
drumknotty = ./modules/drumknotty; drumknotty = ./modules/drumknotty;
gickup = ./modules/gickup; gickup = ./modules/gickup;
hugepages = ./modules/hugepages.nix;
matrix-ooye = ./modules/matrix-ooye.nix; matrix-ooye = ./modules/matrix-ooye.nix;
python-http-handlers = ./modules/python-http-handlers.nix; python-http-handlers = ./modules/python-http-handlers.nix;
robots-txt = ./modules/robots-txt.nix; robots-txt = ./modules/robots-txt.nix;
+11 -25
View File
@@ -41,38 +41,24 @@ in
path = with pkgs; [ path = with pkgs; [
cfg.package cfg.package
coreutils coreutils
diffutils
zstd zstd
]; ];
script = '' script = let
rotations = 2;
in ''
set -euo pipefail set -euo pipefail
dump() { OUT_FILE="$STATE_DIRECTORY/mysql-dump-$(date --iso-8601).sql.zst"
local name="$1" out tmp
out="$STATE_DIRECTORY/$name.sql.zst"
tmp="$out.tmp"
shift
"$@" | zstd -9 --rsyncable -f -o "$tmp"
if cmp -s "$tmp" "$out" 2>/dev/null; then
rm -f "$tmp"
else
mv -f "$tmp" "$out"
fi
}
declare -A keep mysqldump --all-databases | zstd --compress -9 --rsyncable -o "$OUT_FILE"
while IFS= read -r db; do
[ -n "$db" ] || continue
dump "$db" mysqldump --skip-dump-date --databases "$db"
keep["$db.sql.zst"]=1
done < <(mysql -N -e 'SHOW DATABASES' | grep -vE '^(information_schema|performance_schema)$')
# drop dumps of databases that no longer exist # NOTE: this needs to be a hardlink for rrsync to allow sending it
for f in "$STATE_DIRECTORY"/*.sql.zst; do rm "$STATE_DIRECTORY/mysql-dump-latest.sql.zst" ||:
[ -e "$f" ] || continue ln -T "$OUT_FILE" "$STATE_DIRECTORY/mysql-dump-latest.sql.zst"
base="$(basename "$f")"
[ -n "''${keep[$base]:-}" ] || rm -f "$f" while [ "$(find "$STATE_DIRECTORY" -type f -printf '.' | wc -c)" -gt '${toString (rotations + 1)}' ]; do
rm "$(find "$STATE_DIRECTORY" -type f -printf '%T+ %p\n' | sort | head -n 1 | cut -d' ' -f2)"
done done
''; '';
+10
View File
@@ -2,6 +2,8 @@
let let
cfg = config.services.mysql; cfg = config.services.mysql;
dataDir = "/data/mysql"; dataDir = "/data/mysql";
innodbBufferPoolMB = 128;
in in
{ {
imports = [ ./backup.nix ]; imports = [ ./backup.nix ];
@@ -26,6 +28,10 @@ in
# Useful for the mysqld prometheus exporter # Useful for the mysqld prometheus exporter
userstat = 1; 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 # This was needed in order to be able to use all of the old users
# during migration from knakelibrak to bicep in Sep. 2023 # during migration from knakelibrak to bicep in Sep. 2023
secure_auth = 0; 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 ]; networking.firewall.allowedTCPPorts = lib.mkIf cfg.enable [ 3306 ];
systemd.tmpfiles.settings."10-mysql".${dataDir}.d = lib.mkIf cfg.enable { systemd.tmpfiles.settings."10-mysql".${dataDir}.d = lib.mkIf cfg.enable {
+10 -27
View File
@@ -41,42 +41,25 @@ in
path = with pkgs; [ path = with pkgs; [
coreutils coreutils
diffutils
zstd zstd
cfg.package cfg.package
]; ];
script = '' script = let
rotations = 2;
in ''
set -euo pipefail set -euo pipefail
dump() { OUT_FILE="$STATE_DIRECTORY/postgresql-dump-$(date --iso-8601).sql.zst"
local name="$1" out tmp
out="$STATE_DIRECTORY/$name.sql.zst"
tmp="$out.tmp"
shift
"$@" | zstd -9 --rsyncable -f -o "$tmp"
if cmp -s "$tmp" "$out" 2>/dev/null; then
rm -f "$tmp"
else
mv -f "$tmp" "$out"
fi
}
declare -A keep pg_dumpall -U postgres | zstd --compress -9 --rsyncable -o "$OUT_FILE"
dump globals pg_dumpall -U postgres --globals-only --restrict-key=backup
keep[globals.sql.zst]=1
while IFS= read -r db; do # NOTE: this needs to be a hardlink for rrsync to allow sending it
[ -n "$db" ] || continue rm "$STATE_DIRECTORY/postgresql-dump-latest.sql.zst" ||:
dump "$db" pg_dump -U postgres -C -d "$db" --restrict-key=backup ln -T "$OUT_FILE" "$STATE_DIRECTORY/postgresql-dump-latest.sql.zst"
keep["$db.sql.zst"]=1
done < <(psql -U postgres -tAc "SELECT datname FROM pg_database WHERE datallowconn ORDER BY datname")
# drop dumps of databases that no longer exist while [ "$(find "$STATE_DIRECTORY" -type f -printf '.' | wc -c)" -gt '${toString (rotations + 1)}' ]; do
for f in "$STATE_DIRECTORY"/*.sql.zst; do rm "$(find "$STATE_DIRECTORY" -type f -printf '%T+ %p\n' | sort | head -n 1 | cut -d' ' -f2)"
[ -e "$f" ] || continue
base="$(basename "$f")"
[ -n "''${keep[$base]:-}" ] || rm -f "$f"
done done
''; '';
+7 -1
View File
@@ -1,6 +1,8 @@
{ config, lib, pkgs, values, ... }: { config, lib, pkgs, values, ... }:
let let
cfg = config.services.postgresql; cfg = config.services.postgresql;
sharedBuffersMB = 8192;
in in
{ {
imports = [ imports = [
@@ -29,7 +31,7 @@ in
superuser_reserved_connections = 3; superuser_reserved_connections = 3;
# Memory Settings # Memory Settings
shared_buffers = "8192 MB"; shared_buffers = "${toString sharedBuffersMB} MB";
work_mem = "32 MB"; work_mem = "32 MB";
maintenance_work_mem = "420 MB"; maintenance_work_mem = "420 MB";
effective_cache_size = "22 GB"; 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 { systemd.tmpfiles.settings."10-postgresql"."/data/postgresql".d = lib.mkIf cfg.enable {
user = config.systemd.services.postgresql.serviceConfig.User; user = config.systemd.services.postgresql.serviceConfig.User;
group = config.systemd.services.postgresql.serviceConfig.Group; group = config.systemd.services.postgresql.serviceConfig.Group;
+38
View File
@@ -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);
};
}