121 lines
		
	
	
	
		
			3.7 KiB
		
	
	
	
		
			XML
		
	
	
	
	
	
			
		
		
	
	
			121 lines
		
	
	
	
		
			3.7 KiB
		
	
	
	
		
			XML
		
	
	
	
	
	
| <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>
 |