级别: 中级 Umesh Prabhakar Gaikwad (ugaikwad@in.ibm.com), 软件工程师,
IBM
Kailas S. Zadbuke (kailashsz@in.ibm.com), 软件工程师,
IBM
2006 年 12 月 21 日 了解如何使用处理器关联对进程进行限制,使其仅运行于指定中央处理单元 (CPU)。处理器关联是操作系统提供的一种机制,您可以在多处理器系统中使用它。它可以将进程中所有的线程绑定在指定的处理器上运行。使用进程关联设置可以对线程进行绑定或取消绑定,这可以帮助您找到导致棘手的暂停或死锁问题的根本原因,特别是对于那些难以调试的、危险的死锁和挂起。
引言
无论使用什么系统,无论在将应用程序部署到生产环境中时进行什么样的功能和回归测试,您仍然会碰到一些无法避免的错误。在 CPU 使用率达到百分之百时,可能会出现挂起;或锁定了多个进程并且它们不释放任何资源,这时可能出现死锁。在有些情况下,应用程序的挂起是个非常古老的问题(甚至可以追溯到几十年前),即使是在多处理器体系结构和高速的硬件设备中。
在这种情况下,应用程序错误日志、或应用程序转储中的堆栈跟踪,通常很难为找出产生问题的确切代码行提供实际的帮助。即使再次出现这个问题,您也很难搜集到关于该问题的详细信息。
通常,最好的方法是再次生成这个问题,并找到出现错误的代码。在最坏的情况下,即使重新创建了生产环境(由于系统中可能存在较大的负载和硬件配置方面的因素,所以很难做到这一点),在多处理器环境中,可能仍然无法找到产生挂起问题的根本原因。
对于您或者那些面临这个问题的用户,有一种方法可以提供帮助,那就是使用操作系统中提供的处理器关联设置方法。
将进程绑定到 AIX 中可用的 CPU
您可以使用 AIX® 平台中提供的 bindprocessor 命令,或者在程序中使用 AIX 平台提供的 bindprocessor API。bindprocessor 命令可以将进程中的内核线程绑定到一个处理器,或取消这种绑定。
您可以使用 bindprocessor 命令列出可用的处理器。唯一所需的输入是需要绑定或取消绑定线程对应的进程标识符。在对进程的内核线程进行绑定之后,它们将会被调度运行于指定的处理器。
bindprocessor 命令的语法为:
bindprocessor Process [ ProcessorNum ] | -q | -u Process{ProcessID [ProcessorNum] | -u ProcessID | -s SmtSetID | -b bindID ProcessorNum | -q }
|-------10--------20--------30--------40--------50--------60--------70--------80--------9|
|-------- XML error: The previous line is longer than the max of 90 characters ---------|
|
下面的表 1 列出了其中使用的一些标志:
表 1. 标志
| 示例代码 | 描述 |
|---|
| -b | 这个标志将应用程序的所有线程绑定到同一个物理处理器的多个硬件线程。 | | -q | 这个标志显示可用的处理器。 | | -u | 这个标志取消特定进程的线程绑定。 |
假设进程 p1 运行于多 CPU 硬件中。您需要将这个进程绑定到 CPU1,可以使用 ps 命令查看其状态。
- 要查询计算机中可用的处理器,可以使用:
# bindprocessor -q
The available processors are: 0 1
|
- 要将进程 ID 为 14662 的进程 p1 绑定到处理器 1,可以使用命令:
- 要确保该进程已绑定到指定的处理器,可以使用下面的命令进行查看:
#ps -emo THREAD | grep p1
USER PID PPID TID ST CP PRI SC WCHAN F TT BND COMMAND
root 4460 5428 - A 0 60 7 f0145c10 240001 - - /usr/sbin/rpc.mountd
|--10--------20--------30--------40--------50--------60--------70--------80--------9|
|-------- XML error: The previous line is longer than the max of 90 characters ---------|
root 4710 5428 - A 0 60 4 * 240001 - - /usr/sbin/tftpd -n
root 14662 10566 - A 120 126 0 - 200001 pts/0 1 ./p1
|
- 取消进程的绑定:
- 查看上述命令的结果:
# ps -emo THREAD | grep p1
USER PID PPID TID ST CP PRI SC WCHAN F TT BND COMMAND
root 12672 10566 - A 1 60 1 50a05e84 200001 pts/0 - grep p1
|--10--------20--------30--------40--------50--------60--------70--------80--------9|
|-------- XML error: The previous line is longer than the max of 90 characters ---------|
root 14662 10566 - A 78 111 0 - 200001 pts/0 - ./p1
|

 |

|
AIX 中可用的 API
如果您希望为绑定到指定处理器的二进制程序提供可调节的参数,那么还可以使用 AIX 提供的 bindprocessor 子例程。要阅读更多关于 bindprocessor 子例程的详细信息,请参阅 IBM AIX Base Operating System and Extensions Technical Reference,可以通过 AIX man 页面获得。
下面的清单 1 介绍了 bindprocessor 子例程的使用。
清单 1. Bindprocessor 子例程
#include <stdio.h>
#include <unistd.h>
#include <sys/processor.h>
int main(int argc, char ** argv)
{
long noProcessorConf,noProcessorOnline;
int bindparameter;
int retValue = 0;
int pid;
pid = getpid();
/*_SC_NPROCESSORS_CONF Number of processors configured.
_SC_NPROCESSORS_ONLN Number of processors online.*/
noProcessorConf = sysconf(_SC_NPROCESSORS_CONF);
noProcessorOnline = sysconf(_SC_NPROCESSORS_ONLN);
if(-1 == noProcessorConf || -1 == noProcessorOnline )
{
printf("sysconf API failed\n");
}
if(-1 != noProcessorConf || -1 != noProcessorOnline )
{
printf("Number of Processor %d Processor Online %d\n", noProcessorConf,
noProcessorOnline);
if(noProcessorConf > 1) /* This is multi processor configured environment */
{
bindparameter = atoi(argv[1]);
if(bindparameter > noProcessorConf)
{
printf("Processor parameter specified is out of configured
processors\n");
}
else
{
retValue = 0;
retValue = bindprocessor(BINDPROCESS, pid, bindparameter);
if(-1 == retValue)
printf("Failed to set the process affinity\n");
if(0 == retValue)
printf("Process affinity set to specified
CPU %d\n",bindprocessor);
}
}
}
while(1){};
}
|
要编译上面的程序,可以输入:
运行经过编译后的 setpb 程序的二进制代码将得到下面的输出。
要将 setpb 绑定到 CPU 1,可以输入:
其结果为:
Number of Processor 2 Processor Online 2
Process affinity set to specified CPU 1
|
要查看 setpb 是否已绑定到 CPU 1,可以输入:
# ps -emo THREAD | grep setpb
|
其结果为:
USER PID PPID TID ST CP PRI SC WCHAN F TT BND COMMAND
Root 15080 10566 - A 85 102 0 - 200001 pts/0 0 setpb 1
|
使用下面的参数运行 setpb 程序,尝试将其绑定到 CPU 0。
其结果为:
Number of Processor 2 Processor Online 2
Process affinity set to specified CPU 0
|
查看 setpb 是否绑定到 CPU 0 的命令是:
# ps -emo THREAD | grep setpb
|
其结果为:
USER PID PPID TID ST CP PRI SC WCHAN F TT BND COMMAND
Root 15082 10566 - A 99 109 0 - 200001 pts/0 0 setpb 0
|
使用下面的参数运行 setpb 程序,尝试将其绑定到 CPU 4。该计算机中没有 CPU 4,所以将显示下面的错误信息,并运行缺省可用的处理器。
Number of Processor 2 Processor Online 2
Processor parameter specified is out of configured processors
|
要查看 setpb 是否已绑定到 CPU4,可以输入: # ps -emo THREAD | grep setpb |
将显示下面的内容:
USER PID PPID TID ST CP PRI SC WCHAN F TT BND COMMAND
Root 15084 10566 - A 87 103 0 - 200001 pts/0 0 setpb 4
|
参考资料 学习
获得产品和技术
- IBM 试用软件:使用 IBM 软件开发您的下一个项目,可直接从 developerWorks 下载这些试用软件。
讨论
作者简介  | |  | Umesh Prabhakar Gaikwad 是 IBM India Software Labs 的软件工程师。在过去三年里,他一直为 IBM 工作,致力于研究 AIX、Windows 和 Solaris 中的分布式计算环境 (DCE)。目前他参与了 IBM DCE 产品 Level 3 的活动。Umesh 拥有印度 Pune 大学计算机科学与工程学士学位。您可以通过 ugaikwad@in.ibm.com 与他联系。 |
 | |  | Kailas S. Zadbuke 是 IBM India Software Labs 的高级软件工程师。在过去三年里,他一直为 IBM 工作。目前他正致力于 IBM 分布式文件系统产品方面的工作。他从事 Security RFC for Simple Public Key Mechanism (SPKM) 以及分布式技术的实现,包括 DCE 和 Standalone RPC (SARPC)。Kailas 拥有印度 Roorkee 大学电子与通信硕士学位。您可以通过 kailashsz@in.ibm.com 与他联系。 |
对本文的评价
|