CPU性能统计数据及Linux监控工具使用

一、CPU性能统计数据

1.Run Queue Statistics-- 运行队列统计

In Linux, a process can be either runnableor blocked waiting for an event to complete. A blocked process may be waitingfor data from an I/O device or the results of a system call. If a process isrunnable, that means that it is competing for the CPU time with the otherprocesses that are also runnable. A runnable process is not necessarily usingthe CPU, but when the Linux scheduler is deciding which process to run next, itpicks from the list of runnable processes. When these processes are runnable,but waiting to use the processor, they form a line called the run queue. Thelonger the run queue, the more processes wait in line.

Linux系统中,一个进程可以是runnable或者是blocked等待一个事件来完成两种状态。一个blocked的进程可能是在等待从I/O设备读取数据或者从系统返回结果。如果一个进程是runnable,意味着它正与其他也是runnable的进程竞争CPU时间。一个runnable的进程不一定正在消耗CPU,但是当Linux的调度器决定下一个运行的进程时,它会选择runnable队列中的进程来运行。当这些进程都是runnable时,会等待使用CPU,这时他们会排成一条线,我们称之为运行队列。运行队列越长,队列中等待的进程越多。

The performance tools commonly show thenumber of processes that are runnable and the number of processes that are blockedwaiting for I/O. Another common system statistic is that of load average. Theload on a system is the total amount of running and runnable process. Forexample, if two processes were running and three were available to run, thesystem's load would be five. The load average is the amount of load over agiven amount of time. Typically, the load average is taken over 1 minute, 5minutes, and 15 minutes. This enables you to see how the load changes overtime.

 

性能测试工具通常会显示runnable状态和blocked等待I/O的进程的数量。另一个常见的系统统计数据是平均负载。系统的负载是指正在运行的和runnable状态的进程的总数量。例如,如果有两个进程正在运行,三个可运行,那么系统的负载是5。平均负载是指给定时间内的负载数量。通常情况下,平均负载时间取值为1分钟,5分钟和15分钟。这可以让你看到随时间变化负载的变化情况。

 

2. Context Switches --上下文切换

Most modern processors can run only oneprocess or thread at a time. Although some processors, such hyperthreadedprocessors, can actually run more than one process simultaneously, Linux treatsthem as multiple single-threaded processors. To create the illusion that agiven single processor runs multiple tasks simultaneously, the Linux kernelconstantly switches between different processes. The switch between differentprocesses is called a context switch, because when it happens, the CPU savesall the context information from the old process and retrieves all the contextinformation for the new process. The context contains a large amount ofinformation that Linux tracks for each process, including, among others, whichinstruction the process is executing, which memory it has allocated, and whichfiles the process has open. Switching these contexts can involve moving a largeamount of information, and a context switch can be quite expensive. It is agood idea to minimize the number of context switches if possible.

 

大部分的现代处理器同一时间只能处理一个进程或一个线程。尽管许多处理器,像多线程处理器,可以实际上同时处理多个进程,Linux仍然将他们视为多个单线程处理器。一个给定的单处理器同时运行多个任务其实是一种错觉,实际上Linux内核是在不同进程之间进行切换导致的。这种进程之间的切换称之为上下文切换,因为当上下文切换发生时,CPU会保存原来的进程的所有上下文信息并且检索新进程的所有上下文信息。Linux为每个进程监测到大量的上下文信息,包括进程执行的指令,分配的内存和进程已经打开的文件。切换这些上下文可能会涉及到大量的信息,并且一个上下文切换可能会相当耗费资源。因此尽可能的减少上下文切换的数量是个相当好的主意。

To avoid context switches, it is importantto know how they can happen. First, context switches can result from kernelscheduling. To guarantee that each process receives a fair share of processortime, the kernel periodically interrupts the running process and, ifappropriate, the kernel scheduler decides to start another process rather thanlet the current process continue executing. It is possible that your systemwill context switch every time this periodic interrupt or timer occurs. Thenumber of timer interrupts per second varies per architecture and kernelversion. One easy way to check how often the interrupt fires is to use the/proc/interruptsfile to determine the number of interrupts that have occurredover a known amount of time.

 

为了避免上下文切换,了解他们是怎么发生的就非常重要了。首先,内核调度会导致上下文切换。为了保证每一个进程收到公平的进程时间,内核会定期的中断当前正在运行的进程,并且在适当的情况下,由内核调度器决定来启动另一个进程而不是继续执行当前的进程。有可能你的系统在每次这种周期性中断或者定时器启动时会进行上下文切换。每秒定时器中断的数量会随着每个架构和内核版本而发生相应的变化。有一个简单的方法来检查中断频率,可以使用/proc/interrupts 文件来检查已知时间内中断发生的数量。

 

3.Interrupts -- 中断

In addition, periodically, the processorreceives an interrupt by hardware devices. These interrupts are usuallytriggered by a device that has an event that needs to be handled by the kernel.For example, if a disk controller has just finished retrieving a block from thedrive and is ready for the kernel to use it, the disk controller may trigger aninterrupt. For each interrupt the kernel receives, an interrupt handler is runif it has been registered for that interrupt; otherwise, the interrupt isignored. These interrupt handlers run at a very high priority in the system andtypically execute very quickly. Sometimes, the interrupt handler has work thatneeds to be done, but does not require the high priority, so it launches a"bottom half," which is also known as a soft-interrupt handler. Ifthere are a high number of interrupts, the kernel can spend a large amount oftime servicing these interrupts. The file /proc/interrupts can be examined toshow which interrupts are firing on which CPUs

 

此外,定期的,处理器会受到由硬件设备发起的中断。这些中断通常由需要内核处理的事件的设备触发。例如,一个磁盘控制器结束了一个从设备检索的处理,并且正准备被内核调用,这时硬盘控制器可能会触发一个中断。对于内核接受的每个中断,如果这个中断的处理程序已经被注册并正在运行,则中断,否则,中断被忽略。这些中断处理程序在系统中运行优先级很高并且通常执行非常快速。有时,中断处理程序需要完成任务,但是并不需要很高的优先级,所以它会启动一个“bottom half”,被称之为软中断处理程序。如果出现大量的中断,内核会消耗大量的时间来处理这些中断。文件/proc/interrupts 可以检查展示有多少中断在哪一个CPU上。(中断一般是由硬件设备触发的,比如鼠标或者键盘操作,都是常见的中断,并且,如果发生鼠标或者键盘操作,系统都是要优先处理的。)

 

4.CPU Utilization -- CPU利用率

CPU utilization is a straightforwardconcept. At any given time, the CPU can be doing one of seven things. First, itcan be idle, which means that the processor is not actually doing any work andis waiting for something to do. Second, the CPU can be running user code, whichis specified as "user" time. Third, the CPU can be executing code inthe Linux kernel on behalf of the application code. This is "system"time. Fourth, the CPU can be executing user code that has been"nice"ed or set to run at a lower priority than normal processes.Fifth, the CPU can be in iowait, which mean the system is spending its timewaiting for I/O (such as disk or network) to complete. Sixth, the CPU can be inirq state, which means it is in high-priority kernel code handling a hardwareinterrupt. Finally, the CPU can be in softirq mode, which means it is executingkernel code that was also triggered by an interrupt, but it is running at a lowerpriority (the bottom-half code). This can happen when a device interruptoccurs, but the kernel needs to do some work with it before it is ready to handit over to user space (for example, with a network packet).

 

CPU利用率是一个简单的概念。在任意给定的时间内,CPU可以在做这七件事之一。首先,可他可以是空闲,它意味着处理器实际上没有处理任何任务并且等待任务。其次,CPU可以正在运行用户代码,被定义为用户时间。第三,CPU可以正在执行Llinux内核应用代码。这是系统时间。第四,CPU可以正在执行niced用户代码或者运行一个比正常进程优先级要低的进程。第五,CPU可以在iowait,意味着系统正在消耗时间等待I/O(例如磁盘或者网络)完成处理。第六,CPU可以是出于irq状态,意味着它正在处理高优先级内核硬件中断代码。最后,CPU可以是softirq状态,意味着正在处理中断引起的内核代码,但是它正在运行一个较低优先级的进程(bottom-half 代码)。当一个设备中断发生时可能会发生这种情况,但是内核在移交到用户空间之前需要做一些准备工作(例如,使用一个网络数据包)。(一般第二种情况,我们称之为用户态CPU,第三种情况称之为系统态CPU

Most performance tools specify these valuesas a percentage of the total CPU time. These times can range from 0 percent to100 percent, but all three total 100 percent. A system with a high"system" percentage is spending most of its time in the kernel. Toolssuch as oprofile can help determine where this time is being spent. A systemthat has a high "user" time spends most of its time runningapplications. The next chapter shows how to use performance tools to track downproblems in these cases. If a system is spending most of its time iowait whenit should be doing work, it is most likely waiting for I/O from a device. It maybe a disk, network card, or something else causing the slowdown.

 

大多数的性能工具用百分比形式定义这些值占用总的CPU时间。这些时间范围从0到百分之百,但是这三个的总和为100%。一个系统有很高的系统态时间时,大部分消耗在内核。像oprofile这类工具可以帮助定义时间的消耗。一个系统有很高的用户时间时,大部分消耗在运行应用程序。下一章展示了如何使用性能工具来在这些情况下追踪问题。如果一个系统应该工作的时候消耗大部分时间来iowait,很可能是在等在I/O设备。它可能是磁盘,网卡,或者其他导致减速的东西。(这里说的三个的总和为100%,三项分别为用户态CPU、系统态CPU、和空闲CPU

 

二、Linux性能工具:CPU

1.vmstat

vmstatLinux系统提供的监控系统性能的性能工具,它对系统的消耗很小,是个非常不错的性能工具,它可以监控展示:正在运行的进程数;CPU使用情况;CPU收到的中断数;调度器进行了多少次上下文切换。

一般vmstat工具使用通过两个数字参数来完成,第一个参数是采样的时间间隔数,单位是秒,第二个参数是采样的次数

[root@localhost ~]# vmstat 2 1

procs -----------memory---------- ---swap-------io---- --system-- -----cpu------

 r b   swpd   free  buff  cache   si  so    bi    bo  in   cs us sy id wa st

 0  03429376  52448 231616 1207616    0   1     1    25   0    0  2  097  0 0

 

以上命令表示每2秒采集一次服务器状态,采集次数为1次。

但实际上,我们会在一段时间内一直监控服务器的资源使用情况

[root@localhost ~]# vmstat 2

procs -----------memory---------- ---swap-------io---- --system-- -----cpu------

 r b   swpd  free   buff  cache  si   so    bi   bo   in   cs us sy id wa st

 1  03432012  71060 231976 1193764    0   1     1    25   0    0  2  097  0 0

19  03432012  70912 232000 1193756   10   0    10    56 1354 5985 10  1 88 0  0

36  03432012  70920 232028 1193804    0   0     0   354 1401 5823  5  194  0 0

 0  03432012  70532 232036 1193792   16   0    16    16 1329 5962  6  293  0 0

 0  13432012  70392 232068 1193820  124   0   126   146 1514 6141  4  192  2 0

 1  03432012  69888 232092 1193804  298   0   298   156 1979 6471 11  2 81 6  0

97  03432012  69856 232124 1193888    4   0     4   112 4640 6355  2  295  0 0

 3  03432012  69492 232148 1193804   36   0    36   132 1963 6163 17  2 81 0  0

 0  03432012  69236 232156 1193884    6   0     6    46 1027 5571  3  196  0 0

 4  03432012  69004 232188 1193872    2   0     2    86 1326 5390  1  198  0 0

 0  03432012  68872 232204 1193888    2   0     2    66 2978 6230  3  193  3 0

这种情况下,我们可以只设定采集间隔,不设定采集次数,如上图所示这样,直到我们结束采集查询。

 

我们来看一下每个参数的含义:

procs

    r表示运行队列,即runnable状态的进程数,一般情况下,r值不宜超过CPU内核个数的三倍;

    b表示阻塞进程数;

memory       

   swpd 表示切换到内存交换区的内存数量(以K为单位)。如果swpd的值不为0,或者较大,只要siso的值长期未0,这种情况下一般不用担心,不会影响系统性能      

       free 表示当前空闲的物理内存数量(以K为单位)

       buff 表示buffers cache的内存数量,一般对块设备的读写才需要缓冲。

       cache 表示page cached的内存数量,一般作为文件系统的cached,频繁访问的文件都会被cached,如果cache值较大,说明cached的文件较多,如果IObi比较小,说明文件系统效率比较好

swap      

       si 表示由磁盘调入内存的数量;

       so 表示由内存调入磁盘的数量;

io      

       bi 从磁盘读入的数据总量(单位KB/s);

       bo 写入到磁盘的数据总量(单位KB/s);

system      

       in 每秒中断数,包括时钟中断;

       cs 每秒上下文切换次数;      

       这两个值越大,会看到由内核消耗的系统态CPU时间会越大;

cpu      

       us 用户态CPU,显示了用户应用程序消耗CPU的时间百分比;

       sy 系统态CPU,显示了内核进程消耗的CPU的时间百分比;

       id CPU处于空闲状态的四件百分比;

       wa IO等待消耗的CPU时间百分比,当wa的值较高时候,说明IO等待严重,这可能是由于磁盘大量做随机访问造成的,也有可能是磁盘出现了瓶颈;

       并且,一般情况下,当ussy的比例为7:1的时候为用户态与系统态的CPU的最佳比例。

 

2.top

top命令提供了实时的对系统处理器的状态监视,它将显示系统中CPU最免肝的任务列表,并且可以按CPU使用、内存使用和执行任务时间对任务进行排序。

 

第一行是运行队列信息,同uptime命令的执行结果

显示内容分别为

12:38:33  当前时间

up 50days         系统运行时间,格式为时:

1 user       当前登录用户数

load average: 0.06, 0.60, 0.48         系统负载,即任务队列的平均长度。 三个数值分别为  1分钟、5分钟、15分钟前到现在的平均值。

 

第二、三行为进程和CPU信息显示内容分别为

Tasks: 29 total 进程总数

1 running 正在运行的进程数

28 sleeping       睡眠的进程数

0 stopped         停止的进程数

0 zombie  僵尸进程数

Cpu(s): 0.3% us        用户态CPU占用CPU百分比

1.0% sy    系统态CPU占用CPU百分比

0.0% ni     用户进程空间内改变过优先级的进程占用CPU百分比

98.7% id   空闲CPU百分比

0.0% wa   等待输入输出的CPU时间百分比

 

第四、五行是内存信息

Mem: 191272k total        物理内存总量

173656k used  使用的物理内存总量

17616k free      空闲内存总量

22052k buffers         用作内核缓存的内存量

Swap: 192772k total        交换区总量

0k used    使用的交换区总量

192772k free   空闲交换区总量

123988k cached       缓冲的交换区总量。内存中的内容被换出到交换区,而后又被换入到内存,但使用过的交换区尚未被覆盖,该数值即为这些内容已存在于内存中的交换区的大小。相应的内存再次被换出时可不必再对交换区写入。

 

 

 

列表显示的进程信息如下:

列名         含义

PID   进程id

PPID          父进程id

RUSER      Realuser name

UID  进程所有者的用户id

USER         进程所有者的用户名

GROUP     进程所有者的组名

TTY  启动进程的终端名。不是从终端启动的进程则显示为 ?

PR    优先级

NI     nice值。负值表示高优先级,正值表示低优先级

P       最后使用的CPU,仅在多CPU环境下有意义

%CPU       上次更新到现在的CPU时间占用百分比

TIME         进程使用的CPU时间总计,单位秒

TIME+      进程使用的CPU时间总计,单位1/100

%MEM     进程使用的物理内存百分比

VIRT          进程使用的虚拟内存总量,单位kbVIRT=SWAP+RES

SWAP        进程使用的虚拟内存中,被换出的大小,单位kb

RES  进程使用的、未被换出的物理内存大小,单位kbRES=CODE+DATA

CODE        可执行代码占用的物理内存大小,单位kb

DATA         可执行代码以外的部分(数据段+)占用的物理内存大小,单位kb

SHR  共享内存大小,单位kb

nFLT 页面错误次数

nDRT        最后一次写入到现在,被修改过的页面数。

S       进程状态。

           D=不可中断的睡眠状态

           R=运行

           S=睡眠

           T=跟踪/停止

           Z=僵尸进程

COMMAND      命令名/命令行

WCHAN   若该进程在睡眠,则显示睡眠中的系统函数名

Flags         任务标志,参考sched.h

 

 

 

top视图下按1,可以查看所有逻辑CPU的使用状态

 

vmstattop都是Linux提供的性能工具,两个都非常好用,只是两者的情况不同,vmstat更适合监控当前系统的资源使用情况,top则更适合在发现问题时,来找出是哪个进程消耗了更多的CPU或者内存。

 

第一节英文部分参考《Phillip_G_Ezolt.2005.Optimizing_Linux_Performance_A_Hands-On_Guide_to_Linux_Performance》的第二章CPU内容整理

 


你可能感兴趣的:(linux,System,process,Waiting,Either)