目录
1. 操作系统性能分析介绍
2. 系统性能分析思路
2.1 系统性能分析:CPU
2.2 系统性能分析:内存
2.3 系统性能分析:network
2.4 系统性能分析:磁盘 I/O 的利用率和延迟
2.5 小结
3. Linux 系统性能分析思路和实践
3.1 系统负载监控分析实践
3.2 系统监控分析实践
4. Windows系统性能分析思路和实践
4.1 性能监视器综述
4.2 性能监视器工具介绍
4.3 系统监控分析实践
4.4 资源监视器介绍和实践
5. Tomcat监控:Probe
5.1 Tomcat的常规监控项
5.2 Probe安装
5.3 Probe配置
5.4 Probe访问
6. MySQL监控指MONyog
6.1 MySQL监控的简单介绍
6.2 安装MONyog
6.3 启动MONyog,连接配置
6.4 连接成功,进入默认页面,关注性能指标
7. JVM监控
7.1 jps
7.2 jstat
7.3 jmap
7.4 JVisualVM
1. 操作系统性能分析介绍
(1)什么是操作系统资源
系统需要分配调度在它平台上的各类运行程序像它申请的资源,操作系统需要格局用户的需求来进行分配和调度,需要把内存,CPU,网络,磁盘等资源分配给对应的应用程序,以便让它执行,以及程序执行结束时回收它的资源以便再使用。
我们需要让系统的所有资源得以最大程度的发挥作用,是以最低廉的成本达到各应用的最佳性能,实现资源最大利用。
(2)用户响应时间=服务器响应时间 + 网络时间
1)服务器响应时间,是指从服务器接收到请求,到该请求的响应处理完毕,并把对应的数据全部发往客户端。包括:
用户发送请求
应用服务器收到用户发送的请求
应用服务器和DB,文件系统交互
应用服务器返回数据
界面显示
2)网络时间的因素有多个,包括:
服务供应商差异
网络延时
网络拥塞
(3)系统的稳定性,可靠性
(4)系统完成一次请求或响应任务,除了上述因素,还会跟这些因素有关:硬件设备,系统设计,网络拓扑图,内部网络连接设备。
(5)当系统出问题时,我们需要排查的点:应用程序,操作系统,服务器设备,网络环节,系统资源等。
2. 系统性能分析思路
2.1 系统性能分析:CPU
首先了解系统处理器的情况:几个逻辑处理器,处理器型号,主频率,cache大小,是否支持超线程技术等。
CPU的执行速度与性能好坏,决定了系统整体的性能的快慢。
CPU的使用率也是重要指标,当CPU处于满负载状态时,我们要结合系统附带的一些监控分析工具,检查相关的系统日志,web服务器应用日志,DB日志等,结合一些命令top, free, uptime, sar等辅助工具分析。
2.2 系统性能分析:内存
可用内存太小时,系统进程会被阻塞中,应用也会变得缓慢,甚至失去响应,引起内存溢出,应用程序被系统杀死,系统重启等。
内存太大时,也是一种浪费。
虚拟内存也是需要考虑的性能指标。当系统的物理内存不够用时,需要将物理内存中的一部分空间释放出来,以供当前运行的程序使用,那些被释放的空间可能来自一些很长时间没什么操作的程序,那些被释放的空间被临时保存到虚拟内存空间中,等到那些程序要运行时,再从虚拟内存中恢复保存的数据到物理内存中。
系统总是在物理内存不够时,才进行内存之间的交换。有时可以越过系统性能瓶颈,节省系统升级费用。因此在性能分析时,要考虑系统有无设置虚拟内存,以及虚拟内存的使用情况。
虚拟内存和物理内存大小的关系:以前,虚拟内存是物理内存的两倍。现在,物理内存本身就比较大了,所以通常虚拟内存达不到物理内存的两倍。
2.3 系统性能分析:network
系统的应用之间的交互:网络带宽,响应时间,网络延迟,阻塞等,都影响系统性能。
不稳定不安全的网络导致的应用程序的问题:超时,丢弃,阻塞,波动率大。
系统中,我们要考虑对应的网络是否可达,防火墙是否开启,端口的访问,带宽是否有被限制,路由的寻址,网络的时延等问题。
2.4 系统性能分析:磁盘 I/O 的利用率和延迟
应用的访问离不开系统的磁盘数据的读写,I/O读写的性能直接会影响系统程序的性能。
读写的性能直接会影响系统程序的性能,磁盘I/O系统是系统中最慢的部分。
需要考虑:I/O的TPS,平均I/O数据,平均队列长度,平均服务时间,平均等待事件,IO利用率(磁盘 busy time%)等指标。
2.5 小结
上述几个因素是相互依赖的,比如:
大量的网络吞吐量会导致CPU的资源增大,此时系统要分出部分资源去进行软件中断处理。
大量的CPU开销会尝试更多的内存使用。
所以,在进行系统优化时,找出瓶颈的真正出处十分关键。
系统的分析思路有两种:
自顶向下,由应用程序往下分析。
自底向上,从操作系统资源往上分析到应用程序。
3. Linux 系统性能分析思路和实践
Linux系统简介。
日益高涨的性能期望转化为对操作系统调度器,内存管理,磁盘以及网路I/O子系统的扩展性加以性能分析和改进。
3.1 系统负载监控分析实践
系统的负载是一个很重要的指标,它的多少决定了系统是否处于忙碌状态。
可以通过top, uptime, w等命令来分析系统的负载。
小结:
(1)uptime的系统存活时间越长,意味着系统越稳定。可以通过这个时间判断系统有无重启。
(2)可以知道当前有几个登录用户,但是w会更好的显示当前用户登录数。
(3)系统的平均负载,是指在特定时间间隔内运行队列中的平均进程数,如果一个进程满足以下条件,则其就会位于运行队列中:
它没有在等待I/O操作的结果
它没有主动进入等待状态(即没调用wait)
没有被停止(等待终止)
注意:通常系统建议每个CPU内核的当前活动进程数最好不大于0.8,证明系统是空闲的。
大于1且不大于3时,如果系统的其他资源都很正常,那么系统的性能也是可以接受的。
任务数大于5时,证明系统的性能有问题。
比如一个四核CPU的主机,当uptime的输出结果超过15,说明当前系统负载非常严重,需要分析当前的进程调度策略。
(4)系统负载的三个值,表示的过去一分钟,五分钟,十五分钟的一个平均值。通过这三个值,可以分析出系统负载的趋势:是否增加,稳固,降低等。
(5) uptime的负载描述的是一个平均值,取的是过去某段时间的平均信息。如果要分析当前的负载,最好用其他命令,比如ps, top等。
(6)uptime是从文件/proc/loadavg文件里读取的,在写程序读取进程负载时,可以读取这个文件,分别表示的是在过去一分钟,五分钟,十五分钟,正在运行的进程数栈进程总数的壁纸,最近运行的进程ID。
3.2 系统监控分析实践
top命令类似于Windows系统的任务管理器工具。
对所有正在运行的进程和系统载荷提供不断更新的概览信息。
类似的命令还有:htop, dstat, nmon, glances
(1)任务队列信息
包含:
当前时间,系统运行时间,当前登录用户数,系统负载平均长度(1,5,15分钟前到现在的平均值)
(2)进程状态信息
Linux系统中,进程信息的五种状态:
1)D:不可中断的睡眠态 Uninterruptible sleep 通常出现在IO阻塞
2)R:运行态 Running or runnable
3)S:睡眠态 Interruptible sleep
4)T:被跟踪或已停止 Stopped
5)Z:僵尸态 process
(3)CPU信息
包括:
用户空间占用CPU百分比,
内核空间占用CPU百分比,
用户进程空间改变过优先级的进程占用CPU百分比,
空闲CPU百分比,
等待输入输出的CPU时间百分比,
硬中断占用CPU百分比,
软中断占用CPU百分比
小结:
1)Cpu(s):表示当前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通过一种软件的方法(可延迟函数)来模拟硬件的中断模式,叫做软中断。常见的软中断和网络有关。比如:把数据包传送到网卡(NET_TX_SOFTIRQ), 从网卡接收数据包(NET_RX_SOFTIRQ), 长时间写日志等。
当软中断出现瓶颈时,系统有个进程叫ksoftirqd, 每个CPU都有自己对应的ksoftirqd/n(n为CPU的逻辑ID),每个ksoftirqd的内核线程都会去运行对应的ksoftirqd()函数,来处理自己的中断队列上的软件中断。此时,可以通过该命令来查看进程的ksoftirqd的使用信息:ps aux | grep ksoftirqd
7)Ni:优先级为操作系统用来决定CPU分配的参数,Linux使用round-robin的算法来做CPU排程,优先序越高,所可能获得的CPU时间就越多。可以通过nice命令以更改过的优先序来执行程序。如果未指定程序,则会打印出目前的排程优先序。
8)系统的CPU利用率:us+sy+si。或者1-%id。
(4)内存信息
包括:
物理内存总量
使用的物理内存总量
空闲内存总量
用作内核缓存的内存量
缓冲的交换区总量
交换区总量
使用的交换区总量
空闲交换区总量
小结:
1)buffer和cache的作用是,缩短I/O系统调用的时间,比如读写等。一般一个系统而言,如果cache的值很大,说明cache的文件数多。如果频繁的访问文件都能被命中,很明显会比读取磁盘调用快,磁盘的IO必定会减小。
cache的命中率很关键,如果频繁访问的文件不能被命中,对cache而言是一个很大的浪费,此时应该考虑drop cache。
2)通常说系统的men.free表示的是空闲内存总量,但需要注意的是,虽然buffer/cache会占用一定的物理内存,但是当系统需要内存的时候,这些内存可以立即释放出来,即buffer/cache算可用内存。
3)在做清理cache/buffers时,一个把物理内存的数据同步到磁盘的过程,为了保证在执行完drop cache的过程不丢失数据,需要执行sync命令,sync命令执行同步避免丢失数据。
(5) 进程信息
包括:
PID:进程PID
USER:进程所有者的用户名
PR:优先级
NI:nice值,负值表示高优先级,
VIRT:进程使用的虚拟内存总量,单位kb, VIRT=SWAP+RES
RES:进程使用的,未被换出的物理内存大小,单位kb, RES=CODE+DATA
SHR:共享内存大小,单位kb
%CPU:上次更新到现在的CPU时间占用百分比
%MEM:进程使用的物理内存百分比
TIME+:进程使用的CPU时间总计,单位1/100秒
COMMAND :命令名/命令行
小结:
1)top命令的第六七行显示是所有进程有关的信息,如果要显示线程级信息,用ps
2)进程实际使用的内存是查看RES那一列的信息,VIRT表示的是进程使用的虚拟内存的数据, SHR表示的是共享内存的数据。
3)TIME+表示的是进程使用的CPU时间的踪迹,而非进程的存活时间,且TIME+默认精确单位是到1/100秒,由于TIME+显示的是CPU时间,所以可能存在TIME+大于程序运行时间,也可能小于程序运行时间,这两个没有必然的联系,完全取决于该程序所能分配到的CPU时间而定。
4)%CPU表示的是进程所占用的CPU的百分比,通过这个可以得出进程的CPU利用率。
5)默认情况下系统不会显示进程分布区在哪几个逻辑CPU上,如想分析各个CPU对应的应用程序,可以修改top的默认配置,添加字段Last used CPU即可。
6)还可以自定义一些top配置,可以查看更多的信息
7)常用的修改top的配置包括修改刷新间隔时间,添加字段,删除字段,排序,保存等。
top间隔刷新: 输入top后,按d键,进入间隔刷新配置,输入间隔秒数即可。按enter键退出。
8)添加进程字段显示列
当默认情况的进程信息不能满足时,可以考虑添加一些额外的配置。
此时,输入top命令,按下f键,进入列配置页面。
此时按下A,系统不会再显示PID列,输入d,会在top命令后加入UID列。
9)显示平均/各个CPU的利用率信息
默认情况下,系统是显示平均CPU的利用情况,但很多时候,用户会关心各个CPU的利用情况时,可以在进入top命令后,输入数字1,就可以看到对应的各个CPU的利用情况。
10)注意:上面几种配置因没有加W保存配置,所以当用户退出top交互界面后,下次登录又会重新加载,所以需要在top界面输入字母W保存。即在top后,输入W,会出现下方提示信息。表示将top配置保存进了环境变量,下次读取可以生效。
top脚本问题:
除了top配置之外,还需要注意一些top脚本的问题:
top脚本的作用:通常我们需要持续性的监控系统的资源信息,所以需要了解脚本。
top对应的几个参数:
-b:批处理模式
-c:命令/程序名,触发
-d:设置延迟间隔
-n:设置迭代数量
-p:监控特定的PID
-u 或 -U:用户名,或者UID
1)top监控的日志,重定向到文本中。通常需要带上-b,否则会出现乱码,如下。
2)通常来说,监控有时间频率,默认是3秒。可以通过-d参数来设置。
3)top -n 参数表示的是退出前监控的次数,如想监控三次退出的话,可以输入top -n 3
4)监控脚本 topcpu.sh 参考如下:
#!/bin/bash
# @Function
# TOP CPU Thread INFO.
#
#
#
PROG=`basename $0`
usage() {
cat <

