在将应用程序部署到生产环境中时,无论使用什么系统以及进行什么功能和回归测试,仍然会遇到不可避免的错误。 在100%的时间使用CPU时,您可能会死机,或者在几个线程被锁定而从不释放资源的情况下,您可能会陷入死锁。 在某些情况下,即使在多处理器体系结构和快速硬件上,您也会看到应用程序中非常古老的挂起(甚至几十年前)。
在这种情况下,来自应用程序的错误日志或来自应用程序转储的堆栈跟踪通常很少或根本没有帮助查明问题产生的确切代码行。 即使重新创建了问题,您也可能无法收集有关该问题的太多信息。
通常,您能做的最好的事情就是重现问题并找出失败的代码。 在最坏的情况下,即使在重新创建确切的生产环境之后(由于系统和硬件配置的潜在巨大负担,这非常困难),您也可能找不到多处理器环境中挂起问题的根本原因。
一种可以为您或面临此问题的客户提供帮助的方法是使用操作系统上可用的处理器相似性设置方法。
将进程绑定到AIX上的可用CPU
您可以在程序中使用AIX®平台上可用的bindprocessor
命令或AIX平台上可用的bindprocessor
API。 bindprocessor
命令将进程的内核线程绑定或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
如果要为绑定到指定处理器的二进制文件提供可调参数, bindprocessor
也是AIX提供的子例程。 要阅读有关bindprocessor
子例程的更多详细信息,请参阅AIX手册页上的《 IBM AIX基本操作系统和扩展技术参考》 。
下面的清单1显示了bindprocessor
子例程的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程序,因此它尝试绑定到0号CPU。
# setpb 0
结果是:
Number of Processor 2 Processor Online 2
Process affinity set to specified CPU 0
检查setpb
是否绑定到0号CPU的命令是:
# 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
程序,使其尝试绑定到4号CPU。计算机上不存在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
翻译自: https://www.ibm.com/developerworks/aix/library/au-processinfinity.html