了解如何使用处理器关联对进程进行限制,使其仅运行于指定中央处理单元 (CPU)。处理器关联是操作系统提供的一种机制,您可以在多处理器系统中使用它。它可以将进程中所有的线程绑定在指定的处理器上运行。使用进程关联设置可以对线程进行绑定或取消绑定,这可以帮助您找到导致棘手的暂停或死锁问题的根本原因,特别是对于那些难以调试的、危险的死锁和挂起。

Umesh Prabhakar Gaikwad (ugaikwad@in.ibm.com), 软件工程师, IBM

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 (kailashsz@in.ibm.com), 软件工程师, IBM

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 与他联系。



2006 年 12 月 21 日

引言

无论使用什么系统,无论在将应用程序部署到生产环境中时进行什么样的功能和回归测试,您仍然会碰到一些无法避免的错误。在 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 }

下面的表 1 列出了其中使用的一些标志:

表 1. 标志
示例代码描述
-b这个标志将应用程序的所有线程绑定到同一个物理处理器的多个硬件线程。
-q这个标志显示可用的处理器。
-u这个标志取消特定进程的线程绑定。

假设进程 p1 运行于多 CPU 硬件中。您需要将这个进程绑定到 CPU1,可以使用 ps 命令查看其状态。

  1. 要查询计算机中可用的处理器,可以使用:
    # bindprocessor -q
    The available processors are:  0 1
  2. 要将进程 ID 为 14662 的进程 p1 绑定到处理器 1,可以使用命令:
    # bindprocessor 14662 1
  3. 要确保该进程已绑定到指定的处理器,可以使用下面的命令进行查看:
    #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
    root  4710  5428    -  A  0  60   4     *       240001    -   - /usr/sbin/tftpd -n
    root 14662 10566    -  A 120 126 0    -     200001   pts/0   1        ./p1
  4. 取消进程的绑定:
    # bindprocessor -u 14662
  5. 查看上述命令的结果:
    # 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
    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){};
}

要编译上面的程序,可以输入:

# cc –o setpb setpb.c

运行经过编译后的 setpb 程序的二进制代码将得到下面的输出。

要将 setpb 绑定到 CPU 1,可以输入:

# setpb 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。

# setpb 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,所以将显示下面的错误信息,并运行缺省可用的处理器。

# setpb 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 下载这些试用软件。

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=AIX and UNIX
ArticleID=185075
ArticleTitle=AIX 中的处理器关联
publish-date=12212006