性能分析调优

性能指标分析入手:
1.服务器执行压测期间的cpu使用率需要小于80%

2.服务器执行压测期间的内存使用率需要小于80%

3.压测期间的磁盘IO读写时间,越小越好,最好是5秒以内,像如果达到了10多秒,相应时间肯定会比较多

4.CPU核数,越多越好

5.服务器网络越快越好,带宽越大越好

6.jmeter压测的一个场景的相应时间,看场景,可以默认定义3秒内,有2-5-8原则 (场景是指多个接口组合成一个业务流)

7.接口报错率,有的场景定义就是需要0错误率,也有的接口要求不那么严,可以小于0.05%

8.nginx的进程数和线程数是否充分调用,有几个cpu就设置几个进程,线程数默认1024个,有的服务器比较给力,设置上万的也正常

9.tomcat的线程配置,最大线程数设置个500左右(最高建议100),活跃线程数设置个20(最高40)

10.tomcat的JVM堆内存配置,像电商类的一个tomcat至少初始JVM堆内存要设置个1个G以上

11.JVM的FULLGC机制(垃圾回收),一般是FULLGC一次消耗时间不能超过1秒, FULLGC的屏频率不能低于10分钟一次,否则并发数上去后,相应时间会很大

12.mysql的连接数( show variables like ‘%connect%’; 连接数查看) ,设置的过小也会并发数提高不上去,mysql一般设置个5000左右

13.mysql查询缓存(缓存小的话,磁盘IO大,cpu和内存占用率就会相应变大)

14.sql查询执行性能(sql查询效率越快越好,查询超过1秒以上就认为是慢查询) select * from mysql.slow_log; 查看慢查询语句

      一般慢查询添加外键和索引查询效率就会提升很多,就算百万级的数据查询效率也就快      EXPLAIN  sql语句  就能看到具体这条sql语句的问题

15.mysql的QPS、吞吐量越大越好
16.redis缓存(会否有雪崩,击穿的场景,导致服务出现故障)
17.MQ消息队列(耗时过长也会导致响应时间长)
18.一般来说,一个tomcat能抗住个三五百的并发数,要并发上千的用户数,一般都要2个tomcat以上,需要用nginx的负载均衡来反向代理到tomcat服务上
19.代码调优

主要方向:
服务器硬件资源,ningx中间件进程线程配置 mysql优化 redis数据库 代码调优 JVM+tomcat调优

JVM监控分析调优(tomcat配置)
1、tomcat下的bin目录下的catalina.sh文件配置

jvm堆内存设置的默认设置是600M,一般想要并发数高,响应时间小的话,堆内存至少要设置到1G

堆内存参数
-Xms1024m JVM初始分配的堆内存
-Xmx1024m JVM最大允许分配的堆内存,按需分配(一般至少一个G以上)
-XX:PermSize=256M JVM初始分配的非堆内存(永久代,一般是1/4的堆内存)
-XX:MaxPermSize=256M JVM最大允许分配的非堆内存,按需分配(最大永久代,一般是1/2的堆内存)

qa > 性能测试-分析调优 > image2020-4-18_21-32-58.png

2、tomcat下的conf目录下的server.xml文件配置

2.1、maxThreads(最大连接线程数)设置成50太小了,建议设置成500最大线程数,minSpareThreads(最少活跃线程数)设置成20

     连接线程数设置的太小,并发数肯定是上不去的

2.2、超时连接设置到20000毫秒 (20秒)也可以30秒,设置超时太小的话,很容易有超时的接口有错误率

qa > 性能测试-分析调优 > image2020-4-18_21-31-43.png

3.JVM年老代的FULLGC(全部垃圾回收)

垃圾回收机制(回收内存中的变量,类占用的内存空间),当年老代的内存达到设置的数额,就会发生一次FULLGC,

一般FULLGC一次的时间一定要在1秒以内,FULLGC的频率不能超过10分钟一次,否则并发数大的情况下,响应时间会很长,

排除了tomcat的堆内存的catalina.sh文件配置和server.xml配置,还是不符合FULLGC的标准的话,需要开发检查下代码了

有的代码写的好的,可能半年都不会有一次FULLGC,接口响应就会很稳定(FULLGC时间越短,频率越低,接口就越稳定)

如下图,检测的tomcat模块的JVM情况(使用jdk的bin目录中的jvisualvm工具),

       OLD GEN(年老代的)的FULLGC    共4次,花了55.992s      (一次平均14秒,响应时间会非常大) ,需要检查tomcat的配置或者开发代码

qa > 性能测试-分析调优 > image2020-4-18_22-3-10.png

qa > 性能测试-分析调优 > image2020-4-18_21-58-49.png

Mysql监控分析调优
1.服务器cpu、内存大小都要小于80%

qa > 性能测试-分析调优 > image2020-4-20_17-59-39.png

2.数据库连接数(使用连接,空闲连接)

服务器好的话,设置个5000个连接数,压测期间看使用的连接数是不是饱和或者是超过

qa > 性能测试-分析调优 > image2020-4-20_17-45-24.png

show variables like ‘%connect%’; 连接数查看

qa > 性能测试-分析调优 > image2020-4-20_17-58-35.png

3.数据库慢查询

 sql查询时间大于1秒的,都认为是慢查询

     select * from mysql.slow_log;      查看慢查询语句     一般慢查询添加外键和索引查询效率就会提升很多,就算百万级的数据查询效率也就快      EXPLAIN  sql语句  就能看到具体这条sql语句的问题

qa > 性能测试-分析调优 > image2020-4-20_17-42-50.png

qa > 性能测试-分析调优 > image2020-4-20_18-3-15.png

4.数据库查询缓存

设置个2-4G可以,否则设置的太少,sql执行时候没有缓存使用,就会用磁盘空间, 磁盘IO的读写时间就会上去,cpu和内存,响应时间也会跟着上去

qa > 性能测试-分析调优 > image2020-4-20_17-47-30.png

qa > 性能测试-分析调优 > image2020-4-20_17-43-25.png

数据库配置文件 位置/usr/local/mysql/my.cnf 一般也有可能在/etc/my.cnf
my.conf 修改缓存 到1个G 然后重启mysql 一般(2到4个G)
innodb_buffer_pool_size = 1024M
innodb_buffer_pool_instances= 1

SHOW GLOBAL VARIABLES LIKE ‘innodb_buffer_pool_size’; 查看数据库缓存
qa > 性能测试-分析调优 > image2020-4-20_18-20-58.png

qa > 性能测试-分析调优 > image2020-4-20_18-20-44.png

5.磁盘IO(读写时间太长,如超过5秒的不符合预期,可以同步查看数据库缓存是否太小,导致的磁盘IO读写时间大)

qa > 性能测试-分析调优 > image2020-4-20_17-54-32.png

6.QPS、吞吐量(越大越好)

qa > 性能测试-分析调优 > image2020-4-20_17-52-35.png

nginx进程配置分析
qa > 性能测试-分析调优 > image2020-4-18_18-28-57.png

1 、worker_processes 即nginx处理的进程数,对应linux系统的cpu核数,一般是系统是几核的worker_processes就设置成几,能最大程序调用系统的cpu

可以直接设置为 worker_processes 设置成auto

2、worker_connections 即是线程数,一般是线程数越多越好,可以默认设置成1024个线程

服务器硬件资源 cpu、内存、磁盘IO
1.cpu使用率,一般需要低于80%

qa > 性能测试-分析调优 > image2020-4-20_17-31-37.png

2.内存使用率,需要小于80%

qa > 性能测试-分析调优 > image2020-4-20_17-32-33.png

qa > 性能测试-分析调优 > image2020-4-20_17-32-20.png

3.磁盘IO读写时间不能太大,需要小于5秒

qa > 性能测试-分析调优 > image2020-4-20_17-34-8.png

qa > 性能测试-分析调优 > image2020-4-20_17-34-22.png

redis缓存击穿、雪崩
1.雪崩:是指一大批数据都缓存时间到期,同时失效,导致这时候大量请求直接到DB数据库,可能导致数据库服务器扛不住挂掉

解决:不同的数据增加随机时间,就不会大量数据在同一时间都同时失效,导致雪崩

(1)redis高可用

这个思想的含义是,既然redis有可能挂掉,那我多增设几台redis,这样一台挂掉之后其他的还可以继续工作,其实就是搭建的集群。

(2)限流降级 (使用互斥锁(mutex key))

这个解决方案的思想是,在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询数据和写缓存,其他线程等待。

(3)数据预热(设置key永不失效(热点数据))

数据加热的含义就是在正式部署之前,我先把可能的数据先预先访问一遍,这样部分可能大量访问的数据就会加载到缓存中。在即将发生大并发访问前手动触发加载缓存不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀。

2.击穿:是指单个数据大量请求,然后,该数据缓存过期时间刚到,会导致大量请求直达DB数据库,可能导致数据库服务器扛不住挂掉

设置key永不失效(热点数据)

3.缓存穿透

发生场景:是指查询一个数据库一定不存在的数据。正常的使用缓存流程大致是,数据查询先进行缓存查询,如果key不存在或者key已经过期,再对数据库进行查询,并把查询到的对象,放进缓存。如果数据库查询对象为空,则不放进缓存。此时,若攻击者抓住这个漏洞不断请求数据库,就会对数据库造成压力,甚至压垮数据库。

解决办法:缓存空值的方式,也就是从数据库查询的对象为空,也放入缓存,只是设定的缓存过期时间较短,比如设置为60秒。

MQ消息队列慢:
1.可能很多服务都在排队消费一个服务,导致排队时间太长,响应时间慢

常用解决方案:是给不同的请求服务,增加独立队列,就是多加几个队列(多个通道),排队消费的请求服务就少了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值