AIX 中的处理器关联

Comments

引言

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

相关主题


评论

添加或订阅评论,请先登录注册

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