Linux 性能查看命令:


Linux性能监测:CPU篇

CPU的占用主要取决于什么样的资源正在CPU上面运行,比如拷贝一个文件通常占用较少CPU,因为大部分工作是由DMA(DirectMemoryAccess)完成,只是在完成拷贝以后给一个中断让CPU知道拷贝已经完成;科学计算通常占用较多的CPU,大部分计算工作都需要在CPU上完成,内存、硬盘等子系统只做暂时的数据存储工作。要想监测和理解CPU的性能需要知道一些的操作系统的基本知识,比如:中断、进程调度、进程上下文切换、可运行队列等。这里VPSee用个例子来简单介绍一下这些概念和他们的关系,CPU很无辜,是个任劳任怨的打工仔,每时每刻都有工作在做(进程、线程)并且自己有一张工作清单(可运行队列),由老板(进程调度)来决定他该干什么,他需要和老板沟通以便得到老板的想法并及时调整自己的工作(上下文切换),部分工作做完以后还需要及时向老板汇报(中断),所以打工仔(CPU)除了做自己该做的工作以外,还有大量时间和精力花在沟通和汇报上。

CPU也是一种硬件资源,和任何其他硬件设备一样也需要驱动和管理程序才能使用,我们可以把内核的进程调度看作是CPU的管理程序,用来管理和分配CPU资源,合理安排进程抢占CPU,并决定哪个进程该使用CPU、哪个进程该等待。操作系统内核里的进程调度主要用来调度两类资源:进程(或线程)和中断,进程调度给不同的资源分配了不同的优先级,优先级最高的是硬件中断,其次是内核(系统)进程,最后是用户进程。每个CPU都维护着一个可运行队列,用来存放那些可运行的线程。线程要么在睡眠状态(blocked正在等待IO)要么在可运行状态,如果CPU当前负载太高而新的请求不断,就会出现进程调度暂时应付不过来的情况,这个时候就不得不把线程暂时放到可运行队列里。VPSee在这里要讨论的是性能监测,上面谈了一堆都没提到性能,那么这些概念和性能监测有什么关系呢?关系重大。如果你是老板,你如何检查打工仔的效率(性能)呢?我们一般会通过以下这些信息来判断打工仔是否偷懒:

·打工仔接受和完成多少任务并向老板汇报了(中断);

·打工仔和老板沟通、协商每项工作的工作进度(上下文切换);

·打工仔的工作列表是不是都有排满(可运行队列);

·打工仔工作效率如何,是不是在偷懒(CPU利用率)。

现在把打工仔换成CPU,我们可以通过查看这些重要参数:中断、上下文切换、可运行队列、CPU利用率来监测CPU的性能。

底线

Linux性能监测:介绍提到了性能监测前需要知道底线,那么监测CPU性能的底线是什么呢?通常我们期望我们的系统能到达以下目标:

·CPU利用率,如果CPU有100%利用率,那么应该到达这样一个平衡:65%-70%UserTime,30%-35%SystemTime,0%-5%IdleTime;

·上下文切换,上下文切换应该和CPU利用率联系起来看,如果能保持上面的CPU利用率平衡,大量的上下文切换是可以接受的;

·可运行队列,每个可运行队列不应该有超过1-3个线程(每处理器),比如:双处理器系统的可运行队列里不应该超过6个线程。



cpu监控分为两种:cpu使用率和IPC/CPI,两者的应用场景也不相同,

通常使用的是cpu使用率监控,基本上操作系统都会提供,

IPC/CPI监控则需要性能专家的协助,操作系统上基本没有相关的指令


cpu的使用率需要关注用户态cpu使用率和系统态cpu使用率,前者表示系统上运行业务获得cpu的执行时间占总cpu时间的百分比,后者表示系统获得cpu时间的百分比。对用户而言,用户态cpu百分比为100%是最理想的状况,但这通常不可能,当出现程序调度、线程上下文切换以及IO交互的时候,系统态cpu使用率会较多的增长。应当明确的是,应用消耗很多CPU并不意味着性能或者扩展性达到了最高或瓶颈。如果长时间出现系统态cpu使用率居高不下,那么就需要关注,有可能是程序写的不优雅,有可能是磁盘即将损坏导致IO消耗时间过长,这时候就需要cpu监控从而分析得出结果

对计算密集型应用来首,只监控cpu使用率是不够的,还需要监控IPC(每时钟指令数)或CPI(每指令时钟周期)。为什么需要知道这一项数据?IPC或CPI都可以反映了没有指令被执行的时候占用cpu时钟周期的百分比,简而言之就是CPU等待指令从内存中装入寄存器消耗时间的百分比,即停滞(stall)。停滞——当cpu执行指令而所用到的操作数不在寄存器或缓存中并且当前钟周期还未失效时,cpu就需要停滞等待数据从内存中装入寄存器,停滞一旦发生,通常会浪费几百个cpu时钟周期。要想提高计算密集型应用的性能,就需要获得IPC/CPI监控数据,减少停滞减少cpu等待内存数据时间或改善高速缓存。



Linux性能监测:内存篇

这里的讲到的“内存”包括物理内存虚拟内存,虚拟内存(VirtualMemory)把计算机的内存空间扩展到硬盘,物理内存(RAM)和硬盘的一部分空间(SWAP)组合在一起作为虚拟内存为计算机提供了一个连贯的虚拟内存空间,好处是我们拥有的内存”变多了“,可以运行更多、更大的程序,坏处是把部分硬盘当内存用整体性能受到影响,硬盘读写速度要比内存慢几个数量级,并且RAM和SWAP之间的交换增加了系统的负担。
在操作系统里,虚拟内存被分成页,在x86系统上每个页大小是4KB。Linux内核读写虚拟内存是以“页”为单位操作的,把内存转移到硬盘交换空间(SWAP)和从交换空间读取到内存的时候都是按页来读写的。内存和SWAP的这种交换过程称为页面交换(Paging),值得注意的是paging和swapping是两个完全不同的概念,国内很多参考书把这两个概念混为一谈,swapping也翻译成交换,在操作系统里是指把某程序完全交换到硬盘以腾出内存给新程序使用,和paging只交换程序的部分(页面)是两个不同的概念。纯粹的swapping在现代操作系统中已经很难看到了,因为把整个程序交换到硬盘的办法既耗时又费力而且没必要,现代操作系统基本都是paging或者paging/swapping混合,swapping最初是在UnixsystemV上实现的。
虚拟内存管理是Linux内核里面最复杂的部分,要弄懂这部分内容可能需要一整本书的讲解。VPSee在这里只介绍和性能监测有关的两个内核进程:kswapd和pdflush。
•kswapddaemon用来检查pages_high和pages_low,如果可用内存少于pages_low,kswapd就开始扫描并试图释放32个页面,并且重复扫描释放的过程直到可用内存大于pages_high为止。扫描的时候检查3件事:1)如果页面没有修改,把页放到可用内存列表里;2)如果页面被文件系统修改,把页面内容写到磁盘上;3)如果页面被修改了,但不是被文件系统修改的,把页面写到交换空间。
•pdflushdaemon用来同步文件相关的内存页面,把内存页面及时同步到硬盘上。比如打开一个文件,文件被导入到内存里,对文件做了修改后并保存后,内核并不马上保存文件到硬盘,由pdflush决定什么时候把相应页面写入硬盘,这由一个内核参数vm.dirty_background_ratio来控制,比如下面的参数显示脏页面(dirtypages)达到所有内存页面10%的时候开始写入硬盘。

Linux性能监测:磁盘IO篇

磁盘通常是计算机最慢的子系统,也是最容易出现性能瓶颈的地方,因为磁盘离CPU距离最远而且CPU访问磁盘要涉及到机械操作,比如转轴、寻轨等。访问硬盘和访问内存之间的速度差别是以数量级来计算的,就像1天和1分钟的差别一样。要监测IO性能,有必要了解一下基本原理和Linux是如何处理硬盘和内存之间的IO的。内存页上一篇Linux性能监测:Memory提到了内存和硬盘之间的IO是以页为单位来进行的,在Linux系统上1页的大小为4K。可以用以下命令查看系统默认的页面大小:

?

1

2

3

4

$ /usr/bin/time -vdate

...

Page size (bytes): 4096

...

缺页中断 Linux利用虚拟内存极大的扩展了程序地址空间,使得原来物理内存不能容下的程序也可以通过内存和硬盘之间的不断交换(把暂时不用的内存页交换到硬盘,把需要的内存页从硬盘读到内存)来赢得更多的内存,看起来就像物理内存被扩大了一样。事实上这个过程对程序是完全透明的,程序完全不用理会自己哪一部分、什么时候被交换进内存,一切都有内核的虚拟内存管理来完成。当程序启动的时候,Linux内核首先检查CPU的缓存和物理内存,如果数据已经在内存里就忽略,如果数据不在内存里就引起一个缺页中断(PageFault),然后从硬盘读取缺页,并把缺页缓存到物理内存里。缺页中断可分为主缺页中断(MajorPageFault)和次缺页中断(MinorPageFault),要从磁盘读取数据而产生的中断是主缺页中断;数据已经被读入内存并被缓存起来,从内存缓存区中而不是直接从硬盘中读取数据而产生的中断是次缺页中断。 上面的内存缓存区起到了预读硬盘的作用,内核先在物理内存里寻找缺页,没有的话产生次缺页中断从内存缓存里找,如果还没有发现的话就从硬盘读取。很显然,把多余的内存拿出来做成内存缓存区提高了访问速度,这里还有一个命中率的问题,运气好的话如果每次缺页都能从内存缓存区读取的话将会极大提高性能。要提高命中率的一个简单方法就是增大内存缓存区面积,缓存区越大预存的页面就越多,命中率也会越高。下面的time命令可以用来查看某程序第一次启动的时候产生了多少主缺页中断和次缺页中断:

$ /usr/bin/time -vdate

...

Major (requiring I/O) page faults: 1

Minor (reclaiming a frame) page faults: 260

...



FileBufferCache

从上面的内存缓存区(也叫文件缓存区FileBufferCache)读取页比从硬盘读取页要快得多,所以Linux内核希望能尽可能产生次缺页中断(从文件缓存区读),并且能尽可能避免主缺页中断(从硬盘读),这样随着次缺页中断的增多,文件缓存区也逐步增大,直到系统只有少量可用物理内存的时候Linux才开始释放一些不用的页。我们运行Linux一段时间后会发现虽然系统上运行的程序不多,但是可用内存总是很少,这样给大家造成了Linux对内存管理很低效的假象,事实上Linux把那些暂时不用的物理内存高效的利用起来做预存(内存缓存区)呢。下面打印的是VPSee的一台Sun服务器上的物理内存和文件缓存区的情况:

?

1

2

3

4

5

$ cat /proc/meminfo

MemTotal: 8182776 kB

MemFree: 3053808 kB

Buffers: 342704 kB

Cached: 3972748 kB

这台服务器总共有8GB物理内存(MemTotal),3GB左右可用内存(MemFree),343MB左右用来做磁盘缓存(Buffers),4GB左右用来做文件缓存区(Cached),可见Linux真的用了很多物理内存做Cache,而且这个缓存区还可以不断增长。

页面类型

Linux中内存页面有三种类型:

·Readpages,只读页(或代码页),那些通过主缺页中断从硬盘读取的页面,包括不能修改的静态文件、可执行文件、库文件等。当内核需要它们的时候把它们读到内存中,当内存不足的时候,内核就释放它们到空闲列表,当程序再次需要它们的时候需要通过缺页中断再次读到内存。

·Dirtypages,脏页,指那些在内存中被修改过的数据页,比如文本文件等。这些文件由pdflush负责同步到硬盘,内存不足的时候由kswapd和pdflush把数据写回硬盘并释放内存。

·Anonymouspages,匿名页,那些属于某个进程但是又和任何文件无关联,不能被同步到硬盘上,内存不足的时候由kswapd负责将它们写到交换分区并释放内存。



IO’sPerSecond(IOPS)

每次磁盘IO请求都需要一定的时间,和访问内存比起来这个等待时间简直难以忍受。在一台2001年的典型1GHzPC上,磁盘随机访问一个word需要8,000,000nanosec=8millisec,顺序访问一个word需要200nanosec;而从内存访问一个word只需要10nanosec.(数据来自:TeachYourselfProgramminginTenYears)这个硬盘可以提供125次IOPS(1000ms/8ms)。

顺序IO和随机IO

IO可分为顺序IO和随机IO两种,性能监测前需要弄清楚系统偏向顺序IO的应用还是随机IO应用。顺序IO是指同时顺序请求大量数据,比如数据库执行大量的查询、流媒体服务等,顺序IO可以同时很快的移动大量数据。可以这样来评估IOPS的性能,用每秒读写IO字节数除以每秒读写IOPS数,rkB/s除以r/s,wkB/s除以w/s.下面显示的是连续2秒的IO情况,可见每次IO写的数据是增加的(45060.00/99.00=455.15KBperIO,54272.00/112.00=484.57KBperIO)。相对随机IO而言,顺序IO更应该重视每次IO的吞吐能力(KBperIO):

?

1

2

3

4

5

6

7

8

9

10

11

12

$ iostat -kx 1

avg-cpu: %user %nice %system %iowait %steal %idle

0.00 0.00 2.50 25.25 0.00 72.25

Device: rrqm/s wrqm/s r/sw/srkB/swkB/savgrq-sz avgqu-sz await svctm %util

sdb 24.00 19995.00 29.00 99.00 4228.00 45060.00 770.12 45.01 539.65 7.80 99.80

avg-cpu: %user %nice %system %iowait %steal %idle

0.00 0.00 1.00 30.67 0.00 68.33

Device: rrqm/s wrqm/s r/sw/srkB/swkB/savgrq-sz avgqu-sz await svctm %util

sdb 3.00 12235.00 3.00 112.00 768.00 54272.00 957.22 144.85 576.44 8.70 100.10

随机IO是指随机请求数据,其IO速度不依赖于数据的大小和排列,依赖于磁盘的每秒能IO的次数,比如Web服务、Mail服务等每次请求的数据都很小,随机IO每秒同时会有更多的请求数产生,所以磁盘的每秒能IO多少次是关键。

?

1

2

3

4

5

6

7

8

9

10

11

12

$ iostat -kx 1

avg-cpu: %user %nice %system %iowait %steal %idle

1.75 0.00 0.75 0.25 0.00 97.26

Device: rrqm/s wrqm/s r/sw/srkB/swkB/savgrq-sz avgqu-sz await svctm %util

sdb 0.00 52.00 0.00 57.00 0.00 436.00 15.30 0.03 0.54 0.23 1.30

avg-cpu: %user %nice %system %iowait %steal %idle

1.75 0.00 0.75 0.25 0.00 97.24

Device: rrqm/s wrqm/s r/sw/srkB/swkB/savgrq-sz avgqu-sz await svctm %util

sdb 0.00 56.44 0.00 66.34 0.00 491.09 14.81 0.04 0.54 0.19 1.29

按照上面的公式得出:436.00/57.00=7.65KBperIO,491.09/66.34=7.40KBperIO.与顺序IO比较发现,随机IO的KBperIO小到可以忽略不计,可见对于随机IO而言重要的是每秒能IOPS的次数,而不是每次IO的吞吐能力(KBperIO)。

SWAP

当系统没有足够物理内存来应付所有请求的时候就会用到swap设备,swap设备可以是一个文件,也可以是一个磁盘分区。不过要小心的是,使用swap的代价非常大。如果系统没有物理内存可用,就会频繁swapping,如果swap设备和程序正要访问的数据在同一个文件系统上,那会碰到严重的IO问题,最终导致整个系统迟缓,甚至崩溃。swap设备和内存之间的swapping状况是判断Linux系统性能的重要参考,我们已经有很多工具可以用来监测swap和swapping情况,比如:top、cat/proc/meminfo、vmstat等:

?

1

2

3

4

5

6

7

8

9

10

$ cat /proc/meminfo

MemTotal: 8182776 kB

MemFree: 2125476 kB

Buffers: 347952 kB

Cached: 4892024 kB

SwapCached: 112 kB

...

SwapTotal: 4096564 kB

SwapFree: 4096424 kB

...



Linux性能监测:网络篇

网络的监测是所有Linux子系统里面最复杂的,有太多的因素在里面,比如:延迟、阻塞、冲突、丢包等,更糟的是与Linux主机相连的路由器、交换机、无线信号都会影响到整体网络并且很难判断是因为Linux网络子系统的问题还是别的设备的问题,增加了监测和判断的复杂度。现在我们使用的所有网卡都称为自适应网卡,意思是说能根据网络上的不同网络设备导致的不同网络速度和工作模式进行自动调整。我们可以通过ethtool工具来查看网卡的配置和工作模式:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

# /sbin/ethtool eth0

Settings for eth0:

Supported ports: [ TP ]

Supported link modes: 10baseT/Half10baseT/Full

100baseT/Half100baseT/Full

1000baseT/Half1000baseT/Full

Supports auto-negotiation: Yes

Advertised link modes: 10baseT/Half10baseT/Full

100baseT/Half100baseT/Full

1000baseT/Half1000baseT/Full

Advertised auto-negotiation: Yes

Speed: 100Mb/s

Duplex: Full

Port: Twisted Pair

PHYAD: 1

Transceiver: internal

Auto-negotiation: on

Supports Wake-on: g

Wake-on: g

Current message level: 0x000000ff (255)

Link detected: yes

上面给出的例子说明网卡有10baseT,100baseT和1000baseT三种选择,目前正自适应为100baseT(Speed:100Mb/s)。可以通过ethtool工具强制网卡工作在1000baseT下:

/sbin/ethtool -s eth0 speed 1000 duplex full autoneg off






Linux性能监测:常用命令



1 :uptime 查看当前系统的负载状况

09:50:21 up 200 days, 15:07, 1 user, load average: 0.27, 0.33, 0.3

2:dmesg |tail 查看开机打印信息和环形缓冲区的内容。

3 :vmstat 监控系统(内存,cpu,磁盘,io,网卡)状态

vmstat 1 表示每秒钟采集一次。

vmstat 1 10 表示每秒钟采集一次,共十次。


procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----

r b swpd free buff cache si so bi bo in cs us sy id wa st

1 0 0 3932924 230676 1280388 0 0 0 5 4 16 5 6 89 0 0

0 0 0 3932916 230676 1280388 0 0 0 0 1147 1314 7 9 84 0 0

0 0 0 3932908 230676 1280388 0 0 0 16 439 1245 0 0 99 0 0

0 0 0 3932908 230676 1280388 0 0 0 0 699 1381 1 0 99 0 0

1 0 0 3932908 230676 1280388 0 0 0 0 1106 1328 6 8 86 0 0

0 0 0 3932908 230676 1280388 0 0 0 0 660 1332 2 2 96 0 0

1 0 0 3932908 230676 1280388 0 0 0 20 1122 1250 7 8 85 0 0

2 0 0 3932916 230676 1280388 0 0 0 4 2001 1463 14 19 67 0 0

0 0 0 3932792 230676 1280388 0 0 0 0 1111 1375 5 4 90 0 0

0 0 0 3932792 230676 1280388 0 0 0 0 589 1295 1 0 99 0 0


procs(进程):

r 表示等待可用cpu 资源的进程数量(如果长时间该值超过处理器硬件线程个数一倍,需要关注了。)。

硬件线程个数 :dmesg |grep CPU可以查看。

b 表示阻塞的进程个数(阻塞是说需要其他资源,比如io)


swap(交换分区):两个值都大就表示系统内存资源紧张。

si: 每秒钟从磁盘写入swap的大小,

so: 每秒从内存写入swap的大小

memory

swpd:

swap已使用的大小,如果大于0,表示你的机器物理内存不足了,如果不是程序内存泄露的原因,那么你该升级内存了或者把耗内存的任务迁移到其他机器,如果swpd不为0,但是si,so的值长期为0,不影响系统性能

free :空闲的物理内存多大小。

buff:用来存储,目录里面有什么内容,权限等的缓存

cache:直接用来记忆我们打开的文件,给文件做缓冲


io:

bi:从磁盘或者swap读取到ram,每秒读取的块数。

bo: 从ram写入到磁盘或者swap,每秒写入的块数。

注意:随机磁盘读写的时候,这2个值越大(如超出1024k),能看到CPU在IO等待的值也会越大


系统:

in:每秒中断数,包括时钟中断。

cs:每秒上下文切换数。

例如我们调用系统函数,就要进行上下文切换,线程的切换,也要进程上下文切换,这个值要越小越好,太大了,要考虑调低线程或者进程的数目,例如在apache和nginx这种web服务器中,我们一般做性能测试时会进行几千并发甚至几万并发的测试,选择web服务器的进程可以由进程或者线程的峰值一直下调,压测,直到cs到一个比较小的值,这个进程和线程数就是比较合适的值了。系统调用也是,每次调用系统函数,我们的代码就会进入内核空间,导致上下文切换,这个是很耗资源,也要尽量避免频繁调用系统函数。上下文切换次数过多表示你的CPU大部分浪费在上下文切换,导致CPU干正经事的时间少了,CPU没有充分利用,是不可取的。

cpu:

us:用户CPU时间,但是如果长期超50%的使用,那么我们就该考虑优化程序算法或者进行加速。

sy:系统CPU时间,说明系统内核消耗的CPU资源多,这并不是良性表现,我们应该检查原因。

id:空闲 CPU时间,一般来说,id + us + sy = 100,一般我认为id是空闲CPU使用率,us是用户CPU使用率,sy是系统CPU使用率。

wa ,st:等待IO CPU时间,:wa的值高时,说明IO等待比较严重,这可能由于磁盘大量作随机访问造成,也有可能磁盘出现瓶颈(块操作)



案例分析1:

1.interrupts(in)非常高,contextswitch(cs)比较低,说明这个CPU一直在不停的请求资源;

2.usertime(us)一直保持在80%以上,而且上下文切换较低(cs),说明某个进程可能一直霸占着CPU;

3.runqueue(r)刚好在4个。

案例分析2 :

1.contextswitch(cs)比interrupts(in)要高得多,说明内核不得不来回切换进程;


2.进一步观察发现systemtime(sy)很高而usertime(us)很低,而且加上高频度的上下文切换(cs),说明正在运行的应用程序调用了大量的系统调用(systemcall);

3.runqueue(r)在14个线程以上,按照这个测试机器的硬件配置(四核),应该保持在12个以内。

案例分析3:

. 物理可用内存free基本没什么显著变化,swapd逐步增加,说明最小可用的内存始终保持在256MBX10%=2.56MB左右,当脏页达到10%的时候(vm.dirty_background_ratio=10)就开始大量使用swap;

·buff稳步减少说明系统知道内存不够了,kwapd正在从buff那里借用部分内存;

·kswapd持续把脏页面写到swap交换区(so),并且从swapd逐渐增加看出确实如此。根据上面讲的kswapd扫描时检查的三件事,如果页面被修改了,但不是被文件系统修改的,把页面写到swap,所以这里swapd持续增加。



4:mpstat (multiprocessor status)实时系统监控工具 (主要是cpu)

mpstat [-P {|ALL}] [internal [count]]

参数 解释

-P {|ALL} 表示监控哪个CPU, cpu在[0,cpu个数-1]中取值

internal 相邻的两次采样的间隔时间、

count 采样的次数,count只能和delay一起使用

当没有参数时,mpstat则显示系统启动以后所有信息的平均值。有interval时,第一行的信息自系统启动以来的平均信息。从第二行开始,输出为前一个interval时间段的平均信息。

mpstat -P ALL 2 3 2秒一次,共三次,监控所有cpu的时间。

mpstat 系统启动到现在的cpu 效率平均值。

11时16分50秒 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle

11时16分51秒 all 11.56 0.00 17.34 0.00 0.00 0.00 0.00 0.00 71.11

11时16分51秒 0 1.98 0.00 0.99 0.00 0.00 0.00 0.00 0.00 97.03

11时16分51秒 1 15.15 0.00 22.22 0.00 0.00 0.00 0.00 0.00 62.63

11时16分51秒 2 12.00 0.00 18.00 0.00 0.00 0.00 0.00 0.00 70.00

11时16分51秒 3 18.00 0.00 29.00 0.00 0.00 0.00 0.00 0.00 53.00

CPU CPU 编号,all 那行是所有CPU的平均统计值。

%user 在监控的时间间隔内,用户级进程(运用程序)占用的CPU时间百分比。

%nice 在监控的时间间隔内,nice值为负的用户级进程所占用的CPU时间百分比。

%sys 在监控的时间间隔内,系统及进程(内核)占用的CPU使用率。该时间包括了系统处理软、硬中断所花的时间。

%iowait 在监控的时间间隔内,等待硬盘I/O的时间,CPU的闲置时间百分比。

%irq 在监控的时间间隔内,CPU服务硬中断的所占的时间百分比。

%soft 在监控的时间间隔内,CPU服务软中断的所占的时间百分比。

%idle 在监控的时间间隔内,CPU闲置时间所占用的时间百分比,不包括等待磁盘IO请求的时间。

其中最重要的字段是%idle,%iowait。如果%idle 说明CPU的负载不高。如果%iowait,说明存在I/O竞争。也可以使用输出重定向保存mpstat对CPU的监控数据,用作CPU历史使用率分析。


5 pidstat: 监控全部或者指定进程占用系统资源(cpu,内存,io,任务切换,线程等)的情况

pidstat -u 查看活动进程的数量。

15时12分54秒 PID %usr %system %guest %CPU CPU Command

15时12分55秒 4906 0.00 0.98 0.00 0.98 1 pidstat

15时12分55秒 25421 0.00 0.98 0.00 0.98 3 java


11:37:19: pidstat获取信息时间点

PID:进程pid

%usr:进程在用户态运行所占cpu时间比率

%system:进程在内核态运行所占cpu时间比率

%CPU:进程运行所占cpu时间比率

CPU:指示进程在哪个核运行

Command:拉起进程对应的命令


pidstat -r 显示各个进程的内存使用状况


15:08:18 PID minflt/s majflt/s VSZ RSS %MEM Command

15:08:19 13084 133835.00 0.00 15720284 15716896 96.26 mmmm

15:08:20 13084 35807.00 0.00 15863504 15849756 97.07 mmmm

15:08:21 13084 19273.87 0.00 15949040 15792944 96.72 mmmm

minflt/s: 每秒次缺页错误次数(minor page faults),次缺页错误次数意即虚拟内存地址映射成物理内存地址产生的page faut次数

majflt/s: 每秒主缺页错误次数(major page faults),当虚拟内存地址映射成物理内存地址时,相应的page在swap中,这样的page fault为major page fault,一般在内存使用紧张时产生

VSZ: 该进程使用的虚拟内存(以kB为单位)

RSS: 该进程使用的物理内存(以kB为单位)

%MEM: 该进程使用内存的百分比

Command: 拉起进程对应的命令

pidstat -p pid 查看指定进程cpu的内容,

pidstat -p pid -r 查看指定进程的内存信息

pidstat -p pid -d 查看指定进程的io 信息。




6: iostat 对磁盘(CPU、网卡、tty设备、磁盘、CD-ROM等等设备的活动情况, 负载信息)操作活动进行监视


iostat -c 显示cpu信息。

iostat -d 显示磁盘信息。

iostat -d -k 以kb为单位显示。

iostat -d -m 以mb 为单位显示。

iostat -p 显示磁盘和分区的情况。



tps:该设备每秒的传输次数(Indicatethenumberoftransferspersecondthatwereissuedtothedevice.)。“一次传输”意思是“一次I/O请求”。多个逻辑请求可能会被合并为“一次I/O请求”。“一次传输”请求的大小是未知的。

kB_read/s:每秒从设备(driveexpressed)读取的数据量;

kB_wrtn/s:每秒向设备(driveexpressed)写入的数据量;

kB_read:读取的总数据量;kB_wrtn:写入的总数量数据量;


iostat -xz

avg-cpu: %user %nice %system %iowait %steal %idle

5.09 0.00 6.38 0.01 0.00 88.51


Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util

sda 0.05 3.35 0.05 1.74 1.92 40.76 23.85 0.00 1.74 0.56 0.10

dm-0 0.00 0.00 0.10 5.10 1.90 40.76 8.22 0.06 11.14 0.19 0.10

dm-1 0.00 0.00 0.00 0.00 0.00 0.00 8.00 0.00 1.23 1.13 0.00

dm-2 0.00 0.00 0.00 0.00 0.00 0.00 7.98 0.00 0.64 0.47 0.00


rrqm/s:每秒进行merge的读操作数目。即rmerge/s

wrqm/s:每秒进行merge的写操作数目。即wmerge/s

r/s:每秒完成的读I/O设备次数。即rio/s

w/s:每秒完成的写I/O设备次数。即wio/s

rsec/s:每秒读扇区数。即rsect/s

wsec/s:每秒写扇区数。即wsect/s

rkB/s:每秒读K字节数。是rsect/s的一半,因为每扇区大小为512字节。

wkB/s:每秒写K字节数。是wsect/s的一半。

avgrq-sz:平均每次设备I/O操作的数据大小(扇区)。

avgqu-sz:平均I/O队列长度。

await:平均每次设备I/O操作的等待时间(毫秒)。

svctm:平均每次设备I/O操作的服务时间(毫秒)。

%util:一秒中有百分之多少的时间用于I/O操作,即被io消耗的cpu百分比


7 free 查看内存 缓存 缓冲区使用情况。


1 2 3 4 5 6

1 total used free shared buffers cached

2 Mem: 24677460 23276064 1401396 0 870540 12084008

3 -/+ buffers/cache: 10321516 14355944

4 Swap: 25151484 224188 24927296


A buffer is something that has yet to be "written" to disk.

A cache is something that has been "read" from the disk and stored for later use.

FO[2][1] = FO[2][2] + FO[2][3]

对于FO[3][2],即-buffers/cache,表示一个应用程序认为系统被用掉多少内存;

对于FO[3][3],即+buffers/cache,表示一个应用程序认为系统还有多少内存

FO[3][2] = FO[2][2] - FO[2][5] - FO[2][6]

FO[3][3] = FO[2][3] + FO[2][5] + FO[2][6]




8: sar : 监控cpu,内存,磁盘等:


sar -u 列出今天0点开始后的每十分钟一次的cpu统计信息列表。

sar -v 列出今天0点开始后的每十分钟一次的进程、I节点、文件和锁表状态

sar -d列出今天0点开始后的每十分钟一次的 硬盘使用报告

sar -b 列出今天0点开始后的每十分钟一次的 缓冲区使用报告


sar -u 1 2 每个1秒 一共2次检测 cpu 使用情况。




9 :top : 报告系统整体性能。


top - 17:06:25 up 7 days, 6:32, 2 users, load average: 0.41, 0.73, 0.63

Tasks: 172 total, 1 running, 171 sleeping, 0 stopped, 0 zombie

Cpu(s): 0.7%us, 0.7%sy, 0.0%ni, 98.5%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st

Mem: 10129796k total, 6853732k used, 3276064k free, 231164k buffers

Swap: 8208380k total, 0k used, 8208380k free, 1300188k cached


PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND

25421 root 20 0 4317m 988m 15m S 4.0 10.0 172:04.16 java

11979 root 20 0 4165m 862m 15m S 0.7 8.7 614:37.05 java

18690 root 20 0 4232m 699m 15m S 0.7 7.1 136:54.40 java

30231 root 20 0 4149m 867m 15m S 0.7 8.8 643:34.15 java

1325 root 20 0 185m 4476 3612 S 0.3 0.0 12:17.31 vmtoolsd

31763 root 20 0 4252m 691m 15m S 0.3 7.0 150:01.65 java



解释信息:


第一行显示的内容和uptime命令一样,

第三行:


Cpu(s):表示这一行显示CPU总体信息

0.0%us:用户态进程占用CPU时间百分比,不包含renice值为负的任务占用的CPU的时间。

0.7%sy:内核占用CPU时间百分比

0.0%ni:renice值为负的任务的用户态进程的CPU时间百分比。nice是优先级的意思

99.3%id:空闲CPU时间百分比

0.0%wa:等待I/O的CPU时间百分比

0.0%hi:CPU硬中断时间百分比

0.0%si:CPU软中断时间百分比

0.0%st:我不知道

第五行:


PID:进程的ID

USER:进程所有者

PR:进程的优先级别,越小越优先被执行

NInice:值

VIRT:进程占用的虚拟内存

RES:进程占用的物理内存

SHR:进程使用的共享内存

S:进程的状态。S表示休眠,R表示正在运行,Z表示僵死状态,N表示该进程优先值为负数

%CPU:进程占用CPU的使用率

%MEM:进程使用的物理内存和总内存的百分比

TIME+:该进程启动后占用的总的CPU时间,即占用CPU使用时间的累加值。

COMMAND:进程启动命令名称


常用交互命令

从使用角度来看,熟练的掌握这些命令比掌握选项还重要一些。这些命令都是单字母的,如果在命令行选项中使用了s选项,则可能其中一些命令会被屏蔽掉。

  Ctrl+L 擦除并且重写屏幕。

  h或者? 显示帮助画面,给出一些简短的命令总结说明。

  k 终止一个进程。系统将提示用户输入需要终止的进程PID,以及需要发送给该进程什么样的信号。一般的终止进程可以使用15信号;如果不能正常结束那就使用信号9强制结束该进程。默认值是信号15。在安全模式中此命令被屏蔽。

  i 忽略闲置和僵死进程。这是一个开关式命令。

  q 退出程序。

  r 重新安排一个进程的优先级别。系统提示用户输入需要改变的进程PID以及需要设置的进程优先级值。输入一个正值将使优先级降低,反之则可以使该进程拥有更高的优先权。默认值是10。

  S 切换到累计模式。

  s 改变两次刷新之间的延迟时间。系统将提示用户输入新的时间,单位为s。如果有小数,就换算成m s。输入0值则系统将不断刷新,默认值是5 s。需要注意的是如果设置太小的时间,很可能会引起不断刷新,从而根本来不及看清显示的情况,而且系统负载也会大大增加。

  f或者F 从当前显示中添加或者删除项目。

  o或者O 改变显示项目的顺序。

  l 切换显示平均负载和启动时间信息。

  m 切换显示内存信息。

  t 切换显示进程和CPU状态信息。

  c 切换显示命令名称和完整命令行。

  M 根据驻留内存大小进行排序。

  P 根据CPU使用百分比大小进行排序。

  T 根据时间/累计时间进行排序。

W 将当前设置写入~/.toprc文件中。这是写top配置文件的推荐方法。


命令总结:

IO : iostat

cpu : mpstat uptime

process :pidstat

内存:free

统计:vmstat,sar ,top


吞吐量:

磁盘吞吐量 iostat -xz

查看网络接口的吞吐量 sar -n DEV 1 。

查看某个协议点汇总视图 sar -n TCP,UDP 1


Linux性能监测:问题解决思路



cpu 高的原因可能是

1 sql 语句太复杂,查询时候消耗时间太久,多次请求就把cpu 占用完了。

2 高密度计算,计算太久,多次请求占用cpu 完毕了。

3 出现死循环。


如果是程序高cpu消耗的解决办法:

1 top 找到高消耗进程

2 导出进程的所有信息:

jstack -l pid >test.stack

如果进程已经hang住了

jstack -l -F pid >test.stack

3 top -H -p pid 找到进程中消耗最多的线程。

4 printf "%x\n" tid 把线程ID转化为16进制。

5 cat test.stack |grep -n16进制串

6 vi test.stack 定位到 对应行。



内存分为物理内存,虚拟缓存和缓冲区。




内存使用率高的原因可能是:

1 程序中有太长的arraylist,会在内存中存储,内存加载不了了。



内存高的解决办法:

1 top 找到高消耗进程

2 jmap -histo 进程ID >a.txt 把进程的当前状态(有哪些对象,每个对象多少实例,多少字节,什么类名)导出到文件里。

3vi a.txt 查看哪些类 占用了内存。

4 优化代码。


如果已经内存溢出,

jmap -dump:live,format=b,file=xxx.xxx pid 然后用mat 工具分析。















更多相关文章

  1. Linux daemon进程的应用、实现和原理
  2. Zabbix - LINUX下CPU,硬盘,流量,内存监控
  3. linux usb枚举过程分析之守护进程及其唤醒【转】
  4. 进程间通讯概述
  5. 转:——Windows和Linux进程间通信区别
  6. linux内核模块的强制删除-结束rmmod这类disk sleep进程
  7. Linux内存管理 - PAGE_OFFSET理解
  8. linux进程和线程排查 · 记一次JVM CPU高负载的排查办法
  9. Linux内存占用分析 进程内存空间

随机推荐

  1. android矢量图vector的简单介绍
  2. Android实现动态改变屏幕方向(Landscape &
  3. Android Studio系列教程三--快捷键
  4. Android之音量调节
  5. Android应用程序——四大组件之Activity
  6. 前端和Android / IOS 对接问题
  7. Android坐标系、视图坐标系与触控事件(Mot
  8. Android技术栈
  9. [Android] [Java] 分享 Process 执行命令
  10. Android 连接tomcat模拟登陆账号