How to Set CPU Affinity of a Process
There are a few ways to set a process’s CPU affinity. In this article, we will discuss a few options.
Web Server
Ngix
With Ngix on FreeBSD and Linux, you can bind worker processes to a set of CPUs using the worker_cpu_affinity directive. Please find the details here: Worker_cpu_affinity.
IIS
About how to configure CPU usage parameters and CPU actions that will be used in application pools, please refer to CPU Settings for an Application Pool.
Programming
PHP
With PHP, you can set affinity by running taskset program through system() call. For example, below binds the PHP process to cores 0 and 1:```php system(‘taskset -cp 0,1 ‘.getmypid());
### C++ code
On Linux, please refer to the following code snippet:```cpp
#define _GNU_SOURCE
#include <sched.h>
#include <stdio.h>
#include <sys/sysinfo.h>
int main()
{
cpu_set_t mask;
CPU_ZERO(&mask);
CPU_SET(0, &mask);
CPU_SET(1, &mask);
CPU_SET(2, &mask);
CPU_SET(3, &mask);
sched_setaffinity(0, sizeof(mask), &mask);
}
On Windows, please refer to the following code snippet:```cpp #include < Windows.h>
int main() { ::SetProcessAffinityMask(GetCurrentProcess(), 0xf/first 4 cpus/); }
## **Operating System**
### Linux
We can run the *taskset* program to set affinity. Get the CPU affinity of a process```shell
$ taskset –p 22445
pid 22445's current affinity list: 0-5
Set a process’s CPU affinity to 0-2 CPUs```shell $ taskset –pc 0-2 22445 pid 22445’s current affinity list: 0-5 pid 22445’s new affinity list: 0-2
Start a process with specified CPU affinity```shell
$ taskset –c 0-3 ./ReadBarcode
Reference: taskset
Windows OS
There are a few different methods to achieve this. Method 1: System-wide System-wide we can set the boot.ini setting to use /numproc=4 so that the machine only uses 4 cores irrespective of the number of cores available (provided that there are 4 or more cores available) Method 2: Task Manager First, select a process from Task Manager. Then, click “Set affinity”. Method 3: Start /affinity Launch a command window and run the highlighted commands as follows Run```shell cd C:\Windows\system32\inetsrv\
Run```shell
start /affinity 1F InetMgr.exe
Now you can check the affinity from the Task Manager or Process Explorer.
If you are using start /affinity, you will need to specify a hexadecimal value for affinity. There is a simple way to calculate affinity value. Here is how the processors will be numbered.
CPU ID Associated value (n) Formula (2n-1) Affinity in Hex (h) CPU0 1 1 1 CPU1 2 3 3 CPU2 4 7 7 CPU3 8 15 F CPU4 16 31 1F CPU5 32 63 3F CPU6 64 127 7F CPU7 128 255 FF Based on the formula above , you can run the following command. Replace h with the value in the Affinity column. This will result in using all the CPUs listed above the specified value including the current. Example: If you specify a value of 1F for affinity, it will use CPU4, CPU3, CPU2, CPU1, and CPU0.```shell Start /affinity h BarcodeReaderDemo.exe
If you want to use specific CPUs, you will need to SUM the associated values and use the corresponding HEX value. Example: If you want to run a process on CPU0 & CPU4, you can sum the values which is 0x11.```shell Start /affinity 11 BarcodeReaderDemo.exe