扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
通过 kill 和 nice 等工具管理进程非常简单,但如果要对进程进行更为细化的管理控制,又该如何呢?在使用 AIX 的多处理器系统中,您可以将进程和线程分配给特定的处理器来实现此目的,但如何选择适当的应用程序并组织更大的系统,以便对该应用程序进行相应的优化呢?
在本文中,您将了解可用于组织进程的各种工具,然后分析组织和选择进程背后的理论,并学习如何有效设置进程的优先级。
引言
作为一名 AIX 管理员,您应该已经了解有关如何处理进程的基础知识,包括研究进程、设置进程的优先级和终止进程。此外,您还应该知道如何使用手头的各种工具来调整进程并相应地进行优化。这些工具包括 AIX 5.3 中新增的一些工具。要在系统上提供有效的进程控制,您必须了解进程和线程的定义以及二者之间的区别。本文还将介绍 ps、nice、schedtune 命令以及进程监视器控制台 (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 命令可以更改这一缺省值。增加时间切片可减少上下文切换,从而可以提高系统吞吐量。使用 vmstat 或 sar 命令可以查看上下文切换。如果上下文切换的值非常高,则增加时间切片可提高性能,但这必须在经过大量分析之后才能实施。
在系统模式方面,CPU 有两种运行模式:内核模式和用户模式。在用户模式中,程序对进程专用区域中的用户数据具有读写访问权限。此模式是进程积累其大多数 CPU 时间所在的模式。另一种模式是内核模式。以内核模式运行的某些程序包括中断处理程序和内核进程。当在某个进程的上下文中执行以此模式运行的代码时,它不仅对全局内核地址空间具有读写访问权限,还将对该进程中的内核数据也具有读写访问权限。对于进程地址空间中的用户数据,必须使用内核服务进行访问。当用户程序访问系统调用时,它将在内核模式而不是用户模式下进行。您需要理解这一概念,才能尝试解释 vmstat 和 sar 等命令的输出。
处理器关联性和绑定处理器
处理器关联性是操作系统提供的在 SMP 硬件上使用的工具。从本质上讲,进程中的所有线程都可以绑定到指定的处理器上运行。AIX 会在每个 CPU 上都设置一个运行队列,以此来自动尝试推动处理器关联性的建立,这一点我在前面已经讨论过。通过使用进程关联性来绑定线程或取消线程的绑定,可帮助您找到难以调试的挂起或死锁的根本原因。对于某些应用程序,如果将它们的线程始终绑定在特定的 CPU 上运行,还可能提高其运行速度。
在典型的 SMP 系统中,所有处理器都完全相同并可以在其系统上运行任意线程。从本质上讲,任何进程或线程都可以分派到任意处理器上运行,但绑定在特定处理器上运行的处理器或线程除外。此操作可通过 bindprocessor 命令实现。让我们看一个示例(请参见清单 1)。
The available processors are: 0 1 2 3
在此示例中,您可以看到有四个处理器可供调用。这些可用的处理器是:0、1、2、3。
以下命令显示了绑定到 CPU3 的处理器(请参见清单 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),下面该如何处理呢?如果有一个命令能让您对内核的处理计划设置优先级,是不是就完美无缺了?当然有这样的命令,不仅如此,还有另一个命令允许您对已经运行的进程再次设置优先级。这两个命令分别是 nice 和 renice。在 AIX中,用户作业的基本优先级为 40,其缺省优先值为 20。这两个数字一起构成了缺省优先级 60。绝大多数作业都使用此值。缺省优先级编号越高,作业的优先级就越低。如果要以较低的优先级启动作业,则可以尝试清单 7 中的命令。
清单 7 中的命令在缺省值 20 上又增加 10,从而创建出新的优先值 30 和优先级 70。
运行清单 8 中的命令导致进程1683 的优先值变为 30。
清单 8. 导致进程 1683 的优先值变为 30# renice -n 10 -p 1683
procmon 实用工具
尽管 AIX的基本操作系统附带了很多性能工具,但在最近引入的性能监视工具中,最好的可能莫过于 procmon(在 AIX 5.3 中引入)。此实用工具会显示一个动态的进程列表,此列表已经过排序,可提供有关这些进程的所有信息。它允许执行 nice、renice 和 kill 等基本的管理命令。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),以便更有效地管理所有系统进程。在引入任何新的元素之前,请尝试对进程和计划的内核概念进行一些其他方面的研究。在开始工作之前,真正理解所要从事的工作从长远来看会对您有更大的帮助。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者