Linux性能监控(3)


目录(?)[+]

(一) linux性能监控,就是要监控系统的各个子系统是否正常。



         linux主要的子系统包括:CPU、Memory、IO和Network,它们之间相互依赖,一个出问题可能会影响其他的。 

                                                                       比如:网卡流量很大会导致更多的CPU开销,因为频繁的响应中断执行协议栈。

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

                                          通常数据库属于这一类型。

1. CPU


1.1 上下文切换

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

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

2. 运行队列

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

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

3. vmstat

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

[plain]  view plain copy
  1. >  vmstat 1 1  
  2. procs -----------memory------------------- ---swap-- -----io---- -system-- ----cpu----  
  3. r  b   swpd   free     buff    cache        si   so    bi    bo     in   cs     us sy id wa  
  4. 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空闲时间的百分比。

       Memory 
   swpd: 虚拟内存使用情况,单位:KB
   free: 空闲的内存,单位KB
   buff: 被用来做为缓存的内存数,单位:KB
Swap 
     si: 从磁盘交换到内存的交换页数量,单位:KB/秒
     so: 从内存交换到磁盘的交换页数量,单位:KB/秒
IO 
    bi: 发送到块设备的块数,单位:块/秒
   bo: 从块设备接收到的块数,单位:块/秒
System 
   in: 每秒的中断数,包括时钟中断
   cs: 每秒的环境(上下文)切换次数
CPU 
 按 CPU 的总使用百分比来显示
    us: CPU 用户使用时间
    sy: CPU 系统使用时间
  id: 闲置时间
   r、b列一般为0,表示没有等待进程,如果不为0表示系统性能有问题
  si、so 两 列,表示内存交换的频繁程度,如果数值长期很大,表示内存不够,要和硬盘交换数据,也可以表示要读写的数据每次都不一样
  bi、bo 两列,表示I/O输入输出很频繁


4. pidstat

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

[plain]  view plain copy
  1. > pidstat -p 2036 -t 1 1  
  2. Linux 2.6.32-5-xen-amd64 (vzw51173.puppetclient.163.com)        2012年10月12日  _x86_64_        (4 CPU)  
  3. 16时09分17秒      TGID       TID    %usr %system  %guest    %CPU   CPU  Command  
  4. 16时09分18秒      2036         -    0.00    2.00    0.00    2.00     3  python  
  5. 16时09分18秒         -      2036    0.00    0.00    0.00    0.00     3  |__python  
  6. 16时09分18秒         -      2041    0.00    0.00    0.00    0.00     3  |__python  
  7. 16时09分18秒         -      5639    0.00    0.00    0.00    0.00     2  |__python  
  8. 16时09分18秒         -      5650    0.00    1.00    0.00    1.00     1  |__python  
  9. 平均时间:      TGID       TID    %usr %system  %guest    %CPU   CPU  Command  
  10. 平均时间:      2036         -    0.00    2.00    0.00    2.00     -  python  
  11. 平均时间:         -      2036    0.00    0.00    0.00    0.00     -  |__python  
  12. 平均时间:         -      2041    0.00    0.00    0.00    0.00     -  |__python  
  13. 平均时间:         -      5639    0.00    0.00    0.00    0.00     -  |__python  
  14. 平均时间:         -      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%之间。
       c. 当CPU的处理时间更多的是在system空间,说明已经超负荷。
       d. 当I/O增多时,CPU密集型的应用将受到影响。
       e. 当CPU的IOWait占用比较大的比例时,说明IO出现异常。

2. Memory

1. 虚拟内存 swap space

         虚拟内存就是在硬盘上划出一部分区域做为内存使用,当系统可用的内存低于某个值时,内核就会将当前不再活跃的内存块写入磁盘(被当作内存的磁盘,即虚拟内存),然后这块内存(原存数据的内存)可以作为其他用途使用。当cpu需要访问被写入磁盘的数据时,再把它读入到内存中。上述操作对用户来说是透明的,磁盘的读写是很慢的,比内存要慢几千万倍(磁盘10ms,内存100-200ns),所以要尽量把数据放在内存中,程序才会运行的更快。硬盘中用作替代内存的部分就是虚拟内存,成为swap space,把内存中不经常使用的数据交换到硬盘上,此块硬盘称为虚拟内存,而原内存变为可用。

2. 页高速缓存

        Linux内核通过页高速缓存来加快磁盘操作。当系统存在大量的空闲内存时,内核会把空闲内存的一部分做为页高速缓存。当某个磁盘块被缓存之后,对于这个磁盘块的读写就相当于内存操作。读操作时直接读对应的page,写操作时将内容写入对应的page,然后将该page标记为脏页,会有后台线程flush(linux 2.6内核)完成将脏页同步回磁盘。flush在脏页比例大于某个阈值,或者修改超过一定时间之后进行写回。

[plain]  view plain copy
  1. > ps axu | grep flush  
  2. root       927  0.0  0.0      0     0 ?        S    May23   2:34 [flush-202:2]  
  3. root     14413  0.0  0.0  10200   856 pts/2    S+   16:53   0:00 grep flush  


3. vmstat

        vmstat可以查看系统的内存相关信息。

[plain]  view plain copy
  1. > vmstat 1  
  2. procs -----------memory------------- ----swap----- -----io---- -system-- ----cpu----  
  3. r  b   swpd   free     buff      cache     si   so    bi    bo   in    cs   us  sy id wa  
  4. 0  0   6004  38264  99552 3741240    0    0     0     4    0      0    0  0 100  0  
  5. 0  0   6004  37364  99552 3741244    0    0     0     0  1565  906  0  0 99  0  
        内存相关列的意思:
        swpd:当前使用的虚拟内存的总额(KB),当空闲内存达到更低的阈值时,更多的页会被交换到磁盘。
        free:当前内存中的空闲空间的大小(KB)。
        buff:当前内存中用于read和write操作的缓冲区的大小(KB)。
        cache:页高速缓存大小(KB)。
        si:从swap写回内存的大小(KB)。
        so:写入swap的大小(KB)。
        bi:从文件系统或交换设备读的磁盘块的大小(KB)。读磁盘。
        bo:从内存写入文件系统或交换设备的大小(KB)。写磁盘。

4. pidstat

        查看进程的缺页情况。

[plain]  view plain copy
  1. > pidstat -r -p 31679 1 1  
  2. Linux 2.6.32-5-xen-amd64 (debian-org)   2012年10月12日  _x86_64_        (4 CPU)  
  3.   
  4. 17时10分02秒       PID      minflt/s  majflt/s     VSZ    RSS    %MEM  Command  
  5. 17时10分03秒     31679   1292.00      0.00    871348 107852   2.58   node  
  6. 平均时间:           31679   1292.00      0.00    871348 107852   2.58  node  
        各个列含义:
        minflt/s:进程平均每s造成的minor fault,这些错误不会导致从磁盘加载内存页。
        majflt/s:进程平均每s造成的major fault,这些错误会导致从磁盘加载内存页。
        VSZ:进程使用的所有虚拟内存的大小(KB)。
        RSS:进程使用的物理内存大小(KB)。
        %MEM:占用物理内存百分比。

5. sar

        a. 查看页统计信息
[plain]  view plain copy
  1. > sar -B  
  2. Linux 2.6.32-5-xen-amd64 (debian-org)   2012年11月17日  _x86_64_        (4 CPU)  
  3.   
  4. 00时00分01秒  pgpgin/s pgpgout/s   fault/s  majflt/s  pgfree/s pgscank/s pgscand/s pgsteal/s    %vmeff  
  5. 00时05分01秒      0.00    200.84      364.65      0.00    538.94      0.00      0.00      0.00      0.00  
  6. 00时15分01秒      0.00    184.84      353.72      0.00    396.33      0.00      0.00      0.00      0.00  
  7. ……  
  8. 09时45分01秒      0.00   1822.52    1175.53      0.00   9406.76      0.00      0.00      0.00      0.00  
  9. 09时55分01秒      0.00   3401.99    1556.25      0.00  10269.71      0.00      0.00      0.00      0.00  
  10. 平均时间:            0.00    319.68       429.48      0.00   1036.33      0.00      0.00      0.00      0.00  
        各个列的含义:
        pgpgin/s:每s从磁盘换入的页的大小(KB)
        pgpgout/s:每s换出到磁盘的页的大小(KB)
        fault/s:每s发生的缺页错误的次数,包括minor fault和major fault。
        majflt/s:每s发生的major fault的次数,major fault会导致从磁盘载入内存页(即使用了swap分区)。
        pgfree/s:每s放入空闲列表中的页的个数。
        pgscank/s:每s被kswapd后台进程扫描的页的个数。
        pgscand/s:每s直接被扫描的页的个数。
        pgsteal/s:为了满足内存要求,每s从cache(pagecache和swapcache)回收的页的个数。
        %vmeff:等于pgsteal  /  pgscan,用于计算页回收(page reclaim)的效率。
        
        b. 查看内存使用信息
[plain]  view plain copy
  1. > sar -r  
  2. Linux 2.6.32-5-xen-amd64 (debian-org)   2012年11月17日  _x86_64_        (4 CPU)  
  3.   
  4. 00时00分01秒 kbmemfree kbmemused  %memused kbbuffers  kbcached  kbcommit   %commit  
  5. 00时05分01秒   1636744   2551244             60.92    498112   1626600    180708      4.31  
  6. 00时15分01秒   1634724   2553264             60.97    498112   1626628    181304      4.33  
  7. ……  
  8. 09时55分01秒   1555940   2632048             62.85    498128   1624716    200876      4.80  
  9. 10时05分01秒   1548416   2639572             63.03    498128   1624760    206364      4.93  
  10. 10时15分01秒   1545200   2642788             63.10    498128   1624804    212948      5.08  
  11.   
  12. 10时15分01秒 kbmemfree kbmemused  %memused kbbuffers  kbcached  kbcommit   %commit  
  13. 10时25分01秒   1542332   2645656     63.17    498128   1624852    211524      5.05  
  14. 平均时间:     1624618   2563370     61.21    498118   1626298    183528      4.38  
        各个列的含义:
        kbmemfree:可用的空闲内存(KB)。
        kbmemused:使用的内存,不包括内核自己使用的内存(KB)。
        %memused:使用的内存的比例。
        kbbuffers:被内核用做缓冲区的内存(KB)。
        kbcached:被内核用来缓存数据的内存(KB)。
        kbcommit:对于当前的工作量需要的内存(KB),确定RAM/Swap的大小以防止out of memory。
        %commit:当前的工作量需要的内存和所有内存(RAM+Swap)的百分比。
        上面两种sar的使用方式可以查看从0点到现在的每分钟的统计信息,可以通过sar -B interval times以固定间隔时间interval秒统计times次数据,比如:
[plain]  view plain copy
  1. sar -B 1 5  
  2. Linux 2.6.32-5-xen-amd64 (debian-org)   2012年11月17日  _x86_64_        (4 CPU)  
  3.   
  4. 18时53分20秒  pgpgin/s pgpgout/s   fault/s  majflt/s  pgfree/s pgscank/s pgscand/s pgsteal/s    %vmeff  
  5. 18时53分21秒      0.00      0.00     40.00      0.00    355.00      0.00      0.00      0.00      0.00  
  6. 18时53分22秒      0.00      0.00     42.00      0.00    362.00      0.00      0.00      0.00      0.00  
  7. 18时53分23秒      0.00      0.00     32.00      0.00    355.00      0.00      0.00      0.00      0.00  
  8. 18时53分24秒      0.00   6584.00    104.00      0.00    414.00      0.00      0.00      0.00      0.00  
  9. 18时53分25秒      0.00     28.00     66.00      0.00    427.00      0.00      0.00      0.00      0.00  
  10. 平均时间:        0.00   1322.40     56.80      0.00    382.60      0.00      0.00      0.00      0.00  

5. 总结

         a. 当系统出现较少的page fault,说明页命中率很高,会获得较好的响应时间。
        b. 在没有写入swap和disk的情况下,空闲内存越小,表明页高速缓存利用率越高。
        c. 如果系统不断报告swap device繁忙,那么说明系统内存不足。

(二) linux经验总结(持续更新)

1. 单个进程打开的文件描述符最大值

默认是1024,可以通过ulimit -a查看所有的限制

ulimit -n 可以查看文件描述符最大值。

并可以通过ulimit -n 65535设置这一次会话的最大值。

2. 查看linux机器的连接数

netstat -est | grep established | grep -v packets

    1186 connections established

3. 生成动态链接库

[plain]  view plain copy
  1. gcc -fpic -shared -o mylib.so mylib.c  
-fpic:输出的对象是地址可重定位的。

-shared:指定生成动态链接库。

使用动态链接库:

[plain]  view plain copy
  1. gcc -o libtst libtst.c /home/tst/mylib.so  
或者吧mylib.so拷贝到/usr/lib/下,然后使用:

[plain]  view plain copy
  1. gcc -o libtst libtst.c -lmylib  

4. 生成静态链接库

1)用gcc编绎该文件,可以使用任何合法的编绎参数       
[plain]  view plain copy
  1. gcc -c lib_test.c -o lib_test.o  
2) $ar crv libtest.a lib_test.o   //生成静态库生成libtest.a
3) 在某些系统中还要为静态库生成一个内容表   $ranlib libtest.a
4) 使用静态链接库
        $nm libtest.a    //nm工具可以打印出库中的涉及到的所有符号,库既可以是静态的也可以是动态的。nm列出的符号有很多, 常见的有三种,一种是在库中被 调用,但并没有在库中定义(表明需要其他库支持),用U表示;一种是库中定义的函数,用T表示,这是最常见的;另外一种是所谓的"弱态”
 符号,它们虽然在库中被定义,但是可能被其他库中的同名符号覆盖,用W表示。
$gcc -c -I/home/lib main.c //假设main.c要使用对应的静态库
$gcc -o main -L/home/lib main.o libtest.a
说明:这里的-I/home/lib和-L/home/lib是通过-I和-L指定对应的头文件和库文件的路径,libtest.a就是要用的静态库。在main.c中要包含静态库的头文件。

5. 彻底删除文件

一般,我们都是用rm来删除文件或文件夹,但是rm并不真的清空该文件所占用的数据块的内容,而只是释放了索引节点,所以可以通过一些恢复这些文件。有时,需要彻底删除文件,以释放空间,可以使用shred命令。
[plain]  view plain copy
  1. shred -u file_path  
运行这个命令就可以彻底删除文件。

经过测试,shred这个命令在运行时很耗cpu。实际上,用rm就可以达到彻底删除文件,并释放空间的目的:

[plain]  view plain copy
  1. rm -rf file_path  

这个命令就相当于windows下shift+delete。

还可以使用

[plain]  view plain copy
  1. > file_path  
这样可以清空文件的内容

6. 查看CPU每个核的信息

使用top,然后按1,显示所有核的状态:

[plain]  view plain copy
  1. top - 00:18:57 up  1:17,  6 users,  load average: 0.48, 0.75, 1.36  
  2. Tasks: 200 total,   1 running, 199 sleeping,   0 stopped,   0 zombie  
  3. Cpu0  : 27.8%us,  2.7%sy,  0.0%ni, 60.2%id,  9.4%wa,  0.0%hi,  0.0%si,  0.0%st  
  4. Cpu1  : 25.3%us,  3.7%sy,  0.0%ni, 71.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st  
  5. Cpu2  : 28.7%us,  4.0%sy,  0.0%ni, 67.3%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st  
  6. Cpu3  : 26.3%us,  2.7%sy,  0.0%ni, 71.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st  

7. 定时执行命令,观察输出

如果要持续执行一个命令,然后观察输出的话,我们一遍一遍的按上回车,然后看着输出。watch命令可以很好的实现这个功能。比如,要监控linux的连接数:

[plain]  view plain copy
  1. watch -n 2 -d 'netstat -est | grep est'  
输出:

[plain]  view plain copy
  1. Every 2.0s: netstat -est | grep est                                                                                              Mon Mar 19 10:46:03 2012  
  2.   
  3.     12784 connections established  
  4.     556 packets rejects in established connections because of timestamp  
  5.     2015 congestion windows fully recovered without slow start  
  6.     9672 congestion windows partially recovered using Hoe heuristic  
  7.     20983 congestion windows recovered without slow start by DSACK  
  8.     22010 congestion windows recovered without slow start after partial ack  
-n指定命令执行的时间间隔,-d高亮显示连续两侧输出的差别,为了便于观察,最后一个参数是要执行的命令。

8. ubuntu下配置ssh服务

安装openssh-server:

[plain]  view plain copy
  1. apt-get install openssh-server  
启动命令:

[plain]  view plain copy
  1. 1. service ssh start  
  2. 2. /etc/init.d/ssh start  
第一种是推荐的方式。

9. 查看cpu和内核信息

a. 查看os内核信息

[plain]  view plain copy
  1. uname -a  
Linux vyz20242 2.6.32-5-xen-amd64 #1 SMP Tue Jun 14 12:46:30 UTC 2011 x86_64 GNU/Linux

b. 操作系统发行版本信息

[plain]  view plain copy
  1. cat /etc/issue | grep Linux  
Debian GNU/Linux 6.0 \n \l

c. linux内核版本

[plain]  view plain copy
  1. cat /proc/version  
Linux version 2.6.32-5-amd64 (Debian 2.6.32-41squeeze2) ([email protected]) (gcc version 4.3.5 (Debian 4.3.5-4) ) #1 SMP Thu Mar 22 17:26:33 UTC 2012

10. 查看系统页大小

[plain]  view plain copy
  1. getconf PAGESIZE  



参考:http://blog.csdn.net/chosen0ne/article/details/8200737

你可能感兴趣的:(Linux性能监控(3))