WEB开发网
开发学院操作系统Linux/Unix AIX 中的处理器关联 阅读

AIX 中的处理器关联

 2008-09-06 08:21:21 来源:WEB开发网   
核心提示:引言无论使用什么系统,无论在将应用程序部署到生产环境中时进行什么样的功能和回归测试,AIX 中的处理器关联,您仍然会碰到一些无法避免的错误,在 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 }

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

表 1. 标志

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

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

要查询计算机中可用的处理器,可以使用:# bindprocessor -q
The available processors are: 0 1

要将进程 ID 为 14662 的进程 p1 绑定到处理器 1,可以使用命令:# bindprocessor 14662 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
 root 4710 5428  - A 0 60  4   *    240001  -  - /usr/sbin/tftpd -n
 root 14662 10566  - A 120 126 0  -   200001  pts/0  1    ./p1

取消进程的绑定:# bindprocessor -u 14662

查看上述命令的结果:# 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 failedn");
    }
    if(-1 != noProcessorConf || -1 != noProcessorOnline )
    {
      printf("Number of Processor %d Processor Online %dn", 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
              processorsn");
          }
          else
          {
              retValue = 0;
              retValue = bindprocessor(BINDPROCESS, pid, bindparameter);
              if(-1 == retValue)
                  printf("Failed to set the process affinityn");
              if(0 == retValue)
                printf("Process affinity set to specified
                  CPU %dn",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 

Tags:AIX 处理器 关联

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接