tzfile.5, tzselect.8: sync from tzdb upstream
[man-pages.git] / man2 / sched_setaffinity.2
blob86a93539137de8765b43548d8e5254f676a82fea
1 .\" Copyright (C) 2002 Robert Love
2 .\" and Copyright (C) 2006, 2015 Michael Kerrisk
3 .\"
4 .\" SPDX-License-Identifier: GPL-2.0-or-later
5 .\"
6 .\" 2002-11-19 Robert Love <rml@tech9.net> - initial version
7 .\" 2004-04-20 mtk - fixed description of return value
8 .\" 2004-04-22 aeb - added glibc prototype history
9 .\" 2005-05-03 mtk - noted that sched_setaffinity may cause thread
10 .\"     migration and that CPU affinity is a per-thread attribute.
11 .\" 2006-02-03 mtk -- Major rewrite
12 .\" 2008-11-12, mtk, removed CPU_*() macro descriptions to a
13 .\" separate CPU_SET(3) page.
14 .\"
15 .TH sched_setaffinity 2 (date) "Linux man-pages (unreleased)"
16 .SH NAME
17 sched_setaffinity, sched_getaffinity \- \
18 set and get a thread's CPU affinity mask
19 .SH LIBRARY
20 Standard C library
21 .RI ( libc ", " \-lc )
22 .SH SYNOPSIS
23 .nf
24 .BR "#define _GNU_SOURCE" "             /* See feature_test_macros(7) */"
25 .B #include <sched.h>
26 .PP
27 .BI "int sched_setaffinity(pid_t " pid ", size_t " cpusetsize ,
28 .BI "                      const cpu_set_t *" mask );
29 .BI "int sched_getaffinity(pid_t " pid ", size_t " cpusetsize ,
30 .BI "                      cpu_set_t *" mask );
31 .fi
32 .SH DESCRIPTION
33 A thread's CPU affinity mask determines the set of CPUs on which
34 it is eligible to run.
35 On a multiprocessor system, setting the CPU affinity mask
36 can be used to obtain performance benefits.
37 For example,
38 by dedicating one CPU to a particular thread
39 (i.e., setting the affinity mask of that thread to specify a single CPU,
40 and setting the affinity mask of all other threads to exclude that CPU),
41 it is possible to ensure maximum execution speed for that thread.
42 Restricting a thread to run on a single CPU also avoids
43 the performance cost caused by the cache invalidation that occurs
44 when a thread ceases to execute on one CPU and then
45 recommences execution on a different CPU.
46 .PP
47 A CPU affinity mask is represented by the
48 .I cpu_set_t
49 structure, a "CPU set", pointed to by
50 .IR mask .
51 A set of macros for manipulating CPU sets is described in
52 .BR CPU_SET (3).
53 .PP
54 .BR sched_setaffinity ()
55 sets the CPU affinity mask of the thread whose ID is
56 .I pid
57 to the value specified by
58 .IR mask .
60 .I pid
61 is zero, then the calling thread is used.
62 The argument
63 .I cpusetsize
64 is the length (in bytes) of the data pointed to by
65 .IR mask .
66 Normally this argument would be specified as
67 .IR "sizeof(cpu_set_t)" .
68 .PP
69 If the thread specified by
70 .I pid
71 is not currently running on one of the CPUs specified in
72 .IR mask ,
73 then that thread is migrated to one of the CPUs specified in
74 .IR mask .
75 .PP
76 .BR sched_getaffinity ()
77 writes the affinity mask of the thread whose ID is
78 .I pid
79 into the
80 .I cpu_set_t
81 structure pointed to by
82 .IR mask .
83 The
84 .I cpusetsize
85 argument specifies the size (in bytes) of
86 .IR mask .
88 .I pid
89 is zero, then the mask of the calling thread is returned.
90 .SH RETURN VALUE
91 On success,
92 .BR sched_setaffinity ()
93 and
94 .BR sched_getaffinity ()
95 return 0 (but see "C library/kernel differences" below,
96 which notes that the underlying
97 .BR sched_getaffinity ()
98 differs in its return value).
99 On failure, \-1 is returned, and
100 .I errno
101 is set to indicate the error.
102 .SH ERRORS
104 .B EFAULT
105 A supplied memory address was invalid.
107 .B EINVAL
108 The affinity bit mask
109 .I mask
110 contains no processors that are currently physically on the system
111 and permitted to the thread according to any restrictions that
112 may be imposed by
113 .I cpuset
114 cgroups or the "cpuset" mechanism described in
115 .BR cpuset (7).
117 .B EINVAL
118 .RB ( sched_getaffinity ()
119 and, before Linux 2.6.9,
120 .BR sched_setaffinity ())
121 .I cpusetsize
122 is smaller than the size of the affinity mask used by the kernel.
124 .B EPERM
125 .RB ( sched_setaffinity ())
126 The calling thread does not have appropriate privileges.
127 The caller needs an effective user ID equal to the real user ID
128 or effective user ID of the thread identified by
129 .IR pid ,
130 or it must possess the
131 .B CAP_SYS_NICE
132 capability in the user namespace of the thread
133 .IR pid .
135 .B ESRCH
136 The thread whose ID is \fIpid\fP could not be found.
137 .SH VERSIONS
138 The CPU affinity system calls were introduced in Linux kernel 2.5.8.
139 The system call wrappers were introduced in glibc 2.3.
140 Initially, the glibc interfaces included a
141 .I cpusetsize
142 argument, typed as
143 .IR "unsigned int" .
144 In glibc 2.3.3, the
145 .I cpusetsize
146 argument was removed, but was then restored in glibc 2.3.4, with type
147 .IR size_t .
148 .SH STANDARDS
149 These system calls are Linux-specific.
150 .SH NOTES
151 After a call to
152 .BR sched_setaffinity (),
153 the set of CPUs on which the thread will actually run is
154 the intersection of the set specified in the
155 .I mask
156 argument and the set of CPUs actually present on the system.
157 The system may further restrict the set of CPUs on which the thread
158 runs if the "cpuset" mechanism described in
159 .BR cpuset (7)
160 is being used.
161 These restrictions on the actual set of CPUs on which the thread
162 will run are silently imposed by the kernel.
164 There are various ways of determining the number of CPUs
165 available on the system, including: inspecting the contents of
166 .IR /proc/cpuinfo ;
167 using
168 .BR sysconf (3)
169 to obtain the values of the
170 .B _SC_NPROCESSORS_CONF
172 .B _SC_NPROCESSORS_ONLN
173 parameters; and inspecting the list of CPU directories under
174 .IR /sys/devices/system/cpu/ .
176 .BR sched (7)
177 has a description of the Linux scheduling scheme.
179 The affinity mask is a per-thread attribute that can be
180 adjusted independently for each of the threads in a thread group.
181 The value returned from a call to
182 .BR gettid (2)
183 can be passed in the argument
184 .IR pid .
185 Specifying
186 .I pid
187 as 0 will set the attribute for the calling thread,
188 and passing the value returned from a call to
189 .BR getpid (2)
190 will set the attribute for the main thread of the thread group.
191 (If you are using the POSIX threads API, then use
192 .BR pthread_setaffinity_np (3)
193 instead of
194 .BR sched_setaffinity ().)
197 .I isolcpus
198 boot option can be used to isolate one or more CPUs at boot time,
199 so that no processes are scheduled onto those CPUs.
200 Following the use of this boot option,
201 the only way to schedule processes onto the isolated CPUs is via
202 .BR sched_setaffinity ()
203 or the
204 .BR cpuset (7)
205 mechanism.
206 For further information, see the kernel source file
207 .IR Documentation/admin\-guide/kernel\-parameters.txt .
208 As noted in that file,
209 .I isolcpus
210 is the preferred mechanism of isolating CPUs
211 (versus the alternative of manually setting the CPU affinity
212 of all processes on the system).
214 A child created via
215 .BR fork (2)
216 inherits its parent's CPU affinity mask.
217 The affinity mask is preserved across an
218 .BR execve (2).
219 .SS C library/kernel differences
220 This manual page describes the glibc interface for the CPU affinity calls.
221 The actual system call interface is slightly different, with the
222 .I mask
223 being typed as
224 .IR "unsigned long\ *" ,
225 reflecting the fact that the underlying implementation of CPU
226 sets is a simple bit mask.
228 On success, the raw
229 .BR sched_getaffinity ()
230 system call returns the number of bytes placed copied into the
231 .I mask
232 buffer;
233 this will be the minimum of
234 .I cpusetsize
235 and the size (in bytes) of the
236 .I cpumask_t
237 data type that is used internally by the kernel to
238 represent the CPU set bit mask.
239 .SS Handling systems with large CPU affinity masks
240 The underlying system calls (which represent CPU masks as bit masks of type
241 .IR "unsigned long\ *" )
242 impose no restriction on the size of the CPU mask.
243 However, the
244 .I cpu_set_t
245 data type used by glibc has a fixed size of 128 bytes,
246 meaning that the maximum CPU number that can be represented is 1023.
247 .\" FIXME . See https://sourceware.org/bugzilla/show_bug.cgi?id=15630
248 .\" and https://sourceware.org/ml/libc-alpha/2013-07/msg00288.html
249 If the kernel CPU affinity mask is larger than 1024,
250 then calls of the form:
252 .in +4n
254 sched_getaffinity(pid, sizeof(cpu_set_t), &mask);
258 fail with the error
259 .BR EINVAL ,
260 the error produced by the underlying system call for the case where the
261 .I mask
262 size specified in
263 .I cpusetsize
264 is smaller than the size of the affinity mask used by the kernel.
265 (Depending on the system CPU topology, the kernel affinity mask can
266 be substantially larger than the number of active CPUs in the system.)
268 When working on systems with large kernel CPU affinity masks,
269 one must dynamically allocate the
270 .I mask
271 argument (see
272 .BR CPU_ALLOC (3)).
273 Currently, the only way to do this is by probing for the size
274 of the required mask using
275 .BR sched_getaffinity ()
276 calls with increasing mask sizes (until the call does not fail with the error
277 .BR EINVAL ).
279 Be aware that
280 .BR CPU_ALLOC (3)
281 may allocate a slightly larger CPU set than requested
282 (because CPU sets are implemented as bit masks allocated in units of
283 .IR sizeof(long) ).
284 Consequently,
285 .BR sched_getaffinity ()
286 can set bits beyond the requested allocation size, because the kernel
287 sees a few additional bits.
288 Therefore, the caller should iterate over the bits in the returned set,
289 counting those which are set, and stop upon reaching the value returned by
290 .BR CPU_COUNT (3)
291 (rather than iterating over the number of bits
292 requested to be allocated).
293 .SH EXAMPLES
294 The program below creates a child process.
295 The parent and child then each assign themselves to a specified CPU
296 and execute identical loops that consume some CPU time.
297 Before terminating, the parent waits for the child to complete.
298 The program takes three command-line arguments:
299 the CPU number for the parent,
300 the CPU number for the child,
301 and the number of loop iterations that both processes should perform.
303 As the sample runs below demonstrate, the amount of real and CPU time
304 consumed when running the program will depend on intra-core caching effects
305 and whether the processes are using the same CPU.
307 We first employ
308 .BR lscpu (1)
309 to determine that this (x86)
310 system has two cores, each with two CPUs:
312 .in +4n
314 $ \fBlscpu | egrep \-i \[aq]core.*:|socket\[aq]\fP
315 Thread(s) per core:    2
316 Core(s) per socket:    2
317 Socket(s):             1
321 We then time the operation of the example program for three cases:
322 both processes running on the same CPU;
323 both processes running on different CPUs on the same core;
324 and both processes running on different CPUs on different cores.
326 .in +4n
328 $ \fBtime \-p ./a.out 0 0 100000000\fP
329 real 14.75
330 user 3.02
331 sys 11.73
332 $ \fBtime \-p ./a.out 0 1 100000000\fP
333 real 11.52
334 user 3.98
335 sys 19.06
336 $ \fBtime \-p ./a.out 0 3 100000000\fP
337 real 7.89
338 user 3.29
339 sys 12.07
342 .SS Program source
344 .\" SRC BEGIN (sched_setaffinity.c)
346 #define _GNU_SOURCE
347 #include <err.h>
348 #include <sched.h>
349 #include <stdio.h>
350 #include <stdlib.h>
351 #include <sys/wait.h>
352 #include <unistd.h>
355 main(int argc, char *argv[])
357     int           parentCPU, childCPU;
358     cpu_set_t     set;
359     unsigned int  nloops;
361     if (argc != 4) {
362         fprintf(stderr, "Usage: %s parent\-cpu child\-cpu num\-loops\en",
363                 argv[0]);
364         exit(EXIT_FAILURE);
365     }
367     parentCPU = atoi(argv[1]);
368     childCPU = atoi(argv[2]);
369     nloops = atoi(argv[3]);
371     CPU_ZERO(&set);
373     switch (fork()) {
374     case \-1:            /* Error */
375         err(EXIT_FAILURE, "fork");
377     case 0:             /* Child */
378         CPU_SET(childCPU, &set);
380         if (sched_setaffinity(getpid(), sizeof(set), &set) == \-1)
381             err(EXIT_FAILURE, "sched_setaffinity");
383         for (unsigned int j = 0; j < nloops; j++)
384             getppid();
386         exit(EXIT_SUCCESS);
388     default:            /* Parent */
389         CPU_SET(parentCPU, &set);
391         if (sched_setaffinity(getpid(), sizeof(set), &set) == \-1)
392             err(EXIT_FAILURE, "sched_setaffinity");
394         for (unsigned int j = 0; j < nloops; j++)
395             getppid();
397         wait(NULL);     /* Wait for child to terminate */
398         exit(EXIT_SUCCESS);
399     }
402 .\" SRC END
403 .SH SEE ALSO
404 .ad l
406 .BR lscpu (1),
407 .BR nproc (1),
408 .BR taskset (1),
409 .BR clone (2),
410 .BR getcpu (2),
411 .BR getpriority (2),
412 .BR gettid (2),
413 .BR nice (2),
414 .BR sched_get_priority_max (2),
415 .BR sched_get_priority_min (2),
416 .BR sched_getscheduler (2),
417 .BR sched_setscheduler (2),
418 .BR setpriority (2),
419 .BR CPU_SET (3),
420 .BR get_nprocs (3),
421 .BR pthread_setaffinity_np (3),
422 .BR sched_getcpu (3),
423 .BR capabilities (7),
424 .BR cpuset (7),
425 .BR sched (7),
426 .BR numactl (8)