读书人

Unix/Linux 系统自动化治理: CPU 管理

发布时间: 2012-07-03 13:37:43 作者: rapoo

Unix/Linux 系统自动化管理: CPU 管理篇

在 Unix/Linux 系统日常管理和系统维护的过程中,随时可能需要查看 CPU 的使用状态,并根据相应信息分析系统状况,判断系统的资源使用情况和系统负载情况。本文在介绍 Unix/Linux 系统中 CPU 相关机制和工具的基础上,对各工具进行了分析比较,并给出了自动化监控系统环境和 CPU 利用率的例子代码供读者参考。在 AIX 系统的 CPU 使用状态监控部分,我们将介绍 lparstat,mpstat 等工具。而在 Linux 系统 CPU 使用状态监控部分,我们将重点介绍 /proc 文件系统和 ps 等命令。

了解 AIX 系统中的可用 CPU 资源

AIX 系统中每个处理器在低位内存中有着对应的全局数据结构 PPDA (Per-processor Data Area),其中存储了处理器的各种配置信息和运行状态,比如时钟频率和 CPU 运行时间。AIX 系统接口查询 PPDA 中的数据并提供给终端用户或者应用程序使用。但在进行 CPU 监控之前,系统用户首先需要了解当前的系统环境和可用的计算资源。对于不同的系统环境,用户需要不同的监控策略。首先,对于没有划分微分区 (Micro Partition) 的服务器,系统用户可以通过很多操作系统接口得到机器实际可用的资源种类和数量。

硬件和操作系统没有使用虚拟化技术的系统


清单 1. 运行 prtconf 获得处理器的相关信息
使用微分区的系统

虚拟化作为一项成熟的技术,在 IBM eServer pSeries 服务器和 BladeCenter JS 刀片服务器中已经得到广泛的应用。所以我们有必要简单说明用户在常见的虚拟化环境,微分区 (Micro Partition) 中如何得到可用的资源状态。AIX 的命令接口在虚拟化环境下仍然可以使用,但是通常得到的结果是分配给当前虚拟机的虚拟处理器 (Virtual CPU) 的信息,而不是物理处理器 (Physical CPU) 的。


清单 2. 在微分区上运行 prtconf 获得虚拟处理器的信息
使用负载分区的系统

从 AIX 6.1 开始,用户可以创建并使用负载分区 (Workload Partition,简称 WPAR)。负载分区可以模拟一个 AIX 6.1 用户环境,但在缺省情况下,CPU 资源不会被以 dedicated 方式划分给负载分区。所以 AIX 的系统命令,比如 lsdev 在负载分区下的输出结果会是当前系统没有处理器。负载分区中的用户,在系统响应不够及时的情况下,通常有如下几种可能:

    负载分区本身被分配的资源不足负载分区的其对应的宿主机的负载过大,或者出现了 IO 瓶颈

    后面的段落会具体介绍如何确定和解决负载分区中跟 CPU 相关的系统瓶颈。

    获得 AIX 系统中处理器资源的代码示例

    本段的最后给出一段基于 Perl 的例子代码,在 AIX5.3 和 6.1 上测试通过,可以侦测当前的系统环境和 CPU 的类型和数量。这段代码首先运行系统命令 oslevel 得到当前系统的版本,如果是 AIX6.1 则运行命令 lparstat 判断当前系统是否为 WPAR。无论 AIX 系统的版本如何,都加参数 -i 运行命令 lparstat 来获得分区的个数,并以此判断是否使用了微分区技术。最后调用命令 prtconf 输出 CPU 的一些参数。

    该段代码可以帮助用户快速了解当前环境,尤其适用于工作环境复杂或频繁变更的场景。需要指出的是对于使用了微分区技术的系统,代码的最后输出的是虚拟处理器的数量。需要了解系统中物理处理器和逻辑处理器状态的用户,可以参阅本文其他段落加以补充。


    清单 4. 获得当前的系统环境和 CPU 的类型和数量的代码示例

    Unix/Linux 系统自动化治理: CPU 管理篇
    Unix/Linux 系统自动化治理: CPU 管理篇
    回页首

    使用 AIX 系统工具分析处理器的工作状态

    在了解当前环境的可用 CPU 资源以后,可以对系统监控的对象和方法进行规划。多数情况下,操作系统提供的命令输出提供逻辑处理器 (Logical CPU) 的信息。在 IBM eServer pSeries 服务器和 BladeCenter JS 刀片服务器中,逻辑处理器通常通过并行多线程技术实现。下文是对该技术在 AIX 系统中应用的介绍。

    并行多线程的查询和设置

    并行多线程 (Simultaneous Multi-threading,简称 SMT) 是一种基于超标量 (superscalar) 体系结构处理器的技术,允许多个独立的线程在一个时钟周期内对多个功能处理单元 (Functional Unit) 发出指令。通常情况下,线程和功能处理单元的绑定是完全动态的。使用这项技术可以较明显的提高处理器的的实际利用率,进而表现出更强的运算性能。在 AIX 操作系统上,我们可以通过 smtctl 命令来查询和设置并行多线程的运行状态。


    清单 5. 运行 smtctl 查询处理器对 SMT 技术的支持和当前的设置
    系统处理器负载的查询和分析

    在了解系统中并行多线程的设置以后,用户需要得到不同时间段内处理器的使用状态。为此 AIX 系统提供了丰富的系统接口。用户可以根据不同的情况选用他们,检查和判断系统中 CPU 的运行状态。本文仅以 lparstat 和 mpstat 为例进行说明。

    lparstat 命令

    上文的例子代码使用了 lparstat。这个命令可以在各种系统环境,如负载分区中使用,得到当前系统的配置和部分运行状态,其中的部分内容与 CPU 直接相关。在 AIX 6.1 操作系统中,lparstat 也可以用来显示负载分区 (Workload Partition) 的信息,比如负载分区使用的 CPU 资源。用户可以查阅手册得到该命令的详细说明。

    lparstat 命令非常适合获得当前系统或分区的配置信息,但是用来监控 CPU 负载有两个主要的不足。首先这条命令不能得到单个处理器的负载情况,所以不能用来直接确定多处理器负载不均的问题;其次这条命令在 AIX 6.1 系统上的支持的参数与 5.3 相比变化较大。所以本文主要介绍 mpstat 命令,用于检测 AIX 系统中的 CPU 状态。

    mpstat 命令

    与 lparstat 命令相似,mpstat 可以自动识别当前的系统设置,比如是否开启了 SMT 功能。与 lparstat 不同的是,mpstat 可以得到详细的单个处理器的运行状况。


    图 1. 在没有微分区 (Micro Partition) 的系统上运行 mpstat 获得处理器负载
    Unix/Linux 系统自动化治理: CPU 管理篇?

    该命令检测系统中全部处理器的利用情况,并且给出各项的总和。下面是几个常用的输出项

      lcpu: 工作的逻辑处理器的个数us: 运行的用户程序所占用的 CPU 百分比sy: 运行的内核程序所占用的 CPU 百分比wa: CPU 用来等待 IO 所占用的百分比id: CPU 空闲且不等待 IO 所占用的百分比

      通常情况下,CPU0 的负载会略高于其他处理器。在其他处理器负载相差不多而且 CPU0 的负载不太高的情况下,可以认为是正常的情况。反之则可能存在系统或应用程序上的分配问题。

      在显示的内容中,如果 wa 的值过高,则表示应用程序有过多的时间等待 IO 操作,外存的访问存在性能瓶颈。如果 id 的值如果持续低于 30,而且 wa 不高,则表明 CPU 比较繁忙 , 可以考虑对应用程序进行优化。如果是微分区或负载分区系统中,应当考虑是否需要分配更多的处理器资源。

      mpstat 命令提供了参数,可以周期性的检测并汇报系统状态。在 mpstat 命令的输出满足用户需要的情况下,用户可以指定合适的间隔并以后台运行 mpstat,以实现对系统 CPU 的持续监控。下面的命令会在一天的时间内每隔半小时自动搜集一次系统信息。

      mpstat 1800 48 > /tmp/mpstat_output &

      用户可以有策略的检查输出文件中的内容,以确定系统的运行状态。

      捕捉处理器异常状态的代码示例

      下面一段 Perl 代码测试于 AIX5.3 和 6.1 系统,首先运行系统命令 smtctl 检查并行多线程技术的开启状态,然后依次检查 mpstat 命令输出文件中的每行内容,并把可能表示异常情况的行存入一个数组。


      清单 6. 捕捉处理器异常状态的代码示例

      Unix/Linux 系统自动化治理: CPU 管理篇
      Unix/Linux 系统自动化治理: CPU 管理篇
      回页首

      了解 Linux 系统中的可用 CPU 资源

      Linux 系统由于其开放性的优势,近年来在易用性,稳定性和市场占有率上获得了一定的进步。Linux 提供了一个特殊而强大的伪文件系统 proc。在设计之初,proc 的目的是用户能够方便快捷的访问进程。经过长时间的发展,proc 文件系统已经可以提供查询系统状态,例如 CPU 状态,更改系统参数等多方面的功能。

      在绝大多数的 Linux 发行版中,/proc 文件系统在系统启动时缺省挂载到目录 /proc,作为操作系统和应用进程的接口。用户和应用程序可以通过 proc 得到系统的信息,并可以改变内核的某些参数。/proc 目录中包含了许多特殊文件以允许对驱动和内核信息进行高层访问。只要用户或应用程序有正确的访问权限,它们就可以通过读写这些文件来获得信息或设置参数。由于 Linux 系统的状态,如进程占用的资源,是动态改变的,所以用户或应用程序读取 proc 文件时,proc 文件系统是动态从系统内核读出所需信息并提交的。当系统重启或者电源关闭的时候,/proc 系统中原有的数据和信息将全部丢失。但在下次系统启动时会重新建立。下面会介绍与 CPU 直接相关的两个 /proc 文件,cpuinfo 和 loadavg。

      文件 /proc/cpuinfo 存放了 Linux 系统的 CPU 信息。随着 Linux 发行版,CPU 的类型、设置的不同,该文件的内容会有比较大的差异。有些发行版本的 cpuinfo 文件包含了诸如 CPU 步进 (stepping),制造厂商等详细的 CPU 硬件信息。而在一部分发行版中,该文件仅包含了每个处理器的基本信息,比如时钟频率。需要用户注意的是,在使用了 SMT 技术的系统上,/proc/cpuinfo 显示的是逻辑处理器的个数和属性。


      清单 7. 在 IBM JS BladeCenter 上读取 /proc/cpuinfo
      获得系统处理器配置的代码示例

      下面的例子代码适用于使用 Power CPU 或者 Intel CPU 的 Linux 系统,并在 Redhat 企业服务器版和 Suse 企业服务器版上测试通过。它首先运行命令 arch 判断当前系统的运行平台,并读取 /proc/cpuinfo 文件。在 Power 平台上调用特有的 ppc64_cpu 命令获得 SMT 配置,并读取 /proc/ppc64/lparcfg 文件以获得 CPU 的运行模式;在 System x 系列服务器上则是通过解析文件 /proc/cpuinfo 的内容来获得 SMT 配置。代码的最后依次输出了系统中 CPU 资源的数量、配置、运行模式和类型。


      清单 10. 获取系统 CPU 资源配置的代码示例


      Unix/Linux 系统自动化治理: CPU 管理篇
      Unix/Linux 系统自动化治理: CPU 管理篇
      Unix/Linux 系统自动化治理: CPU 管理篇
      回页首

      使用 Linux 系统接口分析处理器的工作状态

      因为 Linux 系统特有的开放性,用户可以自主的添加,定义或者改变系统原有的功能。有很多开源项目提供了基于图形的或者命令行的工具,帮助用户更加方便的识别、监控甚至改变系统中的处理器的运行状态。考虑到通用的原则,本文仅介绍常见 Linux 发行版本中已经集成的接口或者工具。

      系统处理器负载的查询和分析

      查看 /proc/stat 文件获得 CPU 状态

      /proc/stat 的内容包含了系统中的各项基本信息,例如 CPU 状态。用户可以详细了解系统中每个处理器自系统启动以来的运行状态,并以此分析和评估应用环境的工作是否正常。


      清单 11. 读取 /proc/stat 获得 CPU 的使用情况
      获得各处理器利用率和耗用处理器时间最多的进程的代码示例

      本段的最后给出一段例子代码,可以获得一段时间内的 CPU 利用率,并且找出系统中占用 CPU 较多的进程,已在 Redhat 企业服务器和 Suse 企业服务器上测试通过。代码首先选取两个相隔一分钟的两个时间段,分别读取文件 /proc/stat 的内容,获得 CPU 在两个时刻的进程占用时间等数值来计算 CPU 利用率。并且读取文件 /proc/loadavg 获得处理器上的集成负载。在负载较高的情况下,调用命令 ps 找出消耗 CPU 最多的几个进程,及其所在的处理器(processor)。


      清单 15.? 获得各处理器的利用率和耗用处理器时间最多的进程代码示例

      在得到需要关注的进程以后,用户可以进一步查看进程的应用类型和状态。详情可以参考本系列文章之进程管理篇。


      Unix/Linux 系统自动化治理: CPU 管理篇
      Unix/Linux 系统自动化治理: CPU 管理篇
      Unix/Linux 系统自动化治理: CPU 管理篇
      回页首

      小结

      在本世纪的第一个十年,计算机中的 CPU 暂时结束了高主频的竞赛,转而向多核心发展。为了真正发挥多核心 CPU 的运算效能,需要将计算任务进行科学的拆分,并且根据不同运算核心的状态有选择的进行分配。这同时需要操作系统和应用程序的良好支持。虽然并行运算的研究已经进行了几十年,但由于其复杂性,实际应用中还会存在系统负载过高,处理器负载不均,程序同步等待时间长等各种问题。应用本文上述的各种工具和手段,可以帮助我们准确的判断异常情况的根源,并采取相应的对策。随着多核系统软硬件技术的发展,程序员将可以花更少的时间写出在更多应用场景中具有更高运算效能的程序,并在将来逐渐解决这些常见的问题。



      参考资料

      学习
        Running Linux, Fifth Edition(Matthias Kalle, Dalheimer?和?Matt Welsh?著;O'Reilly & Associates,2005)本书包含完整 Linux 的安装指导教程,系统维护的完整信息、文档开发和编程工具、网络管理的指导原则。?

        Programming Perl Third Edition(Larry Wall、Tom Christiansen 和 Jon Orwant 著;O'Reilly & Associates,2000)本书是最好的 Perl 指南之一。

        Perl Cookbook(Tom Christiansen 和 Nathan Torkington 著;O'Reilly & Associates,1998)本书是 Perl 问题的权威性入门书籍。?

        IBM Publication:?《命令参考大全,卷 5:s - u 》:AIX 6.1 信息中心文档,系统管理类。?

        有关 Perl 信息及其相关资源,请查看?Perl.com。?

        Programming Perl Third Edition(Larry Wall、Tom Christiansen 和 Jon Orwant 著;O'Reilly & Associates,2000)是当今最好的 Perl 指南,现在已经更新到 5.005 和 5.6.0。?

        Perl Cookbook(Tom Christiansen 和 Nathan Torkington 著;O'Reilly & Associates,1998)是关于所有 Perl 问题的权威性入门书籍。?
        http://www.ibm.com/developerworks/cn/aix/library/0909_unixcpu_wangwh/

读书人网 >UNIXLINUX

热点推荐