CPU 绑定
在这部分内容中,我将介绍有关CPU 绑定的主题,即允许进程在特定的处理器上运行。这个术语本身可称为处理器关联。处理器关联有许多用途,其中一些甚至可以在调试的过程中使用。例如,您可以将线程绑定到给定的处理器,以找出导致某个挂起程序的根源。通常,在尝试将程序分散到多处理机系统(例如 SMP 系统)中时,会使用到处理器关联。您所使用的命令是bindprocessor 命令。假定启用了同步多线程 (SMT),这是缺省的行为,那么在运行bindprocessor 命令时,会将物理处理器的每个硬件线程作为单独的处理器列举出来。在POWER5 芯片中,每个处理器中有两个硬件线程。对于共享的处理器逻辑分区 (LPAR),使用这个命令可以绑定到虚拟CPU,所以您必须非常小心,因为它可能会导致预先安排运行于特定CPU 的应用程序出现问题。让我们首先检查一下是否启用了SMT(请参见 清单 6)。
清单 6. 检查是否启用了SMT
# smtctl SMT is currently enabled.
清单 7 显示了一个启用了 SMT 的双向系统的输出。
清单 7. 一个启用了 SMT 的双向系统的输出
# bindprocessor -q
The available processors are: 0 1 2 3
如果您希望将一个进程绑定到某个特定的CPU,非常简单,可以执行下面的命令:
# bindprocessor 12741 2
有时候,会很自然地出现处理器关联的情况。当某个线程在一个CPU 上运行并发生了中断,通常会将它放回到相同的CPU 上运行,因为这个处理器的缓存中仍然保存了属于该线程的相关信息。如果将其分派到另一个CPU,它可能不得不从RAM 中获取相关信息,而这将极大地降低处理的速度。
您还可以使用子例程来绑定线程,尽管我在进行这种工作时会倍加小心。它所执行的操作是将一个进程中所有的内核线程绑定到某个处理器,这样做将强制这些线程运行于某个特定的处理器中,直到解除对它们的绑定。
编程中使用的另一个重要线程命令是gprof。gprof 命令为您所编译的程序(可能是用C、Pascal、FORTRAN、或者甚至是COBOL 编写的程序)产生一个执行概要。gprof 可以报告您的程序中所有子例程的流程控制,并为您提供每个子例程所使用的CPU 时间。在对进程如何使用CPU 资源进行故障诊断时,这是非常有用的。相关的数据来自于概要文件 (gmon.out)。您可以使用gprof 对您的程序进行概要分析,并确定哪些函数正在使用CPU。概要数据来自于调用关系图概要文件(缺省情况下是gmon.out)。那么,在AIX Version 5.3 中有何不同呢?因为AIX Version 5.3 允许输出文件的概要具有用户指定的名称(通过设置特殊的环境变量),所以,为线程提供了附加的概要支持和选项,而这些都会影响所收集的概要数据的类型。
