日期:2014-05-16  浏览次数:20688 次

Linux性能监控(1)

        linux性能监控,就是要监控系统的各个子系统是否正常。linux主要的子系统包括:CPU、Memory、IO和Network,它们之间相互依赖,一个出问题可能会影响其他的。比如:网卡流量很大会导致更多的CPU开销,因为频繁的响应中断执行协议栈。

        性能监控时,首先要确定应用的类型,然后对症下药,可以将应用分成:
        CPU密集型:CPU开销很高,比如大量的CPU运算、科学计算等。通常web server属于这类。
        IO密集型:大量的磁盘读写,高负荷的内存使用。IO密集型不会对CPU发起更多的请求,它占用CPU只是为了产生IO请求然后sleep。通常数据库属于这一类型。

1. CPU

1. 上下文切换

        上下文切换(Context Switch)是多任务操作系统的基石,每个进程都有自己的执行环境就是进程的上下文,这些上下文就是当前进程使用的寄存器,比如PC、栈指针%esp、帧指针%ebp等。每个处理器核心在任意时刻只能执行一个进程或线程,当线程的时间片用尽或者线程阻塞(比如线程执行磁盘io或网络io时),进程调度器会根据一定的规则(比如选择运行时间加权之后最少的)挑选一个线程占有处理器。因为CPU的寄存器集合只有一份,所有必须要保存上一个进程使用的寄存器,同时恢复被调度的进程的寄存器状态。

        上下文切换时有损耗的。一般地,当系统中线程过多或者io负载过高时,上下文切换会比较频繁,此时CPU时间过多的消耗在上下文切换。

2. 运行队列

        内核中的进程调度器维护着运行队列(run queue),而每个阻塞源维护着自己的阻塞队列(wait queue,比如一个文件描述符,正在读写该文件的进程会被阻塞在其阻塞队列上)。任意一个进程要么处于可执行状态,要么阻塞状态。所有的可执行状态的进程都处于运行队列,如果当前系统CPU负载很高,那么运行队列的长度很大,进程调度器就不会及时响应系统请求。当运行队列越来越大时,进程或线程将花费更多的时间来获取CPU时间。

> cat /proc/loadavg
0.02 0.05 0.05 1/279 23903
        上述命令可以显示系统负载,分别是:过去1分钟、5分钟、15分钟的系统负载、当前正在执行的进程数/系统的所有进程数、最后执行的进程的pid。top命令也可以现在系统负载。

3. vmstat

        vmstat提供一种低开销的方式统计系统性能数据。

>  vmstat 1 1
procs -----------memory------------------- ---swap-- -----io---- -system-- ----cpu----
r  b   swpd   free     buff    cache        si   so    bi    bo     in   cs     us sy id wa
0  0      0   1540304  497972  1631008      0    0     0    45      0    0       2  0 97  1    
        与CPU相关的各个列的意思:
        r:当前运行队列中的进程的数目,就是那些处于可执行状态,但是得不到CPU的进程。
        b:当前处于阻塞状态,并等待IO请求完成的进程的数目。
        in:当前处理的中断数目。
        cs:当前系统发生的上下文切换次数。
        us:CPU在用户空间执行的时间的百分比。
        sy:CPU在内核空间执行的时间的百分比。
        id:CPU空闲时间的百分比。
        wa:由于所有可运行进程等待IO请求完成被阻塞导致的CPU空闲时间的百分比。

4. pidstat

        pidstat用于查看进程所属的线程的CPU的使用情况。

> pidstat -p 2036 -t 1 1
Linux 2.6.32-5-xen-amd64 (vzw51173.puppetclient.163.com)        2012年10月12日  _x86_64_        (4 CPU)
16时09分17秒      TGID       TID    %usr %system  %guest    %CPU   CPU  Command
16时09分18秒      2036         -    0.00    2.00    0.00    2.00     3  python
16时09分18秒         -      2036    0.00    0.00    0.00    0.00     3  |__python
16时09分18秒         -      2041    0.00    0.00    0.00    0.00     3  |__python
16时09分18秒         -      5639    0.00    0.00    0.00    0.00     2  |__python
16时09分18秒         -      5650    0.00    1.00    0.00    1.00     1  |__python
平均时间:      TGID       TID    %usr %system  %guest    %CPU   CPU  Command
平均时间:      2036         -    0.00    2.00    0.00    2.00     -  python
平均时间:         -      2036    0.00    0.00    0.00    0.00     -  |__python
平均时间:         -      2041    0.00    0.00    0.00    0.00     -  |__python
平均时间:         -      5639    0.00    0.00    0.00    0.00     -  |__python
平均时间:         -      5650    0.00    1.00    0.00    1.00     -  |__python
        Linux中是不区分进程和线程的,线程就是可以共享资源的进程。TID就是线程的PID,这里可以查看各个线程的CPU使用情况。

5. 总结

        vmstat     ->     top     ->     pidstat
        通过vmstat查看整体CPU使用情况,top查看CPU占用高的几个进程,pidstat查看这几个进程对应的线程。
        监控CPU性能包括以下几个部分:
       a. 检查CPU的run queue,每个CPU的run queue最好不要超过3个进程。
       b. 确定CPU利用率在usr/sys = 65% / 35% ~ 70% / 30%之间。
      &n