9

I'm trying to run some benchmarks on a multicore machine and I'd like to tell the Linux kernel to simply avoid certain cores unless explicitly told to use them.

The idea is that I could set aside a handful of cores (the machine has 6 physical cores) for benchmarking and use cpu mask to allow only benchmark processes onto the given cores.

Is this feasible?

2

2 Answers 2

6

You could isolate some cpu cores from kernel scheduling using isolcpus parameter. Add this parameter to your grub.conf and reboot to take effect.

1
  • 2
    The link is dead. Might be best to include an example directly in the answer.
    – pchaigno
    Jun 11, 2018 at 9:02
4

You want some processor affinity (or CPU affinity).

The relevant syscall is sched_setaffinity(2), but you should use it thru pthread_set_affinity_np(3) if you want to code your benchmarks for that.

The related command is taskset(1) and you might use it on the commands you want to benchmark (or on your shell).

If possible, take care that the machine is not loaded a lot by other tasks unrelated to the benchmark.

Alternatively, use some hypervisor like Xen, and boot your Linux as a guest OS for that hypervisor. Then configure xen to use only some restricted set of CPU cores (I don't know the exact details, you need to find out). On Debian (and related) distributions, you might install packages like xen-linux-system-amd64, xen-hypervisor-amd64, xen-utils etc (I'm using on Debian/Sid xen-hypervisor-4.5-amd64, xen-linux-system-4.0.0-1-amd64, xen-utils-4.5 etc...).

There might be perhaps some way of configuring (perhaps at kernel-compilation time, or by passing specific arguments to the kernel thru Grub loader) your Linux kernel to restrict the number of usable cores.

Of course, it is better, when benchmarking some program -e.g. on a desktop Linux PC-, to take care to avoid having many outside running processes (use ps auxw, pstree -p, top to find these). At least, close and quit most interactive applications (browser like firefox, email, editor, IDEs like Eclipse) and keep only a small number of terminals to benchmark. You might even benchmark in batch mode (using batch or at to run the benchmarks) while you are not even logged in (so don't have any GUI sessions à la Gnome or KDE or Xfce, etc... running).

4
  • Setting the affinity of the tasks to benchmark is not enough. You've got to also keep other tasks away. Which your hypervisor suggestion does, but in a very heavy-handed way. Jun 9, 2015 at 21:02
  • @Gilles: why is keeping other tasks away needed for benchmarking purposes? In practice, when benchmarking, the PC is often quite idle... For a costly server things are different! Jun 10, 2015 at 4:41
  • For example because you're benchmarking on your desktop PC which is also spending resources on Firefox, Eclipse and other highly demanding tasks. Jun 10, 2015 at 7:48
  • On your own desktop PC, you can quite easily stop most consuming tasks (e.g. close & quit firefox & eclipse) while benchmarking. You could even run the benchmarks in batch mode (using at or batch) while you are not logged in (so don't run any consuming session). Jun 10, 2015 at 7:54

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .