性能测试系统资源监控(一)---CPU

在单用户多任务的操作系统中,或者多用户多任务的操作系统中,系统同时运行多个程序,这些程序的并行运行势必形成对系统资源的竞争使用。因此,操作系统必须能够处理和管理这种并行运行的程序,使之对资源的使用按照良性的顺序进行
进程是一个程序关于某个数据集的一次运行。进程是程序的一次运行活动,是一个动态的概念,而程序是静态的概念,是指令的集合。进程具有动态性和并发性,程序是进程运行所对应的运行代码,一个进程对应于一个程序,一个程序可以同时对应于多个进程。一个进程从创建而产生至撤销而消亡的整个生命周期,可以用一组状态加以刻画。为了便于管理进程,把进程划分为几种状态,分别有三态模型和五态模型。
当处理器不能即时处理进程时,就会出现进程排队的现象,如果出现持续排队的现象就说明CPU当前处于繁忙状态,所以分析CPU是否处于繁忙状态的第一个指标是CPU的队列长度。
进程的三态模型如图所示。
性能测试系统资源监控(一)---CPU
上图进程三态模型及其状态转换
按照进程在执行过程中的不同状况,至少可以定义三种不同的进程状态。

  1. 运行态:占有处理器正在运行。
  2. 就绪态:具备运行条件,等待系统分配处理器以便运行。
  3. 等待态(阻塞态):不具备运行条件,正在等待某个事件的完成。
    一个进程在创建后将处于就绪状态。每个进程在执行过程中,都处于上面三种状态中的某一种状态。同时,在一个进程执行过程中,它的状态将会发生改变。
    运行状态的进程将由于出现等待事件而进入等待状态,当等待事件结束之后等待状态的进程将进入就绪状态,而处理器的调度策略又会引起运行状态和就绪状态之间的切换。引起进程状态转换的具体原因如下:
  4. 运行态→等待态:等待使用资源,如等待外设传输;等待人工干预。
  5. 等待态→就绪态:资源得到满足,如外设传输结束;人工干预完成。
  6. 运行态→就绪态:运行时间片到后出现有更高优先权进程。
  7. 就绪态→运行态:CPU空闲时选择一个就绪进程。
    进程的五态模型如图所示。
    性能测试系统资源监控(一)---CPU
    相对于三态模型,五态模型增加以下两种状态:
    挂起就绪态:表明进程具备运行条件但目前在二级存储器中,当它被对换到主存才能被调度执行。
    挂起等待态:表明进程正在等待某一个事件且在二级存储器中。
    引起进程状态转换的具体原因如下:
  8. 等待→挂起等待:没有进程处于就绪状态或就绪进程要求更多内存资源时,发生这种转换,以提交新进程或运行就绪进程;
  9. 就绪→挂起就绪:当有高优先级阻塞(系统认为会很快就绪的)进程和低优先级就绪进程时,系统会选择挂起低优先级就绪进程;
  10. 运行→挂起就绪:对抢占式系统,当有高优先级阻塞挂起进程因事件出现而进入就绪挂起时,系统可能会把运行进程转到挂起就绪状态;
  11. 挂起就绪→就绪:没有就绪进程或挂起就绪进程优先级高于就绪进程时,发生转换;
  12. 挂起等待→等待:当一个进程释放足够内存时,系统会把一个高优先级挂起阻塞(系统认为会很快出现所等待的事件)进程转换为等待状态;
    为了了解系统当前进程队列状态信息,可以使用vmstat命令来查看进程队列信息,该命令可迅速提供关于各种系统资源和与之相关的性能问题的简要信息,vmstat命令报告关于内核线程的统计信息,包括处于运行和等待队列中的、内存中的、页面调度中的、磁盘中的、中断、系统调用、上下文切换和CPU活动的内核线程。该报告显示CPU活动的详细信息:用户方式、系统方式、空闲时间和等待磁盘I/O的百分比。
    vmstat命令的基本使用方法如下:
    vmstat interval count
    interval指每隔多长时间输出一次结果。
    Count指需要输入多少次结果。
    注意:如果使用vmstat命令时不带任何选项,或者只带有间隔时间和任意的计数参数,例如vmstat 2 10,那么vmstat报告中的第一行信息为自系统重新引导以来的平均值。
    例如:vmstat 2 10表示每隔2秒输出一次结果,一共输出10次结果。
    性能测试系统资源监控(一)---CPU
    分析排列主要分析kthr(内核线程)的值,关于kthr的列如下:
    -r
    可运行的内核线程平均数据,包括正在运行的线程和正在等待CPU的线程。如果这个数字大于CPU的数目,那说明至少有一个线程要等待CPU,等待CPU的线程越多,越有可能对性能产生影响。
    -b
    每秒VMM等待队列中的内核线程平均数,这包括正在等待文件系统I/O的线程,或由于内存装入控制而暂挂的线程。如果进程由于内存装入控制而暂挂,在vmstat报告中阻塞列(b)表明线程数目增加,而不是运行队列数目增加。
    关于进程控制的信息,需分析以下参数:
    -in
    在某一时间间隔中观测到的每秒设备中断数。
    -cs
    在某一时间间隔中观测到的每秒钟上下文切换次数,物理CPU资源细分为每个10毫秒的逻辑时间片,假设一个线程被调度运行,它将一直运行直到它的时间片用完、直到被抢先或直到它自愿放弃CPU控制权,当给予另一个线程CPU控制权时,必须保存前一个线程的上下文或工作环境,并且必须装入当前线程的上下文,操作系统有一个很有效的上下文切换过程,所以每次切换并不消耗资源,任何上下文切换的显著增加,如cs比磁盘I/O和网络信息包速率高得多,这些都应该进一步检查。
    分析完成CPU队列值之后需要进一步分析CPU的繁忙程度,分析CPU的繁忙程度主要从以下几个方面分析:
    -us
    us列显示用户方式下所花费CPU时间百分比,UNIX进程可以在用户方式下执行,也可以在系统(内核)方式下执行,当在用户方式下时,进程在它自己的应用程序代码中执行,不需要内核资源来进行计算、管理内存或设置变量。
    -sy
    sy列详细描述了CPU在系统方式下执行一个进程所花时间百分比,这包括内核进程(kporcs)和其它需要访问内核资源的进程所消耗的CPU资源,如果一个进程需要内核资源,它必须执行一个系统调用,并需要切换到系统方式,从而使用资源变的可用。例如,对一个文件的读或写操作需要内核资源来打开文件、寻找特定的位置,以及读或写数据,除非使用内存映射文件。
    -id
    id列显示了没有使用本地磁盘I/O时CPU空闲或等待的时间百分比。如果没有线程可以执行(运行队列为空),系统会分派一个叫wait线程,也称为idle kproc。在一个SMP系统中,每个处理器都有一个wait线程可以分派。
    -wa
    wa列详细显示了暂挂本地磁盘I/O和NFS加载的磁盘的CPU空闲百分比。如果在wait运行时至少有一个未完成的磁盘I/O,该时间就归为I/O等待时间,除非进程使用异常I/O,否则对磁盘的I/O请求会导致调用的进程阻塞(或睡眠),直到请求完成为止。一旦进程的I/O请求完成,该进程就放入运行队列中,如果I/O很快完成,该进程可以使用更多的CPU时间,如果wa的值超过25%说明磁盘子系统可能没有被正确平衡,或者这也可能是磁盘密集工作负载的结果。
    分析了CPU细分的百分比后,接下来应该继续分析CPU密集程序,分析CPU密集程序有两个标准工具,ps命令和top命令。
    ps命令是一个灵活的工具,用来识别系统中运行的程序和它们使用的资源,它显示关于系统中进程的统计信息和状态信息,如线程或线程标识、I/O活动、CPU或内存利用情况。
    一般使用ps命令需要分析三个可能输出的列:
    C 进程近来使用CPU的时间;
    TIME 从进程启动以来使用CPU的总时间(以分钟和秒为单位);
    %CPU 从进程启动以来使用CPU的总时间除以线程启动后所经历的时间,这是度量程序对CPU依赖程度的一种方法。
    需要获得最近使用CPU高度密集的用户进程,可以使用以下命令:
    ps –ef报告如图所示。
    性能测试系统资源监控(一)---CPU
    其中第四列(C)是最近CPU使用情况,循环进程很容易在该列中排在最前面。
    如果需要分析CPU时间比值,可以使用以下命令:
    ps –au报告如图所示。
    性能测试系统资源监控(一)---CPU
    %CPU是自从进程启动以来分配给该进程的CPU时间百分比,它的计算公式如下:
    (进程CPU时间/进程持续时间)*100
    例如:假设有两个进程,进程A启动并运行5秒钟,但并不结束,然后启动进程B并运行5秒钟,但并不结束,此时使用ps命令显示进程A的%CPU值为50%(经历10秒,CPU使用时间为5秒),进程B为100%(经历5秒钟,CPU时间为5秒钟)。
    通过top命令也可以获取CPU密集程序,top命令可以动态监控系统资源使用情况。
    性能测试系统资源监控(一)---CPU
    关于CPU密集信息主要关注CPU的使用信息即可,并且top会按CPU使用率的降序排序,CPU使用率最高的排在最前面,即CPU密集程序排在最前面。