博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux性能监控(1)
阅读量:4029 次
发布时间:2019-05-24

本文共 6055 字,大约阅读时间需要 20 分钟。

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时间。

  1. >cat/proc/loadavg
  2. 0.020.050.051/27923903

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

3. vmstat

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

  1. >vmstat11
  2. procs-----------memory----------------------swap-------io-----system------cpu----
  3. rbswpdfreebuffcachesisobiboincsussyidwa
  4. 00015403044979721631008000450020971

与CPU相关的各个列的意思:

r:当前运行队列中的进程的数目,就是那些处于可执行状态,但是得不到CPU的进程。
b:当前处于阻塞状态,并等待IO请求完成的进程的数目。
in:当前处理的中断数目。
cs:当前系统发生的上下文切换次数。
us:CPU在用户空间执行的时间的百分比。
sy:CPU在内核空间执行的时间的百分比。
id:CPU空闲时间的百分比。
wa:由于所有可运行进程等待IO请求完成被阻塞导致的CPU空闲时间的百分比。

4. pidstat

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

  1. >pidstat-p2036-t11
  2. Linux2.6.32-5-xen-amd64(vzw51173.puppetclient.163.com)2012年10月12日_x86_64_(4CPU)
  3. 16时09分17秒TGIDTID%usr%system%guest%CPUCPUCommand
  4. 16时09分18秒2036-0.002.000.002.003python
  5. 16时09分18秒-20360.000.000.000.003|__python
  6. 16时09分18秒-20410.000.000.000.003|__python
  7. 16时09分18秒-56390.000.000.000.002|__python
  8. 16时09分18秒-56500.001.000.001.001|__python
  9. 平均时间:TGIDTID%usr%system%guest%CPUCPUCommand
  10. 平均时间:2036-0.002.000.002.00-python
  11. 平均时间:-20360.000.000.000.00-|__python
  12. 平均时间:-20410.000.000.000.00-|__python
  13. 平均时间:-56390.000.000.000.00-|__python
  14. 平均时间:-56500.001.000.001.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在脏页比例大于某个阈值,或者修改超过一定时间之后进行写回。

  1. >psaxu|grepflush
  2. root9270.00.000?SMay232:34[flush-202:2]
  3. root144130.00.010200856pts/2S+16:530:00grepflush

3. vmstat

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

  1. >vmstat1
  2. procs-----------memory-----------------swap----------io-----system------cpu----
  3. rbswpdfreebuffcachesisobiboincsussyidwa
  4. 00600438264995523741240000400001000
  5. 006004373649955237412440000156590600990

内存相关列的意思:

swpd:当前使用的虚拟内存的总额(KB),当空闲内存达到更低的阈值时,更多的页会被交换到磁盘。
free:当前内存中的空闲空间的大小(KB)。
buff:当前内存中用于read和write操作的缓冲区的大小(KB)。
cache:页高速缓存大小(KB)。
si:从swap写回内存的大小(KB)。
so:写入swap的大小(KB)。
bi:从文件系统或交换设备读的磁盘块的大小(KB)。读磁盘。
bo:从内存写入文件系统或交换设备的大小(KB)。写磁盘。

4. pidstat

查看进程的缺页情况。

  1. >pidstat-r-p3167911
  2. Linux2.6.32-5-xen-amd64(debian-org)2012年10月12日_x86_64_(4CPU)
  3.  
  4. 17时10分02秒PIDminflt/smajflt/sVSZRSS%MEMCommand
  5. 17时10分03秒316791292.000.008713481078522.58node
  6. 平均时间:316791292.000.008713481078522.58node

各个列含义:

minflt/s:进程平均每s造成的minor fault,这些错误不会导致从磁盘加载内存页。
majflt/s:进程平均每s造成的major fault,这些错误会导致从磁盘加载内存页。
VSZ:进程使用的所有虚拟内存的大小(KB)。
RSS:进程使用的物理内存大小(KB)。
%MEM:占用物理内存百分比。

5. sar

a. 查看页统计信息

  1. >sar-B
  2. Linux2.6.32-5-xen-amd64(debian-org)2012年11月17日_x86_64_(4CPU)
  3.  
  4. 00时00分01秒pgpgin/spgpgout/sfault/smajflt/spgfree/spgscank/spgscand/spgsteal/s%vmeff
  5. 00时05分01秒0.00200.84364.650.00538.940.000.000.000.00
  6. 00时15分01秒0.00184.84353.720.00396.330.000.000.000.00
  7. ……
  8. 09时45分01秒0.001822.521175.530.009406.760.000.000.000.00
  9. 09时55分01秒0.003401.991556.250.0010269.710.000.000.000.00
  10. 平均时间:0.00319.68429.480.001036.330.000.000.000.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.查看内存使用信息

  1. >sar-r
  2. Linux2.6.32-5-xen-amd64(debian-org)2012年11月17日_x86_64_(4CPU)
  3.  
  4. 00时00分01秒kbmemfreekbmemused%memusedkbbufferskbcachedkbcommit%commit
  5. 00时05分01秒1636744255124460.9249811216266001807084.31
  6. 00时15分01秒1634724255326460.9749811216266281813044.33
  7. ……
  8. 09时55分01秒1555940263204862.8549812816247162008764.80
  9. 10时05分01秒1548416263957263.0349812816247602063644.93
  10. 10时15分01秒1545200264278863.1049812816248042129485.08
  11.  
  12. 10时15分01秒kbmemfreekbmemused%memusedkbbufferskbcachedkbcommit%commit
  13. 10时25分01秒1542332264565663.1749812816248522115245.05
  14. 平均时间:1624618256337061.2149811816262981835284.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次数据,比如:

  1. sar-B15
  2. Linux2.6.32-5-xen-amd64(debian-org)2012年11月17日_x86_64_(4CPU)
  3.  
  4. 18时53分20秒pgpgin/spgpgout/sfault/smajflt/spgfree/spgscank/spgscand/spgsteal/s%vmeff
  5. 18时53分21秒0.000.0040.000.00355.000.000.000.000.00
  6. 18时53分22秒0.000.0042.000.00362.000.000.000.000.00
  7. 18时53分23秒0.000.0032.000.00355.000.000.000.000.00
  8. 18时53分24秒0.006584.00104.000.00414.000.000.000.000.00
  9. 18时53分25秒0.0028.0066.000.00427.000.000.000.000.00
  10. 平均时间:0.001322.4056.800.00382.600.000.000.000.00

5. 总结

a. 当系统出现较少的page fault,说明页命中率很高,会获得较好的响应时间。

b. 在没有写入swap和disk的情况下,空闲内存越小,表明页高速缓存利用率越高。
c. 如果系统不断报告swap device繁忙,那么说明系统内存不足。

转载地址:http://jqobi.baihongyu.com/

你可能感兴趣的文章
ES写入找不到主节点问题排查
查看>>
Java8 HashMap集合解析
查看>>
ArrayList集合解析
查看>>
欢迎使用CSDN-markdown编辑器
查看>>
Android计算器实现源码分析
查看>>
Android系统构架
查看>>
Android 跨应用程序访问窗口知识点总结
查看>>
各种排序算法的分析及java实现
查看>>
SSH框架总结(框架分析+环境搭建+实例源码下载)
查看>>
js弹窗插件
查看>>
自定义 select 下拉框 多选插件
查看>>
js判断数组内是否有重复值
查看>>
js获取url链接携带的参数值
查看>>
gdb 调试core dump
查看>>
gdb debug tips
查看>>
arm linux 生成火焰图
查看>>
jtag dump内存数据
查看>>
linux和windows内存布局验证
查看>>
linux config
查看>>
linux insmod error -1 required key invalid
查看>>