AIX 5L 性能优化: 监视您的 CPU,第 3 部分

控制线程使用和 CPU 绑定

本系列文章的第 3 部分重点关注中央处理单元 (CPU) 性能优化中鲜为人知的方面:控制线程使用和 CPU 绑定。本文介绍了一些关键的工具和实用程序,您可以使用它们来分析线程和管理进程。

Ken Milberg, UNIX 顾问、技术作家和网站专家, ALDION Consulting Pte Ltd

Ken Milberg 是 techtarget.com 网站的技术作家和网站专家,并且在 searchopensource.com 网站提供 Linux 技术信息和支持。他还是《IBM 系统杂志(开放系统版)》的撰稿人和技术编辑。Ken 拥有马里兰大学计算机和信息科学学士学位以及技术管理硕士学位。他是长岛 POWER-AIX 用户组的创立者和负责人。多年以来,他在大小型企业工作过,并且担任过从 CIO 到高级 AIX 工程师的各种职位。现在,他在 Future Tech 工作,这是一家总部设在长岛的 IBM 业务合作伙伴。Ken 是一名通过 PMI 认证的项目管理专业人员 (PMP),还是一名通过 IBM 认证的高级技术专家(CATE,IBM System p5 2006),并且是通过 Solaris 认证的网络管理员 (SCNA)。您可以通过 kmilberg@gmail.com 与他联系。



2007 年 7 月 23 日

关于本系列

本系列的三篇文章重点关注中央处理单元 (CPU) 性能和监视的方方面面。本系列的第一部分概述了如何高效地监视 CPU,讨论了进行性能优化的方法,并且给出了可能对性能产生积极或消极影响的一些注意事项,还介绍了一些相关的命令。本系列的第二部分则更关注于实际的 CPU 系统监视、对趋势和结果进行分析的细节内容。本系列的第三部分重点关注于主动控制线程使用和优化 CPU 以实现性能最大化的其他方法。在本系列文章中,我还将详细说明 AIX® CPU 性能优化和监视方面的各种最佳实践。

引言

本文的内容包括线程、进程和 CPU 绑定。本文还讨论了如何使用在前面几期文章中介绍的一些工具,以便对您的系统进行更改。同时,本文还介绍了 AIX Version 5.3 中用于优化 CPU 调度程序的最重要的命令以及线程绑定的各种方法。

初级的管理员可能认为进程管理只不过就是监视活动的进程、终止失控的或僵死的进程。您将会发现,进程管理并不仅仅只是使用 kill 命令或者甚至 nice 命令。在继续学习后面的内容之前,需要弄清楚一个基本的问题,即进程与线程之间存在怎样的关系。其答案非常的简单。进程是 AIX 用于控制系统资源使用的实体,而线程则用于控制使用的时间,因为每个内核线程都是一个单独的顺序控制流。每个进程由一个或多个线程组成。您可以根据实际情况来控制线程的使用。要做到这一点,您需要了解一些相关的工具,这些工具允许您使用线程来提高 CPU 的性能,而这正是本系列文章中最后一部分内容的研究范围。

线程监视

在这个部分中,我将介绍一些相关的工具和命令,它们可以帮助您监视和分析线程的使用。尽管在 AIX Version 4 中就引入了通过线程的使用来控制处理器使用时间的方法,但是直到 AIX 5L™ 才真正提供了帮助您监视和分析线程使用的系统管理工具。其中一种工具是 Procmon,在 AIX Version 5.3 中引入了该工具。

Procmon 可以显示进程的列表(当您的系统变化时,该列表也将动态地变化),通过这个列表,您可以收集有关系统中正在运行的进程的信息。与其他监视工具相比,其独特之处在于,它允许您运行各种命令以简化进程和线程的管理。它能够收集的、与性能优化相关的一些关键信息包括:

  • 某个进程实际使用的 CPU 时间
  • 某个进程的内存和 I/O 用量
  • 进程的 nice(优先级调整参数)值及其优先级

您甚至可以 kill 任务(终止任务),并且动态地 renice 它们(调整其优先级)。图 1 给出了关于整体性能的图形表示。要启动 Performance Workbench Platform,可以使用: # perfwb

图 1. Procmon partition performance 选项卡
Procmon partition performance 选项卡

其中还包括一个进程表视图,用于在经过排序的表格中显示线程列表。您只需选择 Show threads metrics 即可(请参见图 2)。

图 2. Procmon processes 选项卡
Procmon processes 选项卡

其他的一些菜单允许您 kill 进程(终止进程)或者 renice 它们(重新调整进程的优先级),请参见图 3

图 3. renice 命令对话框
renice 命令对话框

那么,nice 究竟是什么呢?您可以使用 nice 命令调整给定进程的优先级。所有进程的缺省值都为 20。使用 renice 命令(通过 Procmon 或者命令行)可以使得系统为给定的进程分配一个更高的或者更低的优先级。在进行该操作时,您实际上通过更改进程的 nice 值,从而更改了线程优先级的值(缺省值为 40)。

如果您在运行 ps 命令时使用了 -l 标志,那么您将看到具体的 nice 信息(请参见清单 1)。

清单 1. nice 信息
# ps -l
       F S  UID   PID  PPID   C PRI NI ADDR    SZ    WCHAN    TTY  TIME CMD
  200001 A    0 12972 45770   0  60 20 dea6   764           pts/1  0:00 ksh
  200001 A    0 33816 12972   3  61 20 36168   440           pts/1  0:00 ps
  240001 A  207 45770 40374   0  60 20 258ec   744           pts/1  0:00 ksh

让我们通过 nice 启动一个新的 ksh,更改进程的优先级:# nice --10 ksh(请参见清单 2)。

当您再次使用 ps 查看进程表时,您将看到,对于这个进程以及它通过 fork 系统调用创建的子进程,它们的优先级都不再是缺省值。

清单 2. 使用 nice 命令得到的新的 ksh
# ps -l
       F S  UID   PID  PPID   C PRI NI ADDR    SZ    WCHAN    TTY  TIME CMD
  200001 A    0 12972 45770   0  60 20 dea6   764           pts/1  0:00 ksh
  200001 A    0 17246 12972   0  50 10 68a1f   748           pts/1  0:00 ksh
  200001 A    0 18450 17246   1  50 10 51bb1   380           pts/1  0:00 ps
  240001 A  207 45770 40374   0  60 20 258ec   744           pts/1  0:00 ksh

您还可以使用 renice 命令(前面在介绍 Procmon 的图 3 中对该命令进行了说明),以便动态地为一个运行的进程重新分配优先级。

让我们回到 ps。如果您希望更详细地查看相关的线程,那么您可以使用 -mo 标志(请参见清单 3)。

清单 3. 使用 -mo 标志以便更详细地查看您的线程
# ps -mo THREAD
    USER   PID  PPID    TID ST  CP PRI SC    WCHAN        F     TT BND COMMAND
    root 12800 45770      - A    0  60  1        -   200001  pts/1   - -ksh
       -     -     -  56759 S    0  60  1        -    10400      -   - -
    root 44648 12800      - A    1  60  1        -   200001  pts/1   - ps -mo THREAD
       -     -     -  64905 R    1  60  1        -        0      -   - -
kmilberg 45770 40374      - A    0  60  1        -   240001  pts/1   - -ksh
       -     -     -  54005 S    0  60  1        -    10400      -   - -

尽管大多数管理员通常仅在进行 ps -ef 操作时使用 ps,但是如果您更仔细地研究它的特性,那么您将会了解到更多关于 ps 的内容。

更改线程的优先级

您已经了解了如何更改进程的优先级,那么对于线程又该如何操作呢?这部分内容介绍了如何更改用于计算每个线程优先级值的 CPU 调度参数。您可以使用 schedo(在 AIX Version 5.2 及更早的版本中是 schedune)来完成这项工作。

首先,您需要确保拥有下面的文件集(请参见 清单 4)。

清单 4. 检查文件集
# lslpp -lI bos.perf.tune
  Fileset                      Level  State      Description
  ----------------------------------------------------------------------------
Path: /usr/lib/objrepos
  bos.perf.tune             5.2.0.10  COMMITTED  Performance Tuning Support

Path: /etc/objrepos
  bos.perf.tune             5.2.0.10  COMMITTED  Performance Tuning Support

现在,让我们报告所有的 CPU 参数,如清单 5 所示。

清单 5. 报告所有的 CPU 参数
# schedo -a
              %usDelta = 100
          affinity_lim = 7
         big_tick_size = 1
      fixed_pri_global = 0
             force_grq = 0
idle_migration_barrier = 4
               maxspin = 16384
              pacefork = 10
               sched_D = 16
               sched_R = 16
             timeslice = 1
         v_exempt_secs = 2
         v_min_process = 2
           v_repage_hi = 0
         v_repage_proc = 4
            v_sec_wait = 1

首先从 fixed_pri_global 开始进行分析。它的缺省设置为 0。当 CPU 准备分派线程时,它会先检查全局运行队列,然后再检查其他队列。当线程在 CPU 上的时间片结束之后,它将被重新放回到这个队列中。这可以帮助维护处理器的关联性(稍后我将介绍这部分内容)。要提高整体的线程性能,您可以将名为 RT_GRQ 的环境变量设置为 ON。这样一来,就会自动地将线程放入到全局运行队列中。如果您将缺省值从 0 更改为 1,那么所有固定优先级的线程都将放入到这个运行队列中。您可以执行下面的命令将缺省值从 0 更改为 1: #schedo -o fix_pri_global=1

让我们再来讨论一下线程。用户进程的实际优先级会随着时间发生变化,这取决于该进程最近所使用的 CPU 时间。您需要查看的参数包括 sched_Rsched_D。这两个参数值的单位都是 1/32 秒,并且它们的缺省值都为 16。而且,对于刚创建的线程,其 CPU 值为 0。随着线程在 CPU 上执行时间的增加,其 CPU 使用时间将会递增。实际上,调度程序使用下面的公式来计算 CPU 使用时间: CPU usage = CPU usage*(D/32)

在这个示例中,如果 D 参数设置为 32,那么线程的 CPU 使用时间将不会衰减,而该参数的缺省值为 16,这样就允许 CPU 使用时间随着时间的推移而衰减,从而使其获得更多的在 CPU 上执行的时间。

每个 CPU 都有一个专门的运行队列。运行队列是由运行线程所组成的列表,按照线程优先级的值进行排序。一共有 256 种线程优先级(从 0 到 255)。还有一个附加的全局运行队列,其中放的是新的线程。

Schedo 通常用于更改调度程序时间片的长度。要更改时间片,可以使用 schedo -o timeslice=value 选项。增加时间片的长度可以提高系统吞吐量,因为减少了上下文的切换。在进行这种更改之前,请确保反复地运行 vmstat 以确定系统中确实正在进行大量的上下文切换工作。

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 中获取相关信息,而这将极大地降低处理的速度。

您还可以使用子例程来绑定线程,尽管我在进行这种工作时会倍加小心。它所执行的操作是将一个进程中所有的内核线程绑定到某个处理器,这样做将强制这些线程运行于某个特定的处理器中,直到解除对它们的绑定。

编程中使用的另一个重要线程命令是 gprofgprof 命令为您所编译的程序(可能是用 C、Pascal、FORTRAN、或者甚至是 COBOL 编写的程序)产生一个执行概要。gprof 可以报告您的程序中所有子例程的流程控制,并为您提供每个子例程所使用的 CPU 时间。在对进程如何使用 CPU 资源进行故障诊断时,这是非常有用的。相关的数据来自于概要文件 (gmon.out)。您可以使用 gprof 对您的程序进行概要分析,并确定哪些函数正在使用 CPU。概要数据来自于调用关系图概要文件(缺省情况下是 gmon.out)。那么,在 AIX Version 5.3 中有何不同呢?因为 AIX Version 5.3 允许输出文件的概要具有用户指定的名称(通过设置特殊的环境变量),所以,为线程提供了附加的概要支持和选项,而这些都会影响所收集的概要数据的类型。

总结

在本文中,我介绍了控制线程使用和 CPU 绑定的重要性。您了解了一些用于分析线程和管理进程的、关键的工具和实用程序。而且,您使用 schedo 对内核进行了优化,了解了与处理器关联有关的所有内容,并掌握了如何绑定 CPU。本系列文章主要介绍关于 CPU 监视的内容,共由三篇文章组成,首先引入了优化的概念,然后介绍了监视和数据收集,最后以系统优化和管理作为结束。尽管大多数的读者可能对内存子系统的优化更加熟悉,但是我希望通过本系列文章说明 CPU 监视和优化的重要性。

参考资料

学习

获得产品和技术

  • 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=242122
ArticleTitle= AIX 5L 性能优化: 监视您的 CPU,第 3 部分
publish-date=07232007