(性能测试)磁盘关注的性能指标 网络瓶颈 带宽和宽带 数据库的性能瓶颈分析 数据库连接池 数据库死锁 JVM内存瓶颈分析 总结
目录
磁盘关注的性能指标
网络瓶颈
带宽和宽带
数据库的性能瓶颈分析
数据库连接池
数据库死锁
JVM内存瓶颈分析
总结
磁盘关注的性能指标
磁盘关注的是读写速度 磁盘的速度越快 处理的速度就越快 因为数据是需要读取到内存当中的
读入和写出都需要磁盘的
现在的磁盘分为两部分 一种是固态 另一种是机械的
固态的磁盘价格高,就是因为他的传输速度较高
如果说是传输速度固态磁盘大概是在500M/s 机械硬盘的速度大概是在250M/s,甚至可能更低 但是和内存相比还是相差很远
查看的命令是iowait(用于查看CPU等待输入输出的完成时间的百分比)
后面的1 1 表示的是每秒取一次数据
上面图片中的最后一个值:%util 表示的是1s中有多少的百分比时间用于磁盘io
所有的工作都是程序 只不过是系统程序 所有动的都是程序
是程序说明就是要消耗CPU 所以可以通过查看CPU的使用情况来查看磁盘的使用情况
磁盘io的值过大 说明数据一直在内存和磁盘当中来回传输(input和output)
iowait和util两者的大小一般是匹配的
网络瓶颈
网络和磁盘是非常相近的 关注的也是速度
磁盘是从内存当中读入和写出 网络是和互联网之间的交互 这个也是速度
对于网络而言 关注的是带宽 关注于实际速度和网络的总带宽进行对比
如果接近总带宽,说明网络是存在瓶颈的 需要进行扩容和优化
rx和tx分别表示的是输入和输出
命令
rx和tx分别表示的是输入和输出
测试的关注点:实际统计的数据的发送速率和接收速率 与网络的总带宽进行对比,查看使用的百分比(如果无限接近100%说明存在bug)
带宽和宽带
宽带:用户或者是业务维度来描述网络速率的方式 例如是20M的宽带 100M的宽带
宽带的速率单位bit/s
带宽:速率单位是B(byte)/s 数据在网络中传输的速率
他俩之间的换算单位是1B=8bit
这个过程只有运营商说的是带宽
实际情况:1000M的宽带 只能对应的带宽速率是1000/8
数据库的性能瓶颈分析
慢查询是什么???
设置一个时间阀值:如果运行的时候时间超过了阈值,就是慢的
慢查询的好处就是可以帮助我们定位出慢的sql语句 然后进行分析和修改调整
如何进行监控呢??
使用mysql自带的日志部分
mysql有对应的日志参数:slow_query_log 这个开关默认是关闭状态的,打开之后就会自动的进行观察日志了
slow_query_log_file用来保存日志文件存放的位置
long_query_time 表示的是慢查询的查询时长,超过这个时间就会被记录下来
对于一些系统的变量,查询的时候都是使用的show
如何修改时间呢??
设置全局的开关 修改之后再下次会话才会生效 就是建立连接之后下次打开才会生效
设置完成,并运行脚本抓取到慢查询的日志信息为:
数据库连接池
我们知道在业务操作中会访问数据库 访问数据库的时候会执行sql语句
这个过程也是比较复杂的 先会建立三次握手的连接 三次握手建立完成之后先考虑一下安全性 再进行握手的初始化来验证数据传输时候是正常的(握手初始化-登录认证-返回认证结果) 这些准备操作都准备好之后才可以发了
最后才是执行sql语句,最后返回结果
最后还有四次挥手的关闭等等 这个效率是非常的慢的
我们可以把tcp建立连接,mysql认证以及最后的挥手过程都固化下来,让用户直接执行sql语句,这样的效率就是会大大提升
那如何固化下来呢??使用的就是数据库连接池
数据库连接池就是将这些数据库的连接事先的先建立起来,负责分配,管理和释放数据库的连接
当有程序来请求的时候,就给他分配一个连接;用完成之后就释放连接;释放是收回来,但是不是将其关闭;仅仅只是分配和回收;
这样就可以大大的提升效率,提升对数据库操作的性能;
当请求发来的时候,先看下连接池中是否是有空闲的,如果有空闲就可以分配一个来使用;
这样子就会速度非常快;
如果是没有空闲,判断是否是达到最大连接数,如果没有达到,就新建一个连接给请求的用户;(此时的效率是和之前的一样的)
如果是达到了设备的最大的连接数,就进行等待;(等释放)
如果等待的时间超过了最大的等待时间,就会抛出异常给用户
这个过程第一步的效率是有明显的提升的
第二步是和之间一样的
等待的时间远远超过处理的时间 第四步是直接的出问题了
理想的情况下是保持在第一步的情况下的 我们要关注连接池中是否是有空闲的连接的
如果空闲的连接过大,就会造成资源的浪费,因为连接池本身也是需要消耗一定的内存的资源的,这个地方占的资源过多,那么其他的地方占的资源就会少;
所以连接池本身的占用不能太高也不能太低;
所以我们经常说资源是相互影响的
show的意思就是查看系统变量
其中 5050的意思就是同一时刻,数据库可以同时处理5050个请求
后面查看当前系统正在运行的数量 表示当前已经建立的连接数
后面的数除以前面的数,查看所占的百分比
测试关注的就是当前使用的连接数/最大连接数 就是利用率
过高会占满 过低说明资源存在浪费
上面的两条就是查看方法
数据库死锁
锁是什么??
日常使用的腾讯文档就是在线文档,好多人可以同时进行修改
当时有时候我们写的例如是评论但是看不到了??为什么会出现这种情况呢??
因为大家同时修改,可能就是会被删除 锁就是解决这个问题当一个人修改的时候,别人是不能进行修改的 就是只有是改完成之后下个人才能进行修改
不会出现改乱的情况
实现方法:修改的时候对数据进行加锁,只有当第一个用户修改完成之后,其他的用户才能进行修改
锁分为两种 行锁和表锁
行是表里面的一条记录 行锁就是我操作这一行的时候其他人不能进行修改我占用的这一行
但是可以对其他行进行修改
对于效率上,行锁的效率比较高(这样不会影响其他人)
行锁会出现一个问题 这个问题就是死锁 但是表锁的效率虽然低点 但是不会产生死锁
为什么行锁会产生死锁呢??死锁就是卡死了
死锁要不就是有机制来释放,要么就是手动的干掉
如何判断是否出现了死锁
state中locked肯定是锁了 还要看执行时间 如果是几万毫秒 也是不正常的
如果是有死锁 需要进行释放 使用命令 kill process_id
JVM内存瓶颈分析
jvm内存分为堆内存和非堆内存
非堆内存里面都是存储的静态的 静态就是申请一次之后后面不会再变化了(所有固定的东西就不会出问题)
上面的堆内存每调用一次就会申请空间,这种变化的就是会容易出现问题(如果空间申请之后没有释放,就会导致不够)
那jvm是如何管理的呢??自动回收机制
年轻代 老年代(刚申请的对象在年轻代里面)
泄漏的时长是一个长期性的过程
泄漏完成--内存溢出
程序再来申请空间,就会空间不足 出现应用程序闪退--内存溢出(但是这个不完全是这个原因导致的)