aboutsummaryrefslogtreecommitdiff
path: root/doc
diff options
context:
space:
mode:
authorEelco Dolstra <edolstra@gmail.com>2019-08-08 15:49:13 +0200
committerEelco Dolstra <edolstra@gmail.com>2019-08-08 15:49:13 +0200
commit1d750e058738f92b378a6bfbdadb025d1463c243 (patch)
tree798ac85630df11dac35884c7c6c5bdd6be376bea /doc
parent336afe4d5fe374569c2b13d2db90caac663573b3 (diff)
parent05a10dd835923092b54fcad2276d54bf164c1b7f (diff)
Merge remote-tracking branch 'origin/master' into flakes
Diffstat (limited to 'doc')
-rw-r--r--doc/manual/advanced-topics/advanced-topics.xml2
-rw-r--r--doc/manual/advanced-topics/cores-vs-jobs.xml121
-rw-r--r--doc/manual/advanced-topics/post-build-hook.xml160
-rw-r--r--doc/manual/command-ref/conf-file.xml78
4 files changed, 354 insertions, 7 deletions
diff --git a/doc/manual/advanced-topics/advanced-topics.xml b/doc/manual/advanced-topics/advanced-topics.xml
index c304367aa..871b7eb1d 100644
--- a/doc/manual/advanced-topics/advanced-topics.xml
+++ b/doc/manual/advanced-topics/advanced-topics.xml
@@ -7,6 +7,8 @@
<title>Advanced Topics</title>
<xi:include href="distributed-builds.xml" />
+<xi:include href="cores-vs-jobs.xml" />
<xi:include href="diff-hook.xml" />
+<xi:include href="post-build-hook.xml" />
</part>
diff --git a/doc/manual/advanced-topics/cores-vs-jobs.xml b/doc/manual/advanced-topics/cores-vs-jobs.xml
new file mode 100644
index 000000000..eba645faf
--- /dev/null
+++ b/doc/manual/advanced-topics/cores-vs-jobs.xml
@@ -0,0 +1,121 @@
+<chapter xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ version="5.0"
+ xml:id="chap-tuning-cores-and-jobs">
+
+<title>Tuning Cores and Jobs</title>
+
+<para>Nix has two relevant settings with regards to how your CPU cores
+will be utilized: <xref linkend="conf-cores" /> and
+<xref linkend="conf-max-jobs" />. This chapter will talk about what
+they are, how they interact, and their configuration trade-offs.</para>
+
+<variablelist>
+ <varlistentry>
+ <term><xref linkend="conf-max-jobs" /></term>
+ <listitem><para>
+ Dictates how many separate derivations will be built at the same
+ time. If you set this to zero, the local machine will do no
+ builds. Nix will still substitute from binary caches, and build
+ remotely if remote builders are configured.
+ </para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><xref linkend="conf-cores" /></term>
+ <listitem><para>
+ Suggests how many cores each derivation should use. Similar to
+ <command>make -j</command>.
+ </para></listitem>
+ </varlistentry>
+</variablelist>
+
+<para>The <xref linkend="conf-cores" /> setting determines the value of
+<envar>NIX_BUILD_CORES</envar>. <envar>NIX_BUILD_CORES</envar> is equal
+to <xref linkend="conf-cores" />, unless <xref linkend="conf-cores" />
+equals <literal>0</literal>, in which case <envar>NIX_BUILD_CORES</envar>
+will be the total number of cores in the system.</para>
+
+<para>The total number of consumed cores is a simple multiplication,
+<xref linkend="conf-cores" /> * <envar>NIX_BUILD_CORES</envar>.</para>
+
+<para>The balance on how to set these two independent variables depends
+upon each builder's workload and hardware. Here are a few example
+scenarios on a machine with 24 cores:</para>
+
+<table>
+ <caption>Balancing 24 Build Cores</caption>
+ <thead>
+ <tr>
+ <th><xref linkend="conf-max-jobs" /></th>
+ <th><xref linkend="conf-cores" /></th>
+ <th><envar>NIX_BUILD_CORES</envar></th>
+ <th>Maximum Processes</th>
+ <th>Result</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td>1</td>
+ <td>24</td>
+ <td>24</td>
+ <td>24</td>
+ <td>
+ One derivation will be built at a time, each one can use 24
+ cores. Undersold if a job can’t use 24 cores.
+ </td>
+ </tr>
+
+ <tr>
+ <td>4</td>
+ <td>6</td>
+ <td>6</td>
+ <td>24</td>
+ <td>
+ Four derivations will be built at once, each given access to
+ six cores.
+ </td>
+ </tr>
+ <tr>
+ <td>12</td>
+ <td>6</td>
+ <td>6</td>
+ <td>72</td>
+ <td>
+ 12 derivations will be built at once, each given access to six
+ cores. This configuration is over-sold. If all 12 derivations
+ being built simultaneously try to use all six cores, the
+ machine's performance will be degraded due to extensive context
+ switching between the 12 builds.
+ </td>
+ </tr>
+ <tr>
+ <td>24</td>
+ <td>1</td>
+ <td>1</td>
+ <td>24</td>
+ <td>
+ 24 derivations can build at the same time, each using a single
+ core. Never oversold, but derivations which require many cores
+ will be very slow to compile.
+ </td>
+ </tr>
+ <tr>
+ <td>24</td>
+ <td>0</td>
+ <td>24</td>
+ <td>576</td>
+ <td>
+ 24 derivations can build at the same time, each using all the
+ available cores of the machine. Very likely to be oversold,
+ and very likely to suffer context switches.
+ </td>
+ </tr>
+ </tbody>
+</table>
+
+<para>It is up to the derivations' build script to respect
+host's requested cores-per-build by following the value of the
+<envar>NIX_BUILD_CORES</envar> environment variable.</para>
+
+</chapter>
diff --git a/doc/manual/advanced-topics/post-build-hook.xml b/doc/manual/advanced-topics/post-build-hook.xml
new file mode 100644
index 000000000..3dc43ee79
--- /dev/null
+++ b/doc/manual/advanced-topics/post-build-hook.xml
@@ -0,0 +1,160 @@
+<chapter xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xml:id="chap-post-build-hook"
+ version="5.0"
+ >
+
+<title>Using the <xref linkend="conf-post-build-hook" /></title>
+<subtitle>Uploading to an S3-compatible binary cache after each build</subtitle>
+
+
+<section xml:id="chap-post-build-hook-caveats">
+ <title>Implementation Caveats</title>
+ <para>Here we use the post-build hook to upload to a binary cache.
+ This is a simple and working example, but it is not suitable for all
+ use cases.</para>
+
+ <para>The post build hook program runs after each executed build,
+ and blocks the build loop. The build loop exits if the hook program
+ fails.</para>
+
+ <para>Concretely, this implementation will make Nix slow or unusable
+ when the internet is slow or unreliable.</para>
+
+ <para>A more advanced implementation might pass the store paths to a
+ user-supplied daemon or queue for processing the store paths outside
+ of the build loop.</para>
+</section>
+
+<section>
+ <title>Prerequisites</title>
+
+ <para>
+ This tutorial assumes you have configured an S3-compatible binary cache
+ according to the instructions at
+ <xref linkend="ssec-s3-substituter-authenticated-writes" />, and
+ that the <literal>root</literal> user's default AWS profile can
+ upload to the bucket.
+ </para>
+</section>
+
+<section>
+ <title>Set up a Signing Key</title>
+ <para>Use <command>nix-store --generate-binary-cache-key</command> to
+ create our public and private signing keys. We will sign paths
+ with the private key, and distribute the public key for verifying
+ the authenticity of the paths.</para>
+
+ <screen>
+# nix-store --generate-binary-cache-key example-nix-cache-1 /etc/nix/key.private /etc/nix/key.public
+# cat /etc/nix/key.public
+example-nix-cache-1:1/cKDz3QCCOmwcztD2eV6Coggp6rqc9DGjWv7C0G+rM=
+</screen>
+
+<para>Then, add the public key and the cache URL to your
+<filename>nix.conf</filename>'s <xref linkend="conf-trusted-public-keys" />
+and <xref linkend="conf-substituters" /> like:</para>
+
+<programlisting>
+substituters = https://cache.nixos.org/ s3://example-nix-cache
+trusted-public-keys = cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY= example-nix-cache-1:1/cKDz3QCCOmwcztD2eV6Coggp6rqc9DGjWv7C0G+rM=
+</programlisting>
+
+<para>we will restart the Nix daemon a later step.</para>
+</section>
+
+<section>
+ <title>Implementing the build hook</title>
+ <para>Write the following script to
+ <filename>/etc/nix/upload-to-cache.sh</filename>:
+ </para>
+
+ <programlisting>
+#!/bin/sh
+
+set -eu
+set -f # disable globbing
+export IFS=' '
+
+echo "Signing paths" $OUT_PATHS
+nix sign-paths --key-file /etc/nix/key.private $OUT_PATHS
+echo "Uploading paths" $OUT_PATHS
+exec nix copy --to 's3://example-nix-cache' $OUT_PATHS
+</programlisting>
+
+ <note>
+ <title>Should <literal>$OUT_PATHS</literal> be quoted?</title>
+ <para>
+ The <literal>$OUT_PATHS</literal> variable is a space-separated
+ list of Nix store paths. In this case, we expect and want the
+ shell to perform word splitting to make each output path its
+ own argument to <command>nix sign-paths</command>. Nix guarantees
+ the paths will not contain any spaces, however a store path
+ might contain glob characters. The <command>set -f</command>
+ disables globbing in the shell.
+ </para>
+ </note>
+ <para>
+ Then make sure the hook program is executable by the <literal>root</literal> user:
+ <screen>
+# chmod +x /etc/nix/upload-to-cache.sh
+</screen></para>
+</section>
+
+<section>
+ <title>Updating Nix Configuration</title>
+
+ <para>Edit <filename>/etc/nix/nix.conf</filename> to run our hook,
+ by adding the following configuration snippet at the end:</para>
+
+ <programlisting>
+post-build-hook = /etc/nix/upload-to-cache.sh
+</programlisting>
+
+<para>Then, restart the <command>nix-daemon</command>.</para>
+</section>
+
+<section>
+ <title>Testing</title>
+
+ <para>Build any derivation, for example:</para>
+
+ <screen>
+$ nix-build -E '(import &lt;nixpkgs&gt; {}).writeText "example" (builtins.toString builtins.currentTime)'
+these derivations will be built:
+ /nix/store/s4pnfbkalzy5qz57qs6yybna8wylkig6-example.drv
+building '/nix/store/s4pnfbkalzy5qz57qs6yybna8wylkig6-example.drv'...
+running post-build-hook '/home/grahamc/projects/github.com/NixOS/nix/post-hook.sh'...
+post-build-hook: Signing paths /nix/store/ibcyipq5gf91838ldx40mjsp0b8w9n18-example
+post-build-hook: Uploading paths /nix/store/ibcyipq5gf91838ldx40mjsp0b8w9n18-example
+/nix/store/ibcyipq5gf91838ldx40mjsp0b8w9n18-example
+</screen>
+
+ <para>Then delete the path from the store, and try substituting it from the binary cache:</para>
+ <screen>
+$ rm ./result
+$ nix-store --delete /nix/store/ibcyipq5gf91838ldx40mjsp0b8w9n18-example
+</screen>
+
+<para>Now, copy the path back from the cache:</para>
+<screen>
+$ nix store --realize /nix/store/ibcyipq5gf91838ldx40mjsp0b8w9n18-example
+copying path '/nix/store/m8bmqwrch6l3h8s0k3d673xpmipcdpsa-example from 's3://example-nix-cache'...
+warning: you did not specify '--add-root'; the result might be removed by the garbage collector
+/nix/store/m8bmqwrch6l3h8s0k3d673xpmipcdpsa-example
+</screen>
+</section>
+<section>
+ <title>Conclusion</title>
+ <para>
+ We now have a Nix installation configured to automatically sign and
+ upload every local build to a remote binary cache.
+ </para>
+
+ <para>
+ Before deploying this to production, be sure to consider the
+ implementation caveats in <xref linkend="chap-post-build-hook-caveats" />.
+ </para>
+</section>
+</chapter>
diff --git a/doc/manual/command-ref/conf-file.xml b/doc/manual/command-ref/conf-file.xml
index 09aad2e05..c7b540892 100644
--- a/doc/manual/command-ref/conf-file.xml
+++ b/doc/manual/command-ref/conf-file.xml
@@ -238,8 +238,9 @@ false</literal>.</para>
linkend='opt-cores'>--cores</option> command line switch and
defaults to <literal>1</literal>. The value <literal>0</literal>
means that the builder should use all available CPU cores in the
- system.</para></listitem>
+ system.</para>
+ <para>See also <xref linkend="chap-tuning-cores-and-jobs" />.</para></listitem>
</varlistentry>
<varlistentry xml:id="conf-diff-hook"><term><literal>diff-hook</literal></term>
@@ -482,8 +483,10 @@ builtins.fetchurl {
<varlistentry xml:id="conf-max-free"><term><literal>max-free</literal></term>
- <listitem><para>This option defines after how many free bytes to stop collecting
- garbage once the <literal>min-free</literal> condition gets triggered.</para></listitem>
+ <listitem><para>When a garbage collection is triggered by the
+ <literal>min-free</literal> option, it stops as soon as
+ <literal>max-free</literal> bytes are available. The default is
+ infinity (i.e. delete all garbage).</para></listitem>
</varlistentry>
@@ -498,7 +501,10 @@ builtins.fetchurl {
regardless). It can be
overridden using the <option
linkend='opt-max-jobs'>--max-jobs</option> (<option>-j</option>)
- command line switch.</para></listitem>
+ command line switch.</para>
+
+ <para>See also <xref linkend="chap-tuning-cores-and-jobs" />.</para>
+ </listitem>
</varlistentry>
<varlistentry xml:id="conf-max-silent-time"><term><literal>max-silent-time</literal></term>
@@ -524,9 +530,11 @@ builtins.fetchurl {
<varlistentry xml:id="conf-min-free"><term><literal>min-free</literal></term>
<listitem>
- <para>When the disk reaches <literal>min-free</literal> bytes of free disk space during a build, nix
- will start to garbage-collection until <literal>max-free</literal> bytes are available on the disk.
- A value of <literal>0</literal> (the default) means that this feature is disabled.</para>
+ <para>When free disk space in <filename>/nix/store</filename>
+ drops below <literal>min-free</literal> during a build, Nix
+ performs a garbage-collection until <literal>max-free</literal>
+ bytes are available or there is no more garbage. A value of
+ <literal>0</literal> (the default) disables this feature.</para>
</listitem>
</varlistentry>
@@ -656,6 +664,62 @@ password <replaceable>my-password</replaceable>
</varlistentry>
+ <varlistentry xml:id="conf-post-build-hook">
+ <term><literal>post-build-hook</literal></term>
+ <listitem>
+ <para>Optional. The path to a program to execute after each build.</para>
+
+ <para>This option is only settable in the global
+ <filename>nix.conf</filename>, or on the command line by trusted
+ users.</para>
+
+ <para>When using the nix-daemon, the daemon executes the hook as
+ <literal>root</literal>. If the nix-daemon is not involved, the
+ hook runs as the user executing the nix-build.</para>
+
+ <itemizedlist>
+ <listitem><para>The hook executes after an evaluation-time build.</para></listitem>
+ <listitem><para>The hook does not execute on substituted paths.</para></listitem>
+ <listitem><para>The hook's output always goes to the user's terminal.</para></listitem>
+ <listitem><para>If the hook fails, the build succeeds but no further builds execute.</para></listitem>
+ <listitem><para>The hook executes synchronously, and blocks other builds from progressing while it runs.</para></listitem>
+ </itemizedlist>
+
+ <para>The program executes with no arguments. The program's environment
+ contains the following environment variables:</para>
+
+ <variablelist>
+ <varlistentry>
+ <term><envar>DRV_PATH</envar></term>
+ <listitem>
+ <para>The derivation for the built paths.</para>
+ <para>Example:
+ <literal>/nix/store/5nihn1a7pa8b25l9zafqaqibznlvvp3f-bash-4.4-p23.drv</literal>
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><envar>OUT_PATHS</envar></term>
+ <listitem>
+ <para>Output paths of the built derivation, separated by a space character.</para>
+ <para>Example:
+ <literal>/nix/store/zf5lbh336mnzf1nlswdn11g4n2m8zh3g-bash-4.4-p23-dev
+ /nix/store/rjxwxwv1fpn9wa2x5ssk5phzwlcv4mna-bash-4.4-p23-doc
+ /nix/store/6bqvbzjkcp9695dq0dpl5y43nvy37pq1-bash-4.4-p23-info
+ /nix/store/r7fng3kk3vlpdlh2idnrbn37vh4imlj2-bash-4.4-p23-man
+ /nix/store/xfghy8ixrhz3kyy6p724iv3cxji088dx-bash-4.4-p23</literal>.
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ <para>See <xref linkend="chap-post-build-hook" /> for an example
+ implementation.</para>
+
+ </listitem>
+ </varlistentry>
+
<varlistentry xml:id="conf-repeat"><term><literal>repeat</literal></term>
<listitem><para>How many times to repeat builds to check whether