mirror of
https://github.com/NixOS/nixpkgs.git
synced 2025-07-12 05:16:25 +03:00
Merge pull request #221851 from Ma27/postgresql-jit-support
postgresql: implement opt-in JIT support
This commit is contained in:
commit
c2ae278eb8
11 changed files with 293 additions and 76 deletions
|
@ -171,3 +171,40 @@ self: super: {
|
|||
};
|
||||
}
|
||||
```
|
||||
|
||||
## JIT (Just-In-Time compilation) {#module-services-postgres-jit}
|
||||
|
||||
[JIT](https://www.postgresql.org/docs/current/jit-reason.html)-support in the PostgreSQL package
|
||||
is disabled by default because of the ~300MiB closure-size increase from the LLVM dependency. It
|
||||
can be optionally enabled in PostgreSQL with the following config option:
|
||||
|
||||
```nix
|
||||
{
|
||||
services.postgresql.enableJIT = true;
|
||||
}
|
||||
```
|
||||
|
||||
This makes sure that the [`jit`](https://www.postgresql.org/docs/current/runtime-config-query.html#GUC-JIT)-setting
|
||||
is set to `on` and a PostgreSQL package with JIT enabled is used. Further tweaking of the JIT compiler, e.g. setting a different
|
||||
query cost threshold via [`jit_above_cost`](https://www.postgresql.org/docs/current/runtime-config-query.html#GUC-JIT-ABOVE-COST)
|
||||
can be done manually via [`services.postgresql.settings`](#opt-services.postgresql.settings).
|
||||
|
||||
The attribute-names of JIT-enabled PostgreSQL packages are suffixed with `_jit`, i.e. for each `pkgs.postgresql`
|
||||
(and `pkgs.postgresql_<major>`) in `nixpkgs` there's also a `pkgs.postgresql_jit` (and `pkgs.postgresql_<major>_jit`).
|
||||
Alternatively, a JIT-enabled variant can be derived from a given `postgresql` package via `postgresql.withJIT`.
|
||||
This is also useful if it's not clear which attribute from `nixpkgs` was originally used (e.g. when working with
|
||||
[`config.services.postgresql.package`](#opt-services.postgresql.package) or if the package was modified via an
|
||||
overlay) since all modifications are propagated to `withJIT`. I.e.
|
||||
|
||||
```nix
|
||||
with import <nixpkgs> {
|
||||
overlays = [
|
||||
(self: super: {
|
||||
postgresql = super.postgresql.overrideAttrs (_: { pname = "foobar"; });
|
||||
})
|
||||
];
|
||||
};
|
||||
postgresql.withJIT.pname
|
||||
```
|
||||
|
||||
evaluates to `"foobar"`.
|
||||
|
|
|
@ -7,9 +7,18 @@ let
|
|||
cfg = config.services.postgresql;
|
||||
|
||||
postgresql =
|
||||
let
|
||||
# ensure that
|
||||
# services.postgresql = {
|
||||
# enableJIT = true;
|
||||
# package = pkgs.postgresql_<major>;
|
||||
# };
|
||||
# works.
|
||||
base = if cfg.enableJIT && !cfg.package.jitSupport then cfg.package.withJIT else cfg.package;
|
||||
in
|
||||
if cfg.extraPlugins == []
|
||||
then cfg.package
|
||||
else cfg.package.withPackages (_: cfg.extraPlugins);
|
||||
then base
|
||||
else base.withPackages (_: cfg.extraPlugins);
|
||||
|
||||
toStr = value:
|
||||
if true == value then "yes"
|
||||
|
@ -42,6 +51,8 @@ in
|
|||
|
||||
enable = mkEnableOption (lib.mdDoc "PostgreSQL Server");
|
||||
|
||||
enableJIT = mkEnableOption (lib.mdDoc "JIT support");
|
||||
|
||||
package = mkOption {
|
||||
type = types.package;
|
||||
example = literalExpression "pkgs.postgresql_11";
|
||||
|
@ -435,19 +446,21 @@ in
|
|||
log_line_prefix = cfg.logLinePrefix;
|
||||
listen_addresses = if cfg.enableTCPIP then "*" else "localhost";
|
||||
port = cfg.port;
|
||||
jit = mkDefault (if cfg.enableJIT then "on" else "off");
|
||||
};
|
||||
|
||||
services.postgresql.package = let
|
||||
mkThrow = ver: throw "postgresql_${ver} was removed, please upgrade your postgresql version.";
|
||||
base = if versionAtLeast config.system.stateVersion "22.05" then pkgs.postgresql_14
|
||||
else if versionAtLeast config.system.stateVersion "21.11" then pkgs.postgresql_13
|
||||
else if versionAtLeast config.system.stateVersion "20.03" then pkgs.postgresql_11
|
||||
else if versionAtLeast config.system.stateVersion "17.09" then mkThrow "9_6"
|
||||
else mkThrow "9_5";
|
||||
in
|
||||
# Note: when changing the default, make it conditional on
|
||||
# ‘system.stateVersion’ to maintain compatibility with existing
|
||||
# systems!
|
||||
mkDefault (if versionAtLeast config.system.stateVersion "22.05" then pkgs.postgresql_14
|
||||
else if versionAtLeast config.system.stateVersion "21.11" then pkgs.postgresql_13
|
||||
else if versionAtLeast config.system.stateVersion "20.03" then pkgs.postgresql_11
|
||||
else if versionAtLeast config.system.stateVersion "17.09" then mkThrow "9_6"
|
||||
else mkThrow "9_5");
|
||||
mkDefault (if cfg.enableJIT then base.withJIT else base);
|
||||
|
||||
services.postgresql.dataDir = mkDefault "/var/lib/postgresql/${cfg.package.psqlSchema}";
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue