<?xml version="1.0" encoding="gbk"?> <rss version="2.0"><channel> <title>定阅帖子更新</title> <link>http://www.broadkey.com.cn/XML.ASP</link><description>TEAM Board - 意得法电子</description> <copyright>TEAM 2.0.5 Release</copyright><generator>TEAM Board by TEAM5.Cn Studio</generator> <ttl>30</ttl><item><link>http://www.broadkey.com.cn/Thread.asp?tid=52 </link><title>Linux&amp;nbsp;下绑定进程到&amp;nbsp;CPU</title><author>alan</author><pubDate>2009-11-25 23:41:02</pubDate><description><![CDATA[<strong><font color="#ff6600">1. GLibc API:<br />
<br />
</font></strong><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #include &lt;sched.h&gt;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int sched_setaffinity(pid_t pid, unsigned int cpusetsize,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cpu_set_t *mask);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int sched_getaffinity(pid_t pid, unsigned int cpusetsize,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cpu_set_t *mask);<br />
<br />
<br />
<strong>Example:</strong><br />
<br />
&nbsp;&nbsp;&nbsp; unsigned int cpu_mask;<br />
&nbsp;&nbsp;&nbsp; unsigned int pid = 1;<br />
&nbsp;&nbsp;&nbsp; unsigned int mask = 0x1;&nbsp;&nbsp;&nbsp; // 绑定到 CPU0，0x2 则绑定到 CPU1<br />
<br />
&nbsp;&nbsp;&nbsp; if (sched_getaffinity (pid, 4, &amp;mask) &lt; 0)<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; fprintf (stderr, &quot;failed to get cpu affinity: %s\n&quot;, strerror (errno));<br />
&nbsp;&nbsp;&nbsp; else<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; printf (&quot;setting cpu affinity of pid=%d to %x\n&quot;, pid, cpu_mask);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (sched_setaffinity (pid, 4, &amp;cpu_mask) &lt; 0)<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; fprintf (stderr, &quot;failed to get cpu affinity: %s\n&quot;, strerror (errno));<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; else<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (sched_getaffinity (pid, 4, &amp;mask) &lt; 0)<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; fprintf (stderr, &quot;failed to get cpu affinity: %s\n&quot;, strerror (errno));<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; else<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; printf (&quot;cpu affinity of pid=%d is %x\n&quot;, pid, mask);<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
<br />
Other macros to manipulate the bitset (set, reset bits):<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void CPU_CLR(int cpu, cpu_set_t *set);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int CPU_ISSET(int cpu, cpu_set_t *set);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void CPU_SET(int cpu, cpu_set_t *set);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void CPU_ZERO(cpu_set_t *set);<br />
<br />
<br />
</font><font size="2"><br />
<strong>Reference:</strong><br />
</font><font size="3"><font size="2"><br />
&nbsp;&nbsp; http://www.gnu.org/software/libc/manual/html_node/CPU-Affinity.html<br />
<br />
</font><br />
</font><font size="3"><font color="#99cc00"><strong>2. Kernel interface (CPU Sets)</strong></font><br />
<br />
<font size="2">运行一个无限循环程序 </font></font><font size="2">setaffinity_test</font><font size="3"><font size="2"> (pid = 22580)，top 的输出为：<br />
<br />
</font></font><font size="3"><font size="2">......</font></font><br />
<font size="3"><font size="2"><font size="1"><font color="#ff0000">Cpu0 : 24.1%us, 0.3%sy, </font>0.0%ni, 96.4%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st<br />
<font color="#ff6600">Cpu1 : 77.8%us, 0.0%sy, </font>0.0%ni, 0.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st<br />
Mem:&nbsp;&nbsp; 2033068k total, 1120456k used,&nbsp;&nbsp; 912612k free,&nbsp;&nbsp;&nbsp; 17348k buffers<br />
Swap:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0k total,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0k used,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0k free,&nbsp;&nbsp; 125876k cached<br />
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+COMMAND <br />
22580 comcat&nbsp;&nbsp;&nbsp; 25&nbsp;&nbsp; 0 1496 312 252 R 100 0.0&nbsp;&nbsp; 2:54.74 setaffinity_test<br />
</font>......<br />
<br />
其 status 为：<br />
<br />
$ cat /proc/22580/status | grep allow<br />
Cpus_allowed:&nbsp;&nbsp; 03&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ----------&gt; 可运行于 CPU0 和 CPU1<br />
Mems_allowed:&nbsp;&nbsp; 1<br />
<br />
<br />
$ mkdir /dev/cpuset<br />
$ mount -t cpuset x /dev/cpuset<br />
$ cd /dev/cpuset<br />
$ mkdir my_cpuset &amp;&amp; cd my_cpuset&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # 创建自己的设置<br />
$ echo 1 &gt; cpus&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # 绑定到 CPU1<br />
$ echo 0 &gt; mems<br />
$ echo 22580 &gt; tasks&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # 让 pid 为 22580 的进程绑定到 CPU1<br />
<br />
<br />
cpuset 设置后，top 的输出为：<br />
<br />
......</font></font><font size="3"><font size="2"><font size="1"><br />
<strong><font color="#ff9900">Cpu0 : 3.3%us, 0.3%sy, </font></strong>0.0%ni, 96.4%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st<br />
<strong><font color="#99cc00">Cpu1 : 100%us, 0.0%sy, </font></strong>0.0%ni, 0.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st<br />
Mem:&nbsp;&nbsp; 2033068k total, 1120456k used,&nbsp;&nbsp; 912612k free,&nbsp;&nbsp;&nbsp; 17348k buffers<br />
Swap:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0k total,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0k used,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0k free,&nbsp;&nbsp; 125876k cached<br />
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+COMMAND <br />
22703 comcat&nbsp;&nbsp;&nbsp; 25&nbsp;&nbsp; 0 1496 312 252 R 100 0.0&nbsp;&nbsp; 2:54.74 setaffinity_test<br />
</font>......<br />
</font></font><br />
<font size="3"><font size="2">此时其 status 为：<br />
<br />
$ cat /proc/22580/status | grep allow<br />
Cpus_allowed:&nbsp;&nbsp; 02 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ----------&gt; 只可运行于 CPU1<br />
Mems_allowed:&nbsp;&nbsp; 1<br />
<br />
</font></font><font size="3"><font size="2"><br />
Reference:<br />
<br />
&nbsp;&nbsp;&nbsp; http://www.bullopensource.org/cpuset/<br />
&nbsp;&nbsp;&nbsp; http://www.mjmwired.net/kernel/Documentation/cpusets.txt<br />
&nbsp;&nbsp;&nbsp; http://www.mjmwired.net/kernel/Documentation/cpu-hotplug.txt<br />
</font></font>]]></description></item></channel></rss>