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%之间。
c. 当CPU的处理时间更多的是在system空间,说明已经超负荷。
d. 当I/O增多时,CPU密集型的应用将受到影响。
e. 当CPU的IOWait占用比较大的比例时,说明IO出现异常。
2. Memory
1. 虚拟内存
虚拟内存就是在硬盘上划出一部分区域做为内存使用,当系统可用的内存低于某个值时,内核就会将当前不再活跃的内存块写入磁盘,然后这块内存可以作为其他用途使用。当cpu需要访问被写入磁盘的数据时,再把它读入到内存中。上述操作对用户来说是透明的,磁盘的读写是很慢的,比内存要慢几千万倍(磁盘10ms,内存100-200ns),所以要尽量把数据放在内存中,程序才会运行的更快。硬盘中用作替代内存的部分就是虚拟内存,成为swap
space。
2. 页高速缓存
Linux内核通过页高速缓存来加快磁盘操作。当系统存在大量的空闲内存时,内核会把空闲内存的一部分做为页高速缓存。当某个磁盘块被缓存之后,对于这个磁盘块的读写就相当于内存操作。读操作时直接读对应的page,写操作时将内容写入对应的page,然后将该page标记为脏页,会有后台线程flush(linux
2.6内核)完成将脏页同步回磁盘。flush在脏页比例大于某个阈值,或者修改超过一定时间之后进行写回。
> 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 |
3. vmstat
vmstat可以查看系统的内存相关信息。
> 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 |
内存相关列的意思:
swpd:当前使用的虚拟内存的总额(KB),当空闲内存达到更低的阈值时,更多的页会被交换到磁盘。
free:当前内存中的空闲空间的大小(KB)。
buff:当前内存中用于read和write操作的缓冲区的大小(KB)。
cache:页高速缓存大小(KB)。
si:从swap写回内存的大小(KB)。
so:写入swap的大小(KB)。
bi:从文件系统或交换设备读的磁盘块的大小(KB)。读磁盘。
bo:从内存写入文件系统或交换设备的大小(KB)。写磁盘。
4. pidstat
查看进程的缺页情况。
> 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 |
各个列含义:
minflt/s:进程平均每s造成的minor fault,这些错误不会导致从磁盘加载内存页。
majflt/s:进程平均每s造成的major fault,这些错误会导致从磁盘加载内存页。
VSZ:进程使用的所有虚拟内存的大小(KB)。
RSS:进程使用的物理内存大小(KB)。
%MEM:占用物理内存百分比。
5. sar
a. 查看页统计信息
> 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 |
各个列的含义:
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. 查看内存使用信息
> 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 |
各个列的含义:
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次数据,比如:
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 |
5. 总结
a. 当系统出现较少的page fault,说明页命中率很高,会获得较好的响应时间。
b. 在没有写入swap和disk的情况下,空闲内存越小,表明页高速缓存利用率越高。
c. 如果系统不断报告swap device繁忙,那么说明系统内存不足。
|