Linux 性能查看命令:
Linux性能监测:CPU篇
CPU 的占用主要取决于什么样的资源正在 CPU 上面运行,比如拷贝一个文件通常占用较少 CPU,因为大部分工作是由 DMA(Direct Memory Access)完成,只是在完成拷贝以后给一个中断让 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% User Time,30%-35% System Time,0%-5% Idle Time;
· 上下文切换,上下文切换应该和 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性能监测:内存篇
这里的讲到的 “内存” 包括物理内存和虚拟内存,虚拟内存(Virtual Memory)把计算机的内存空间扩展到硬盘,物理内存(RAM)和硬盘的一部分空间(SWAP)组合在一起作为虚拟内存为计算机提供了一个连贯的虚拟内 存空间,好处是我们拥有的内存 ”变多了“,可以运行更多、更大的程序,坏处是把部分硬盘当内存用整体性能受到影响,硬盘读写速度要比内存慢几个数量级,并且 RAM 和 SWAP 之间的交换增加了系统的负担。
在操作系统里,虚拟内存被分成页,在 x86 系统上每个页大小是 4KB。Linux 内核读写虚拟内存是以 “页” 为单位操作的,把内存转移到硬盘交换空间(SWAP)和从交换空间读取到内存的时候都是按页来读写的。内存和 SWAP 的这种交换过程称为页面交换(Paging),值得注意的是 paging 和 swapping 是两个完全不同的概念,国内很多参考书把这两个概念混为一谈,swapping 也翻译成交换,在操作系统里是指把某程序完全交换到硬盘以腾出内存给新程序使用,和 paging 只交换程序的部分(页面)是两个不同的概念。纯粹的 swapping 在现代操作系统中已经很难看到了,因为把整个程序交换到硬盘的办法既耗时又费力而且没必要,现代操作系统基本都是 paging 或者 paging/swapping 混合,swapping 最初是在 Unix system V 上实现的。
虚拟内存管理是 Linux 内核里面最复杂的部分,要弄懂这部分内容可能需要一整本书的讲解。VPSee 在这里只介绍和性能监测有关的两个内核进程:kswapd 和 pdflush。
• kswapd daemon 用来检查 pages_high 和 pages_low,如果可用内存少于 pages_low,kswapd 就开始扫描并试图释放 32个页面,并且重复扫描释放的过程直到可用内存大于 pages_high 为止。扫描的时候检查3件事:1)如果页面没有修改,把页放到可用内存列表里;2)如果页面被文件系统修改,把页面内容写到磁盘上;3)如果页面被修改 了,但不是被文件系统修改的,把页面写到交换空间。
• pdflush daemon 用来同步文件相关的内存页面,把内存页面及时同步到硬盘上。比如打开一个文件,文件被导入到内存里,对文件做了修改后并保存后,内核并不马上保存文件到硬 盘,由 pdflush 决定什么时候把相应页面写入硬盘,这由一个内核参数 vm.dirty_background_ratio 来控制,比如下面的参数显示脏页面(dirty pages)达到所有内存页面10%的时候开始写入硬盘。
Linux性能监测:磁盘IO篇
磁盘通常是计算机最慢的子系统,也是最容易出现性能瓶颈的地方,因为磁盘离 CPU 距离最远而且 CPU 访问磁盘要涉及到机械操作,比如转轴、寻轨等。访问硬盘和访问内存之间的速度差别是以数量级来计算的,就像1天和1分钟的差别一样。要监测 IO 性能,有必要了解一下基本原理和 Linux 是如何处理硬盘和内存之间的 IO 的。 内存页 上一篇 Linux 性能监测:Memory 提到了内存和硬盘之间的 IO 是以页为单位来进行的,在 Linux 系统上1页的大小为 4K。可以用以下命令查看系统默认的页面大小:
?
1 2 3 4 |
$ /usr/bin/time -v date ... Page size (bytes): 4096 ... |
缺页中断 Linux 利用虚拟内存极大的扩展了程序地址空间,使得原来物理内存不能容下的程序也可以通过内存和硬盘之间的不断交换(把暂时不用的内存页交换到硬盘,把需要的内 存页从硬盘读到内存)来赢得更多的内存,看起来就像物理内存被扩大了一样。事实上这个过程对程序是完全透明的,程序完全不用理会自己哪一部分、什么时候被 交换进内存,一切都有内核的虚拟内存管理来完成。当程序启动的时候,Linux 内核首先检查 CPU 的缓存和物理内存,如果数据已经在内存里就忽略,如果数据不在内存里就引起一个缺页中断(Page Fault),然后从硬盘读取缺页,并把缺页缓存到物理内存里。缺页中断可分为主缺页中断(Major Page Fault)和次缺页中断(Minor Page Fault),要从磁盘读取数据而产生的中断是主缺页中断;数据已经被读入内存并被缓存起来,从内存缓存区中而不是直接从硬盘中读取数据而产生的中断是次 缺页中断。 上面的内存缓存区起到了预读硬盘的作用,内核先在物理内存里寻找缺页,没有的话产生次缺页中断从内存缓存里找,如果还没有发现的话就从硬盘读取。很 显然,把多余的内存拿出来做成内存缓存区提高了访问速度,这里还有一个命中率的问题,运气好的话如果每次缺页都能从内存缓存区读取的话将会极大提高性能。 要提高命中率的一个简单方法就是增大内存缓存区面积,缓存区越大预存的页面就越多,命中率也会越高。下面的 time 命令可以用来查看某程序第一次启动的时候产生了多少主缺页中断和次缺页中断:
$ /usr/bin/time -v date
...
Major (requiring I/O) page faults: 1
Minor (reclaiming a frame) page faults: 260
...
File Buffer Cache
从上面的内存缓存区(也叫文件缓存区 File Buffer Cache)读取页比从硬盘读取页要快得多,所以 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 中内存页面有三种类型:
· Read pages,只读页(或代码页),那些通过主缺页中断从硬盘读取的页面,包括不能修改的静态文件、可执行文件、库文件等。当内核需要它们的时候把它们读到 内存中,当内存不足的时候,内核就释放它们到空闲列表,当程序再次需要它们的时候需要通过缺页中断再次读到内存。
· Dirty pages,脏页,指那些在内存中被修改过的数据页,比如文本文件等。这些文件由 pdflush 负责同步到硬盘,内存不足的时候由 kswapd 和 pdflush 把数据写回硬盘并释放内存。
· Anonymous pages,匿名页,那些属于某个进程但是又和任何文件无关联,不能被同步到硬盘上,内存不足的时候由 kswapd 负责将它们写到交换分区并释放内存。
IO’s Per Second(IOPS)
每次磁盘 IO 请求都需要一定的时间,和访问内存比起来这个等待时间简直难以忍受。在一台 2001 年的典型 1GHz PC 上,磁盘随机访问一个 word 需要 8,000,000 nanosec = 8 millisec,顺序访问一个 word 需要 200 nanosec;而从内存访问一个 word 只需要 10 nanosec.(数据来自:Teach Yourself Programming in Ten Years)这个硬盘可以提供 125 次 IOPS(1000 ms / 8 ms)。
顺序 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.15 KB per IO,54272.00 / 112.00 = 484.57 KB per IO)。相对随机 IO 而言,顺序 IO 更应该重视每次 IO 的吞吐能力(KB per IO):
?
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/s w/s rkB/s wkB/s avgrq-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/s w/s rkB/s wkB/s avgrq-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/s w/s rkB/s wkB/s avgrq-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/s w/s rkB/s wkB/s avgrq-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.65 KB per IO,491.09 / 66.34 = 7.40 KB per IO. 与顺序 IO 比较发现,随机 IO 的 KB per IO 小到可以忽略不计,可见对于随机 IO 而言重要的是每秒能 IOPS 的次数,而不是每次 IO 的吞吐能力(KB per IO)。
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/Half 10baseT/Full 100baseT/Half 100baseT/Full 1000baseT/Half 1000baseT/Full Supports auto-negotiation: Yes Advertised link modes: 10baseT/Half 10baseT/Full 100baseT/Half 100baseT/Full 1000baseT/Half 1000baseT/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)非常高,context switch(cs)比较低,说明这个 CPU 一直在不停的请求资源;
2. user time(us)一直保持在 80% 以上,而且上下文切换较低(cs),说明某个进程可能一直霸占着 CPU;
3. run queue(r)刚好在4个。
案例分析2 :
1. context switch(cs)比 interrupts(in)要高得多,说明内核不得不来回切换进程;
2. 进一步观察发现 system time(sy)很高而 user time(us)很低,而且加上高频度的上下文切换(cs),说明正在运行的应用程序调用了大量的系统调用(system call);
3. run queue(r)在14个线程以上,按照这个测试机器的硬件配置(四核),应该保持在12个以内。
案例分析3:
. 物理可用内存 free 基本没什么显著变化,swapd 逐步增加,说明最小可用的内存始终保持在 256MB X 10% = 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:该设备每秒的传输次数(Indicate the number of transfers per second that were issued to the device.)。“一次传输”意思是“一次I/O请求”。多个逻辑请求可能会被合并为“一次I/O请求”。“一次传输”请求的大小是未知的。
kB_read/s:每秒从设备(drive expressed)读取的数据量;
kB_wrtn/s:每秒向设备(drive expressed)写入的数据量;
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 工具分析。