linux性能监控,就是要监控系统的各个子系统是否正常。linux主要的子系统包括:CPU、Memory、IO和Network,它们之间相互依赖,一个出问题可能会影响其他的。比如:网卡流量很大会导致更多的CPU开销,因为频繁的响应中断执行协议栈。
性能监控时,首先要确定应用的类型,然后对症下药,可以将应用分成:
CPU密集型:CPU开销很高,比如大量的CPU运算、科学计算等。通常web server属于这类。
IO密集型:大量的磁盘读写,高负荷的内存使用。IO密集型不会对CPU发起更多的请求,它占用CPU只是为了产生IO请求然后sleep。通常数据库属于这一类型。
上下文切换(Context Switch)是多任务操作系统的基石,每个进程都有自己的执行环境就是进程的上下文,这些上下文就是当前进程使用的寄存器,比如PC、栈指针%esp、帧指针%ebp等。每个处理器核心在任意时刻只能执行一个进程或线程,当线程的时间片用尽或者线程阻塞(比如线程执行磁盘io或网络io时),进程调度器会根据一定的规则(比如选择运行时间加权之后最少的)挑选一个线程占有处理器。因为CPU的寄存器集合只有一份,所有必须要保存上一个进程使用的寄存器,同时恢复被调度的进程的寄存器状态。
上下文切换时有损耗的。一般地,当系统中线程过多或者io负载过高时,上下文切换会比较频繁,此时CPU时间过多的消耗在上下文切换。
内核中的进程调度器维护着运行队列(run queue),而每个阻塞源维护着自己的阻塞队列(wait queue,比如一个文件描述符,正在读写该文件的进程会被阻塞在其阻塞队列上)。任意一个进程要么处于可执行状态,要么阻塞状态。所有的可执行状态的进程都处于运行队列,如果当前系统CPU负载很高,那么运行队列的长度很大,进程调度器就不会及时响应系统请求。当运行队列越来越大时,进程或线程将花费更多的时间来获取CPU时间。
> cat /proc/loadavg 0.02 0.05 0.05 1/279 23903上述命令可以显示系统负载,分别是:过去1分钟、5分钟、15分钟的系统负载、当前正在执行的进程数/系统的所有进程数、最后执行的进程的pid。top命令也可以现在系统负载。
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相关的各个列的意思:
> 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 - |__pythonLinux中是不区分进程和线程的,线程就是可以共享资源的进程。TID就是线程的PID,这里可以查看各个线程的CPU使用情况。
> ps axu | grep flush root 927 0.0 0.0 0 0 ? S May23 2:34 [flush-202:2] root 14413 0.0 0.0 10200 856 pts/2 S+ 16:53 0:00 grep flush
> vmstat 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 6004 38264 99552 3741240 0 0 0 4 0 0 0 0 100 0 0 0 6004 37364 99552 3741244 0 0 0 0 1565 906 0 0 99 0内存相关列的意思:
> pidstat -r -p 31679 1 1 Linux 2.6.32-5-xen-amd64 (debian-org) 2012年10月12日 _x86_64_ (4 CPU) 17时10分02秒 PID minflt/s majflt/s VSZ RSS %MEM Command 17时10分03秒 31679 1292.00 0.00 871348 107852 2.58 node 平均时间: 31679 1292.00 0.00 871348 107852 2.58 node各个列含义:
> sar -B Linux 2.6.32-5-xen-amd64 (debian-org) 2012年11月17日 _x86_64_ (4 CPU) 00时00分01秒 pgpgin/s pgpgout/s fault/s majflt/s pgfree/s pgscank/s pgscand/s pgsteal/s %vmeff 00时05分01秒 0.00 200.84 364.65 0.00 538.94 0.00 0.00 0.00 0.00 00时15分01秒 0.00 184.84 353.72 0.00 396.33 0.00 0.00 0.00 0.00 …… 09时45分01秒 0.00 1822.52 1175.53 0.00 9406.76 0.00 0.00 0.00 0.00 09时55分01秒 0.00 3401.99 1556.25 0.00 10269.71 0.00 0.00 0.00 0.00 平均时间: 0.00 319.68 429.48 0.00 1036.33 0.00 0.00 0.00 0.00各个列的含义:
> sar -r Linux 2.6.32-5-xen-amd64 (debian-org) 2012年11月17日 _x86_64_ (4 CPU) 00时00分01秒 kbmemfree kbmemused %memused kbbuffers kbcached kbcommit %commit 00时05分01秒 1636744 2551244 60.92 498112 1626600 180708 4.31 00时15分01秒 1634724 2553264 60.97 498112 1626628 181304 4.33 …… 09时55分01秒 1555940 2632048 62.85 498128 1624716 200876 4.80 10时05分01秒 1548416 2639572 63.03 498128 1624760 206364 4.93 10时15分01秒 1545200 2642788 63.10 498128 1624804 212948 5.08 10时15分01秒 kbmemfree kbmemused %memused kbbuffers kbcached kbcommit %commit 10时25分01秒 1542332 2645656 63.17 498128 1624852 211524 5.05 平均时间: 1624618 2563370 61.21 498118 1626298 183528 4.38各个列的含义:
sar -B 1 5 Linux 2.6.32-5-xen-amd64 (debian-org) 2012年11月17日 _x86_64_ (4 CPU) 18时53分20秒 pgpgin/s pgpgout/s fault/s majflt/s pgfree/s pgscank/s pgscand/s pgsteal/s %vmeff 18时53分21秒 0.00 0.00 40.00 0.00 355.00 0.00 0.00 0.00 0.00 18时53分22秒 0.00 0.00 42.00 0.00 362.00 0.00 0.00 0.00 0.00 18时53分23秒 0.00 0.00 32.00 0.00 355.00 0.00 0.00 0.00 0.00 18时53分24秒 0.00 6584.00 104.00 0.00 414.00 0.00 0.00 0.00 0.00 18时53分25秒 0.00 28.00 66.00 0.00 427.00 0.00 0.00 0.00 0.00 平均时间: 0.00 1322.40 56.80 0.00 382.60 0.00 0.00 0.00 0.00