一、系统分析:
1、先大致找出是哪个方面影响了系统的响应(CPU、IO、内存),这个时候可以使用top命令、查看系统资源的使用情况:
a)%id:空闲CPU时间百分比,如果这个值过低,表明系统CPU存在瓶颈;
b)%wa:等待I/O的CPU时间百分比,如果这个值过高,表明IO存在瓶颈;
2、vmstat综合分析:
a)procs下的r:在运行队列中等待的进程数,通常情况下不应该大于CPU数的三倍,大于的话就认为系统负担已经比较大了;
b)procs下的b:等待IO的进程数
c)cpu的使用情况:(us用户所占用的、sy系统调用和中断所占用的、id闲置的、wa因等待而占用的),如果id长期小于10%就表明cpu资源已经非常紧张了。等待IO表明cpu因等下IO而处于占用状态,这是的CPU并没有处于运算状态,而是白白浪费了,所以wa值应该是越小越好。
3、查看内存使用:
a)free:查看内存的使用情况
· total:表示物理内存总量(total = used + free)
· used:表示总计分配给缓存(包含buffffers 与cache )使用的数量,但
其中可能部分缓存并未实际使用。
· free:未被分配的内存。
· shared:共享内存,一般系统不会用到,这里也不讨论。
· buffffers:系统分配但未被使用的buffffers 数量。
· cached:系统分配但未被使用的cache 数量。
· buffffers是指用来给块设备做的缓冲大小,他只记录文件系统的metadata以及 tracking in-flflight pages.
cached是用来给文件做缓冲。那就是说:buffffers是用来存储,目录里
面有什么内容,权限等等。
b)vmstat:监控内存的使用情况。正常情况下swap下面的si和so(swap的读取和写入)应该维持在一个比较低的数值下
· r 表示运行队列(就是说多少个进程真的分配到CPU),我测试的服务器目前CPU比较空闲,没什么程序在跑,当这个值超过了CPU数目,就会出现CPU瓶颈了。这个也和top的负载有关系,一般负载超过了3就比较高,超过了5就高,超过了10就不正常了,服务器的状态很危险。top的负载类似每秒的运行队列。如果运行队列过大,表示你的CPU很繁忙,一般会造成CPU使用率很高。
· b 表示阻塞的进程,这个不多说,进程阻塞,大家懂的。
· swpd 虚拟内存已使用的大小,如果大于0,表示你的机器物理内存不足了,如果不是程序内存泄露的原因,那么你该升级内存了或者把耗内存的任务迁移到其他机器。
· free 空闲的物理内存的大小,我的机器内存总共8G,剩余3415M。
· buff Linux/Unix系统是用来存储,目录里面有什么内容,权限等的缓存,我本机大概占用300多M
· cache cache直接用来记忆我们打开的文件,给文件做缓冲,我本机大概占用300多M(这里是Linux/Unix的聪明之处,把空闲的物理内存的一部分拿来做文件和目录的缓存,是为了提高 程序执行的性能,当程序使用内存时,buffer/cached会很快地被使用。)
· si 每秒从磁盘读入虚拟内存的大小,如果这个值大于0,表示物理内存不够用或者内存泄露了,要查找耗内存进程解决掉。我的机器内存充裕,一切正常。
· so 每秒虚拟内存写入磁盘的大小,如果这个值大于0,同上。
· bi 块设备每秒接收的块数量,这里的块设备是指系统上所有的磁盘和其 他块设备,默认块大小是1024byte,我本机上没什么IO操作,所以一直是0,但是我曾在处理拷贝大量数据(2-3T)的机器上看过可以达到140000/s,磁盘写入速度差不多140M每秒
· bo 块设备每秒发送的块数量,例如我们读取文件,bo就要大于0。bi和 bo一般都要接近0,不然就是IO过于频繁,需要调整。
· in 每秒CPU的中断次数,包括时间中断
· cs 每秒上下文切换次数,例如我们调用系统函数,就要进行上下文切 换,线程的切换,也要进程上下文切换,这个值要越小越好,太大了,要考虑调低线程或者进程的数目,例如在apache和nginx这种web服务器中,我们一般做性能测试时会进行几千并发甚至几万并发的测试,选择web服务器的进程可以由进程或者线程的峰值一直下调,压测,直到cs到一个比较小的值,这个进程和线程数就是比较合适的值了。系统调用也是,每次调用系统函数,我们的代码就会进入内核空间,导致上下文切换,这个是很耗资源,也要尽量避免频繁调用系统函数。上下文切换次数过多表示你的CPU大部分浪费在上下文切换,导致CPU干正经事的时间少了,CPU没有充分利用,是不可取的。
· us 用户CPU时间,我曾经在一个做加密解密很频繁的服务器上,可以看到us接近100,r运行队列达到80(机器在做压力测试,性能表现不佳)。
· sy 系统CPU时间,如果太高,表示系统调用时间长,例如是IO操作频繁。
· id 空闲 CPU时间,一般来说,id + us + sy = 100,一般我认为id是空闲CPU使用率,us是用户CPU使用率,sy是系统CPU使用率。
· wt 等待IO CPU时间。
4、进一步查看IO状态:(iostat -d -x -k 1 1)
rrqm/s:每秒这个设备相关的读取请求有多少被Merge了(当系统调用需要读取数据的时候,VFS将请求发到各个FS,如果FS发现不同的读取请求读取的是相同Block的数据,FS会将这个请求合并Merge)wrqm/s:每秒这个设备相关的写入请求有多少被Merge了。rsec/s:每秒读取的扇区数;wsec/:每秒写入的扇区数。rKB/s:The number of read requests that were issued to the device per second;wKB/s:The number of write requests that were issued to the device per second;avgrq-sz 平均请求扇区的大小avgqu-sz 是平均请求队列的长度。毫无疑问,队列长度越短越好。await: 每一个IO请求的处理的平均时间(单位是微秒毫秒)。这里可以理解为IO的响应时间,一般地系统IO响应时间应该低于5ms,如果大于10ms就比较大了。这个时间包括了队列时间和服务时间,也就是说,一般情况下,await大于svctm,它们的差值越小,则说明队列时间越短,反之差值越大,队列时间越长,说明系统出了问题。svctm 表示平均每次设备I/O操作的服务时间(以毫秒为单位)。如果svctm的值与await很接近,表示几乎没有I/O等待,磁盘性能很好,如果await的值远高于svctm的值,则表示I/O队列等待太长, 系统上运行的应用程序将变慢。%util: 在统计时间内所有处理IO时间,除以总共统计时间。例如,如果统计间隔1秒,该设备有0.8秒在处理IO,而0.2秒闲置,那么该设备的%util = 0.8/1 = 80%,所以该参数暗示了设备的繁忙程度。一般地,如果该参数是100%表示设备已经接近满负荷运行了(当然 如果是多磁盘,即使%util是100%,因为磁盘的并发能力,所以磁盘使用未必就到了瓶颈)。a)如果%iowait的值过高,表示硬盘存在I/O瓶颈(单位为微秒,正常情况下小于5,大于10一般就是磁盘的性能瓶颈);
b)如果 %util 接近 100%,说明产生的I/O请求太多,I/O系统已经满负荷,该磁盘可能存在瓶颈;
c)如果 svctm 比较接近 await,说明 I/O 几乎没有等待时间;
d)如果 await 远大于 svctm,说明I/O 队列太长,io响应太慢,则需要进行必要优化
e)如果avgqu-sz比较大,也表示有大量io在等待
二、进程分析:
1、pstack:用来跟踪进程栈信息,排查进程问题时非常有用,比如我们的一个进程一直在work状态(此时要考虑下是不是进入了死循环),用这个命令可以非常轻松的定位到。一般是在短时间内多次执行这个命令,如果多次或者一直停留在一个地方,这个时候就需要留意是不是这出了问题;
2、strace:用来跟踪进程的系统调用
三、sar命令:
· 怀疑CPU存在瓶颈:
。sar -u查看CPU的使用率
%user: 用户态下CPU使用时间比率%system: 内核态下CPU使用时间比率%iowait: CPU等待I/O占用时间比率%idle: CPU空闲时间比率sar -q查看系统负载(系统的平均负载大于3为系统负载过高);· runq-sz:运行队列的长度(等待运行的进程数)
· plist-sz:进程列表中进程(processes)和线程(threads)的数量
· ldavg-1:最后1分钟的系统平均负载
· ldavg-5:过去5分钟的系统平均负载
· ldavg-15:过去15分钟的系统平均负载
· 怀疑内存存在瓶颈:
○ sar -r查看内存的使用情况(内存是否充足)
kbmemfree:这个值和free命令中的free值基本一致,所以它不包括buffffer和cache的空间kbmemused:这个值和free命令中的used值基本一致,所以它包括buffffer和cache的空间.%memused:物理内存使用率,这个值是kbmemused和内存总量(不包括swap)的一个百分比.kbbuffffers和kbcached:这两个值就是free命令中的buffffer和cache.kbcommit:保证当前系统所需要的内存,即为了确保不溢出而需要的内存(RAM+swap).%commit:这个值是kbcommit与内存总量(包括swap)的一个百分比.· sar -W查看是否有大量的换入换出操作
pswpin/s:每秒系统换入的交换页面(swap page)数量pswpout/s:每秒系统换出的交换页面(swap page)数量 。sar -B查看磁盘和内存的交互量;pgpgin/s:表示每秒从磁盘或SWAP置换到内存的字节数(KB)pgpgout/s:表示每秒从内存置换到磁盘或SWAP的字节数(KB)fault/s:每秒钟系统产生的缺页数,即主缺页与次缺页之和(major +minor)majflflt/s:每秒钟产生的主缺页数.pgfree/s:每秒被放入空闲队列中的页个数pgscank/s:每秒被kswapd扫描的页个数pgscand/s:每秒直接被扫描的页个数pgsteal/s:每秒钟从cache中被清除来满足内存需要的页个数%vmeffff:每秒清除的页(pgsteal)占总扫描页(pgscank+pgscand)的百分比· 怀疑IO存在瓶颈:
○ sar -b查看磁盘的读取负载和读取量
tps: 每秒向磁盘设备请求数据的次数,包括读、写请求,为rtps与wtps 的和。出于效率考虑,每一次IO下发后并不是立即处理请求,而是将请求合并(merge),这里tps指请求合并后的请求计数。rtps: 每秒向磁盘设备的读请求次数wtps: 每秒向磁盘设备的写请求次数bread: 每秒从磁盘读的bytes数量bwrtn: 每秒向磁盘写的bytes数量· sar-d查看响应时间和使用率
tps:每秒从物理磁盘I/O的次数.多个逻辑请求会被合并为一个I/O磁盘请求,一次传输的大小是不确定的.rd_sec/s:每秒读扇区的次数.wr_sec/s:每秒写扇区的次数.avgrq-sz:平均每次设备I/O操作的数据大小(扇区).avgqu-sz:磁盘请求队列的平均长度.await:从请求磁盘操作到系统完成处理,每次请求的平均消耗时间,包括请求队列等待时间,单位是毫秒(1秒=1000毫秒).svctm:系统处理每次请求的平均时间,不包括在请求队列中消耗的时间.%util:I/O请求占CPU的百分比,比率越大,说明越饱和.1. avgqu-sz 的值较低时,设备的利用率较高。
1. 当%util的值接近 1% 时,表示设备带宽已经占满。
四、其他:
1、gprof:函数用时统计工具
· gprof 不支持多线程应用,多线程下只能采集主线程性能数据。原因是gprof采用ITIMER_PROF信号,在多线程内只有主线程才能响应该信号。
2、valgrind:内存泄漏工具;
3、OProfifile:linux平台性能测试工具
老铁们,关注私信我【资料】资料内容涵盖BAT架构技术与面试真题,减少你到处搜索资料的时间,成体系的实战技术知识,让你面试、进阶都更加容易。