AIX 上的进程优先级与进程控制

管理 AIX 系统上的进程

通过 kill 和 nice 等工具管理进程非常简单,但如果要对进程进行更为细化的管理控制,又该如何呢?在使用 AIX® 的多处理器系统中,您可以将进程和线程分配给特定的处理器来实现此目的,但如何选择适当的应用程序并组织更大的系统,以便对该应用程序进行相应的优化呢?在本文中,您将了解可用于组织进程的各种工具,然后分析组织和选择进程背后的理论,并学习如何有效设置进程的优先级。

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 年 4 月 16 日

引言

作为一名 AIX® 管理员,您应该已经了解有关如何处理进程的基础知识,包括研究进程、设置进程的优先级和终止进程。此外,您还应该知道如何使用手头的各种工具来调整进程并相应地进行优化。这些工具包括 AIX 5.3 中新增的一些工具。要在系统上提供有效的进程控制,您必须了解进程和线程的定义以及二者之间的区别。本文还将介绍 psniceschedtune 命令以及进程监视器控制台 (procmon)、AIX 工作负载管理器 (WLM) 和其他可供使用的工具。让我们先从进程和线程的定义开始:

  • 进程——进程是指系统内部由命令、Shell 脚本或其他进程启动的活动。
  • 线程——线程是一个独立的控制流,它与其他独立的控制流一起在进程内部的同一地址空间中运行。内核线程是单个顺序控制流。

看待这种区别的另一种方式是,进程是系统用于控制系统资源使用情况的实体,而线程则控制实际使用的处理器时间。大多数系统管理工具仍要求参考进程而不是线程。实际上,进程本身也拥有内核线程,每个进程可具有一个或多个内核线程(例如多线程应用程序)。对于线程,您可以在系统上的不同 CPU 中运行多个线程,从而真正利用多处理器计算机(对称多路处理机,又称 SMP 机)的优势。应用程序在设计上可拥有多个用户级线程,并将它们计划为由应用程序或 libpthread 中的 pthread 调度程序处理。多个控制线程允许应用程序同时为来自多个用户的请求提供服务。在 libpthread 实现中,用户线程位于虚拟处理器之上,而虚拟处理器本身又位于内核线程之上。本文将对进程的内核方面进行深入研究,同时探讨有助于提高整个系统管理效率的工具。为帮助您有效管理环境,我们将详细介绍久经试验的 UNIX® 命令以及很多可供 AIX 管理员使用的新型工具。

线程和 SMT

通过允许在不同的 CPU 上运行多个线程,还可以有效利用同步多线程 (SMT)。当系统处于 SMT 模式下时,处理器可以从多个线程中获取指令。SMT 的概念专门用于 POWER5 体系结构,它指的是单个进程不能同时使用所有处理器执行单元。POWER5 设计可在每个芯片内核上实现双向 SMT。其结果是,每个物理处理器内核将由两个虚拟处理器表示。SMT 在商业环境中特别有用,因为在这种环境中,单个事务的处理速度与所执行的总事务数相比并不那么重要。借助于大型或更改频繁的工作集(例如数据库服务器和 Web 服务器),SMT 应能够增大工作负荷的吞吐量。浮点密集型工作负荷很少能从 SMT 中获益,因而是最可能降低性能的因素。这些工作负荷会占用大量的浮点单元或内存带宽。每条指令的平均时钟周期数 (CPI) 和缓存未命中率都较低的工作负荷可能会从 SMT 得到少许益处。通常情况下,SMT 应能够使系统性能提高约 30%。您必须确定系统上运行的关键进程是否可从 SMT 获益。关键进程通常可以从 SMT 获益;但是,如果您确定的情况并非如此,则需要将其关闭,因为这些进程在缺省情况下处于启用状态。

计划概念

我尽量不在 AIX 调度程序的内核构造方面花费太多的时间,但在介绍进程管理或调度程序优化之前,您需要对这些知识有更好的了解。

系统上的每个 CPU 都有自己专用的运行队列,该队列是按线程优先级值排序的可运行线程的列表。另外,还有一种运行队列,称为全局运行队列。所有新线程都被放在全局运行队列中。每当 CPU 准备分派线程时,它都会先检查此全局运行队列,然后再检查其他运行队列。在 CPU 上,当一个线程完成它的时间切片后,它将返回原来运行它的 CPU 运行队列。这有助于 AIX 维护它的处理器关联性。(我将在后面对处理器关联性进行详细讨论。)

您可以优化某些环境变量来提高调度程序的性能,但这已超出本文的论述范围。系统上的 CPU 由所有线程共享,其方式是向每个线程都提供一定的时间切片来运行。缺省时间切片是 10 毫秒(一个时钟计时单元)。使用 schedo 命令可以更改这一缺省值。增加时间切片可减少上下文切换,从而可以提高系统吞吐量。使用 vmstatsar 命令可以查看上下文切换。如果上下文切换的值非常高,则增加时间切片可提高性能,但这必须在经过大量分析之后才能实施。

在系统模式方面,CPU 有两种运行模式:内核模式和用户模式。在用户模式中,程序对进程专用区域中的用户数据具有读写访问权限。此模式是进程积累其大多数 CPU 时间所在的模式。另一种模式是内核模式。以内核模式运行的某些程序包括中断处理程序和内核进程。当在某个进程的上下文中执行以此模式运行的代码时,它不仅对全局内核地址空间具有读写访问权限,还将对该进程中的内核数据也具有读写访问权限。对于进程地址空间中的用户数据,必须使用内核服务进行访问。当用户程序访问系统调用时,它将在内核模式而不是用户模式下进行。您需要理解这一概念,才能尝试解释 vmstatsar 等命令的输出。

处理器关联性和绑定处理器

处理器关联性是操作系统提供的在 SMP 硬件上使用的工具。从本质上讲,进程中的所有线程都可以绑定到指定的处理器上运行。AIX 会在每个 CPU 上都设置一个运行队列,以此来自动尝试推动处理器关联性的建立,这一点我在前面已经讨论过。通过使用进程关联性来绑定线程或取消线程的绑定,可帮助您找到难以调试的挂起或死锁的根本原因。对于某些应用程序,如果将它们的线程始终绑定在特定的 CPU 上运行,还可能提高其运行速度。

在典型的 SMP 系统中,所有处理器都完全相同并可以在其系统上运行任意线程。从本质上讲,任何进程或线程都可以分派到任意处理器上运行,但绑定在特定处理器上运行的处理器或线程除外。此操作可通过 bindprocessor 命令实现。让我们看一个示例(请参见清单 1)。

清单 1. 使用 bindprocessor 命令
# bindprocessor -q

The available processors are:  0 1 2 3

在此示例中,您可以看到有四个处理器可供调用。这些可用的处理器是:0、1、2、3。

以下命令显示了绑定到 CPU 3 的处理器(请参见清单 2)。

清单 2. 发现绑定到 CPU 3 的处理器
# ps -emo THREAD | grep p3
    root 401544 389152        - A    0  60  1 f10001001ece2fb8   200001  pts/0   
- grep p3

您还可以使用 SMIT 快速路径 smit bindproc 来帮助绑定进程。另一种绑定进程的方式是,使用 AIX 上可用的 bindprocessor API 在程序内部执行绑定。您应明白,这些命令的功能十分强大。在将进程绑定到 CPU 时,如果该 CPU 正处于繁忙状态,而其他 CPU 却处于空闲状态,则绑定操作实际上会降低该进程的性能。

PS——认识您很高兴

让我们讨论一下通常可用于识别和处理进程的命令。

要获得一个较长的文件清单,请使用以下命令,如清单 3 所示。

清单 3. 获取较长的文件清单
# ps -ef
     UID    PID   PPID   C    STIME    TTY  TIME CMD
    root      1      0   0   Jan 08      -  0:05 /etc/init 
    root  82126 204974   0   Jan 08      -  0:00 /usr/sbin/snmpmibd 
    root  86210 106640   0   Jan 08      -  0:00 /usr/dt/bin/dtcm 
    root  90172 123038   0   Jan 08      -  0:35 /usr/lpp/X11/bin/X -D /usr/lib/X11//rgb 
-T -force :0 -auth /var/dt/A:0-DjUjUa 
    root  98390      1   0   Jan 08      -  8:36 /usr/sbin/syncd 60 
    root 106640 131160   0   Jan 08      -  0:25 /usr/dt/bin/dtsession

要进一步识别由 CPU 占用者分解的进程,请参见清单 4

清单 4. 识别进程
# ps aux | more
USER        PID %CPU %MEM   SZ  RSS    TTY STAT    STIME  TIME COMMAND
root       8196 12.9  0.0  384  384      - A      Jan 08 14695:30 wait
root      57372 12.8  0.0  384  384      - A      Jan 08 14542:51 wait
root      61470 12.2  0.0  384  384      - A      Jan 08 13884:38 wait
root      53274 12.0  0.0  384  384      - A      Jan 08 13711:38 wait
root     245938  0.0  0.0  828  856      - A      Jan 08 20:17 /usr/bin/xmwlm -
root      98390  0.0  0.0  508  516      - A      Jan 08  8:36 /usr/sbin/syncd 
root      69666  0.0  0.0  960  960      - A      Jan 08  3:46 gil
root          0  0.0  0.0  384  384      - A      Jan 08  2:49 swapper
root      49176  0.0  0.0  448  448      - A      Jan 08  1:13 xmgc
root     241842  0.0  0.0 23

如果要了解有关进程的优先值的更多信息,则需要使用 -l 标志。“NI”列显示了优先值(请参见清单 5)。

清单 5. 使用 -l 标志获取优先值
# ps -elf
F   S   UID   PID   PPID   C PRI   NI ADDR    SZ   WCHAN  STIME   TTY TIME    CMD
200003 A   root 1    0     0  60  20 14001400  660   Jan 08  - 0:05    /etc/init 
240001 A   root  82126 204974  0  60 20 3c22b510 1264  Jan 08 - 0:00 
/usr/sbin/snmpmibd 
240801 A   root  86210 106640  0   60  20 584d2400  2156  Jan 08  - 0:00 
/usr/dt/bin/dtcm 
240001 A   root  90172 123038  0      60  20 5136 f1000100224650e0  5136  
Jan 08  - 0:35 
/usr/lpp/X11/bin/X 
  -D /usr/lib/X11//rgb -T -force :0 -auth /var/dt/A:0-DjUjUa 
240001 A   root  98390     1   0   60  20 41a5400   508 * Jan 08  - 8:36 
/usr/sbin/syncd 60 
240001 A   root 106640 131160  0   60  20 3816a400  1880  Jan 08 - 0:25 
/usr/dt/bin/dtsession 
40001  A   root 123038     1   0   60  20 5c153400   380  Jan 08-  0:00 
/usr/dt/bin/dtlogin  -daemon

清单 6 中的命令提供了前三个正在执行的进程,并给出了它们的优先值。

清单 6. 获取前 3 个正在执行的进程
# ps -elf | egrep -v "STIME|$LOGNAME" | sort +3 -r | head -n 15
   40401 A   nobody 323762 127128   0  60 20 602dc400  660 f1000600002daa08 Jan 08 - 0:00 
/usr/HTTPServer/bin/httpd -d /usr/HTTPServer -k restart 
   40001 A   nobody 319662 127128   0  60 20 6c35f400  1336  *   Jan 08      -  0:00 
/usr/HTTPServer/bin/httpd -d /usr/HTTPServer -k restart 
   40001 A   nobody 307358 127128   0  60 20 3834a400  1340  *   Jan 08      -  0:00 
/usr/HTTPServer/bin/httpd -d /usr/HTTPServer -k restart 
  240001 A   daemon 254084 204974   0  60 20 58272400  1364      Jan 08      -  0:00 
/usr/sbin/rpc.statd -d 0 -t 50

现在,您已经知道了终止系统的是哪些进程(您也可以使用 topas 或 nmon),下面该如何处理呢?如果有一个命令能让您对内核的处理计划设置优先级,是不是就完美无缺了?当然有这样的命令,不仅如此,还有另一个命令允许您对已经运行的进程再次设置优先级。这两个命令分别是 nicerenice。在 AIX 中,用户作业的基本优先级为 40,其缺省优先值为 20。这两个数字一起构成了缺省优先级 60。绝大多数作业都使用此值。缺省优先级编号越高,作业的优先级就越低。如果要以较低的优先级启动作业,则可以尝试清单 7 中的命令。

清单 7. 以较低的优先级启动作业
# nice -n 10 thisjob

清单 7 中的命令在缺省值 20 上又增加 10,从而创建出新的优先值 30 和优先级 70。

运行清单 8 中的命令导致进程 1683 的优先值变为 30。

清单 8. 导致进程 1683 的优先值变为 30
# renice -n 10 -p 1683

procmon 实用工具

尽管 AIX 的基本操作系统附带了很多性能工具,但在最近引入的性能监视工具中,最好的可能莫过于 procmon(在 AIX 5.3 中引入)。此实用工具会显示一个动态的进程列表,此列表已经过排序,可提供有关这些进程的所有信息。它允许执行 nicerenicekill 等基本的管理命令。procmon 工具在 Performance Workbench 平台上运行,此工具基于 Eclipse,并具有一个小巧的图形用户界面来显示系统活动。要启动 procmon,请启动 perfwb,后者将启动带有 procmon 插件的 Eclipse(请参见清单 9)。在此过程中,您需要使用 bos.perf.gtools.perfwb 文件集。

清单 9. 启动 perfwb
# /usr/bin/perfwb

缺省情况下,procmon 工具将显示以下内容:

  • 进程已运行的时间长度
  • 进程正在使用的 CPU 资源数量
  • 进程是否正受到系统处罚
  • 进程正在使用的内存量
  • 进程所执行的 I/O 次数
  • 进程的优先级和优先值
  • 创建特定进程的人员

此外,它还具有下列选项可供执行:

  • procfiles
  • proctree
  • procsig
  • procstack
  • procrun
  • procmap
  • procflags
  • proccred
  • procldd

进程表是 procmon 的主要组件,它显示了正在系统上运行的各个进程,您可以根据用户配置对它们进行排序和筛选。缺省情况下,进程表中列出的进程数是 20,但使用主菜单中的 Table Properties 面板,用户可以轻松地更改进程数。有关此重要工具的更多信息,请参见参考资料

WLM

WLM 是一个复杂的工具,可用于监视性能、收集记帐数据以及管理独立系统上的负荷。在分区环境中,此工具还可以用作(配合 DLPAR)资源提供工具。对系统管理员而言,这种方式可有效监视并控制进程的资源使用情况。

AIX 上的 WLM 功能提供了一系列有用的工具,它们不仅有助于收集性能统计信息,还可以为您提供一种机制来控制对进程进行的资源分配。此功能适用于运行多个应用程序、数据库和事务处理系统的大型系统,其中所有工作负荷被合并到单个大型系统中(“垂直”服务器整合)。它提供了在作业间划分系统资源而无需对系统分区的灵活性。使用 WLM,您不仅可以防止不同类别的作业相互干扰,还可以基于不同用户组的要求分配资源。很多人将 WLM 与分区负荷管理器 (PLM) 混淆在一起。实际上,PLM 是一个资源管理器,它基于已定义的策略和资源利用率在 IBM System p™ 环境中分配和移动资源,其中包括高级 Power 虚拟化。PLM 使用微分区技术重新调整资源,可用于管理内存、专用处理器分区以及共享处理器分区。这又为 POWER Hypervisor 提供的微分区灵活性增加了灵活性。遗憾的是,PLM 未考虑到分区中运行的任何工作负荷的重要性,因此无法基于工作负荷类型的更改重新调整优先级。

结束语

对 UNIX 系统管理员而言,进程管理与最激动人心的工作相去甚远。尽管它单调乏味、令人生厌,但它是系统管理所必需的。您始终都需要回答有关进程管理的各种问题:如何加快进程的处理速度?为什么此进程需要如此长的时间才能完成?您需要确定出现问题的进程,并采取一切措施提高进程的运行效率。此外,您还需要了解完成此项工作所需的最佳工具,您可以只运行 ps 命令并使用 renice,还可以使用 procmon 等新增的性能实用工具,甚至可以引入企业级进程计划实用工具(例如 WLM),以便更有效地管理所有系统进程。在引入任何新的元素之前,请尝试对进程和计划的内核概念进行一些其他方面的研究。在开始工作之前,真正理解所要从事的工作从长远来看会对您有更大的帮助。

参考资料

学习

获得产品和技术

  • 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=209892
ArticleTitle=AIX 上的进程优先级与进程控制
publish-date=04162007