# Using LaunchKernels to launch kernels with lower priorities

On windows the kernels launched with LaunchKernels are starred with "Below Normal" priority.

Is there a way to start them with even lower priority (eg. "Idle")?

I'm doing some intensive numerical analysis on my computer, which becomes really unresposive while the analysis is running. If I manually lower the priority of the kernels (eg from ProcessExplorer) then I'm able to work normally. But manually finding the processes every 10 minutes becomes tedious. Of course I could just launch fewer kernels than I have cores, but that seems inelegant.

Bonus points for a cross-platform solution:)

-
Does the "Run kernels at a lower process priority" checkbox in the preferences not do what you need? –  acl Jun 20 '12 at 11:52
@acl I already have this checked. I would need a "Run kernels at idle process priority" checkbox:) –  Ajasja Jun 20 '12 at 12:07
Couldn't you not just launch all kernels minus one, so that you can work on the last one? –  Sjoerd C. de Vries Jun 20 '12 at 12:19
@SjoerdC.deVries Yes, of course I could (I mentioned that in the question). But I think of that as a last resort, because I would loose that core for calculation. Normal office workflow is not very CPU intensive. I want Word or a browser to open quickly and then I stare for a for some seconds at the screen while the CPU does nothing useful... –  Ajasja Jun 20 '12 at 13:20
I use Mathematica's parallel computation capabilities every day. In my experience it does what it does very well as long as one keeps everything pretty basic and don't disturb or try to abort parallel computations. I've also run into problems like locking up of remote machines and Mathematica crashing when I've attempted to configure it beyond default settings. To be fair, that may reflect more on my code than on the the support for parallel processing, but it does seem to do best when I keep things a simple as possible. –  Jagra Jun 20 '12 at 14:15

Here are two possible approaches.

### Using initialization code

Firstly, one notes that the process priority is set (in AddOns/Applications/SubKernels/LocalKernels.m) using

SetSystemOptions["ProcessPriority" -> -1];


where the numeric value corresponds to a priority as follows:

• -2: low
• -1: below normal
• 0: normal
• 1: above normal
• 2: high

Process priorities on Windows are rather complex and it doesn't seem like there's a way to set idle priority directly, but low will probably be good enough. To execute this code in each subkernel after launch, you just need to evaluate:

Needs["ParallelDeveloper"]; (* Load required package *)
$InitCode = Hold[SystemSetSystemOptions["ProcessPriority" -> -2];];  and now each kernel's process priority will change from normal to low shortly after it starts. ### Starting local kernels as if they were remote Another, Windows-specific, approach is as follows. I will use this essentially as an excuse to post the command needed to start remote kernels on Windows where we usually do not have ssh available; I found the widely cited Remote Kernel Strategies presentation less than helpful here and devised this alternative, which I believe works better than other approaches. We use the rcmd/rcmdsvc executables from the Windows 2000 Resource Kit, which must be installed first (although the installation is utterly trivial). Mathematica's installation directory must also be in the system's PATH environment variable for the math command to execute properly on the remote computer (even if in reality this is the same as the local computer). We now change SubKernelsRemoteKernels$RemoteCommand as follows:

SubKernelsRemoteKernels$RemoteCommand := "runas /savedcreds /user:\"3\" /noprofile \"rcmd \\\\1 start /b " <> If[SubKernelsLocalKernelsPrivatelowerprio, "/LOW", "/NORMAL"] <> " math -noinit -subkernel -mathlink -linkmode Connect 4 -linkname 2\"";  The username (slot 3) defaults to the username of the logged-on user but can be changed using e.g. SubKernelsRemoteKernels$RemoteUserName = "mathematica";


Each remote kernel configured with this option will start with reduced priority, depending on whether or not the option is set for local kernels. While it isn't ideal for the process priority for remote kernels to be set using the tickbox on the Local Kernels tab, this option has to be set somewhere and short of adding our own checkbox this seemed like the most reasonable choice. Remote hosts can also be used, of course, if you have them available; if you want to save this command line for each of the hosts set up (say, you want to set up both Windows and Linux hosts, and need to use a different command line for each) then tick the "Use custom launch command" box when configuring the host.

-
Thank you and a big +1! An unrelated question: Any reason why you prefer rcmd over the multitude of ssh servers for windows? –  Ajasja Jun 20 '12 at 15:25
@Ajasja because it's easy to install and more tightly integrated with the Windows way of doing things (for example, communication is done using a named pipe) so you don't have to set up user accounts or do any other configuration beyond what already exists in Windows. If you're on a domain, everything's in place already. I frequently use OpenSSH under Cygwin to access Linux hosts, but it's complicated to set up and not really necessary for Windows-to-Windows communication, especially on a local network. (I assume nobody would run remote kernels on computers only accessible via the Internet.) –  Oleksandr R. Jun 20 '12 at 15:43
Just to mention: I have to add Unprotect[ParallelDeveloper$InitCode] for this to work. – Ajasja Jun 21 '12 at 13:08 @Ajasja Alright... sorry, I forgot to mention that you have to load the ParallelDeveloper package first. I think you've probably not launched any kernels or loaded the package before doing this, so please see the edit. :) – Oleksandr R. Jun 23 '12 at 0:21 Mathematica's installation directory must also be in the system's PATH even if you specify the whole file name to the kernel! – Ajasja Nov 27 '12 at 12:02 This works on Windows to start the subkernels with low priority, though I think Oleksandr's approach is better. Needs["SubKernelsLocalKernels"] Block[{$mathkernel=\$mathkernel<>" -threadpriority=-2"},LaunchKernels[]]
`
-