《JMeter实战》第九章 性能监控诊断 摘录
操作系统是管理和控制计算机硬件与软件资源的计算机程序,是直接运行在“裸机”上的最基本的系统软件,任何其他软件都必须在操作系统的支持下才能运行。
它的功能包括管理计算机系统的软件、硬件及数据资源,控制程序运行,改善人机界面,为其他应用软件提供支持,让计算机系统所有资源最大限度地发挥作用,提供各种形式的用户界面,使用户有一个好的工作环境,为其他软件的开发提供必要的服务和相应的接口等。
当应用不可用,访问慢时,应系统地分析应用在什么样的负载条件下,系统上运行了多少应用,系统的资源分配是否合理,系统是否超负荷运行,能否优化系统的资源来让系统和应用程序耦合度更高。主要从以下几块进行分析:
- 从单处理器到多处理器,从单线程到多线程,在做系统性能分析前,要了解系统处理器的情况:逻辑处理器,处理器型号,主频率,cache大小,是否支持超线程技术。
- CPU的使用率也是需要关注的重要指标(辅助命令:top, free, uptime, sar),一般期望系统平均可用的CPU不少于20%。
- 【Java程序可以通过 JVM自带的命令工具(jstat, jmap, Jvisualvm, JConsole)来分析。MySQL可以通过数据库监控工具(Spotlight, Monyog,命令行工具)来分析。】
- 考虑是否需要做负载均衡或者加强机器性能。
内存大小是影响系统性能的一个核心指标,内存太小,系统进程会被阻塞,应用会非常缓慢,可能没响应,严重的会触发内存溢出从而引起应用程序被系统杀死,更严重的引起系统重启。内存太大又浪费,这时考虑做一些缓存服务器提升系统性能。希望内存足够大。
虚拟内存也是在内存里需要考虑的性能指标,在系统的设计中,当系统的物理不够用的时候,就需要将物理内存中的一部分空间释放出来,以供当前运行的程序使用。那些被释放的空间可能来自一些很长时间没有什么操作的程序,这些被释放的空间被临时保存到虚拟内存中,等到那些程序要运行时,再从虚拟内存中恢复保存的数据到物理内存中。这样,系统总是在物理内存不够时,才进行内存之间的交换。做性能分析时,要考虑系统有无设置虚拟内存,以及虚拟内存的使用情况。因以前的系统内存偏小,所以有很多数据会建议是物理内存的两倍,但随着物理内存的增大,很多服务器的RAM已可以到64G,128G,虚拟内存再设置成它的两倍就有点浪费了。
系统性能分析因素---网络
系统应用之间的交互,尤其是跨机器之间的,都是要基于网络的,因此网络带宽、响应时间、网络延迟、阻塞等都是影响系统性能的因素。假如应用在不稳定,不安全的网络下会导致应用程序的超时、丢弃、阻塞、波动率大,这些在系统中都是不能接受的。我们需要一个可靠的、稳定的、能满足我们的应用程序在机器A-B之前畅通无阻地运行。
访问应用离不开系统的磁盘数据的读写,I/O读写会影响系统程序的性能。磁盘I/O系统是系统中最慢的部分。I/O比较频繁的时候,如果I/O得不到满足会导致应用的阻塞。针对I/O的场景模型,我们要考虑的有IO的TPS、平均I/O数据、平均队列长度、平均服务时间、平均等待时间、IO利用率(磁盘Busy Time%)等指标。
前面介绍了系统的子系统因素,这些因素之间是相互依赖的。比如:
- 1)大量的网络吞吐量会导致占用CPU的资源增大,此时系统要分出部分资源去进行软件中断的处理。
- 2)大量的CPU开销会尝试更多的内存使用。
- 有时看似是某一个资源出现问题,其实很可能最终的原因是其他的资源导致的。
- 进行系统性能分析的时候,首先最重要的一点是确定应用类型,理解并分析当前系统的特点。多数系统所对应的应用类型主要分为以下两种:
- IO Bound(IO范畴):高负荷的内存使用以及存储系统,IO范畴的应用就是一个大量数据处理的过程。通常数据库软件被认为是IO范畴的应用类型。
- CPU Bound(CPU范畴):高负荷的CPU占用,批量处理CPU请求以及数学计算的过程。有Web server, mail server.
- 不管是什么类型,分析思路无非两种:自顶向下,由应用程序往下分析;自底向上,从操作系统资源往上分析到应用程序。
在Linux系统中,系统的负载是个很重要的指标,它的多少决定了系统是否处理忙碌状态。在系统开始运行的时候,CPU处理颗数已经是个恒定值,它的大小决定了同一时刻,系统可以承受的最大负载。当超过这个负载的系统调用就会出现阻塞;我们可以通过类似uptime、top、w等命令帮我们分析系统的负载。
uptime命令主要用于获取主机运行时间和查询Linux系统负载等信息,uptime命令可以显示系统已经运行了多长时间,以及有多少个用户登录,快速获知服务器的负荷情况,它信息显示依次为:现在时间、系统已经运行了多长时间、目前有多少登录用户、系统在过去的1分钟、5分钟和15分钟内的平均负载。
总结uptime的经验:
1)uptime的系统存活时间越长,意味着系统越稳定,我们可以通过uptime查看系统这一段时间有无重启,这也是一种常见分析系统是否稳定的命令。
2)通过uptime可以得知当前有多少登录用户数,但相对来说用w命令会更好地显示当前登录用户数的信息。
3)系统的平均负载的意思是指在特定时间间隔内运行队列中的平均进程数,如果一个进程满足以下条件则其就会位于运行队列中:
它没有在等待I/O操作的结果
它没有主动进入等待状态
没有被停止
注意:一般系统建议每个CPU内核的当前活动进程数最好不大于0.8,证明系统是空闲的,大于1且不大于3的时候,如果系统的其他资源都很正常,那么系统的性也是可以接受的。但如果任务数大于5的话,那证明系统的性能有问题了。
4)系统负载的3个值表示的是系统过一分钟,五分钟,十五分钟的一个平均值,可通过这些值分析系统的负载趋势:增加,稳固,降低等。
5)uptime的负载描述是一个平均值,它取的是过去某段时间的平均信息。要分析当前的情况用ps, top等。
6)uptime是从文件/proc/loadavg文件里面读取的。
top命令详解:
任务队列信息:
进程状态信息:
CPU信息:
在这里要注意的指标如下:
1)CPU(s):表示当前CPU的平均值,默认的top命令配置是显示平均的CPU使用情况,按键盘1可显示各颗CPU的使用情况。
2)统计空闲的CPU利用率%id的计数,当id持续过低的时候,表示系统迫切需要解决CPU资源问题。
3)使用的CPU利用率1-%id
4)wa:使用率过高时,考虑IO的性能是否有瓶颈,可以再用iostat,sar等命令做一步分析。
5)hi: 使用率过高时,表示当前硬件中断占用很大的百分比。可分析文件/proc/interrupts, /proc/irq/pid/smp_affinity,服务irqbalance是否配置,以及CPU的频率设置。
6)si: Linux kernel通过一种软件的方法来模拟硬件的中断模式,叫软中断。常见的中断和网络相关。从网卡到IP层的数据报文收发都是由软件中断来处理的,长时间的写日志也可能产生软件中断。
7)Ni: 优先级为操作系统用来决定CPU分配的参数,优先序越高,获得CPU时间就越多。可用nice命令更改优先序来执行程序。内定的adjustment为10,范围为-20到19.
内存信息:
1)buffer和cache的作用是缩短I/O系统调用的时间。一般来说,如cache的值很大,说明cache住的文件数多。命中率高,IO小,命中率低,可drop cache并提升对应的命中率。
2)mem.free是空闲内存总量,注意,虽然buffer/cache会占用一定的物理内存,但当系统需要内存的时候,这些内存可立即释放,buffer/cache可看成可用内存。
sync 内核同步 -》 echo 3 > /proc/sys/vm/drop_caches( echo 1是释放页缓存,echo 2 是释放slab,而echo 3就是既释放页缓存,又释放slab)