Skip to content
peter-lawrey edited this page Dec 21, 2011 · 8 revisions

The Affinity Library lets you assign and release CPUs to threads.

Reserving some CPUs

You need reserve some CPUs for dedicated use. On Linux, you can do this by editing grub.conf under /boot/grub/grub.conf add this argument

isolcpus=2,3,6,7

assuming you have an i7. If you have a different processor(s) you need to look at /proc/cpuinfo to determine which combination are worth reserving. (A reboot is required)

Configuring irqbalance

In /etc/sysconfig/irqbalance you can set

IRQBALANCE_BANNED_CPUS=CC

However, I haven't go this to work and I turn off irqbalance instead.

$ sudo chkconfig irqbalance off

Assigning reserved CPUs on the command line.

With or without this you can set a bit mask of reserved CPUs with

-Daffinity.reserved=cc

This can be used to trial reserving CPUs, or if you have more than one program needing reserved CPUs (to ensure they don't try to use the same CPU)

Note: I won't be as effective as preventing other threads from using those CPUs.

Building the library

First you need to build the library for your platform on Linux.

  1. Check it out the source
  2. make the Makefile executable (on unix) chmod +x src/main/c/Makefile (You need gcc and make installed)
  3. Compile it with mvn compile
  4. Add the library libaffinity.so to your LD_LIBRARY_PATH or link it to you work directory.
  5. Build it with mvn test

What you can expect to see.

Try running vanilla.java.affinity.AffinitySupportMain and it should print something like

Estimated clock frequency was 3400 MHz
Assigning cpu 7 to Thread[main,5,main]
Assigning cpu 6 to Thread[reader,5,main]
Assigning cpu 3 to Thread[writer,5,main]
Releasing cpu 7 from Thread[main,5,main]
Assigning cpu 7 to Thread[engine,5,main]

The assignment of CPUs is
0: General use CPU
1: General use CPU
2: Reserved for this application
3: Thread[writer,5,main] alive=true
4: General use CPU
5: General use CPU
6: Thread[reader,5,main] alive=true
7: Thread[engine,5,main] alive=true

Releasing cpu 6 from Thread[reader,5,main]
Releasing cpu 3 from Thread[writer,5,main]
Releasing cpu 7 from Thread[engine,5,main]
Clone this wiki locally