性能问题汇总

1,303 阅读8分钟

  1. 压测端硬件、网络或软件

     1.域名压测导致大量请求流向外网,并出现流量清洗

  •   现象:测试结果显示tps非常低,请求量压测端统计与服务端统计相差很大
  • 解题思路:确认压测域名是否走内网IP,ping+压测域名获取到的ip地址与运维确认是否为内网ip,若不支持ping,可尝试tracert。确定未走内容可能需要运维协助,在入口机器(nginx)配置host将域名指定到某台或多台服务器上。

   2.Jmeter测试报告显示出现各种异常报错信息,如:500、502、non  http  responsecode

  • 现象:控制台错误请求量增加、根据错误类型寻找错误提示、错误
  • 解决思路:确定错误类型,根据错误类型寻找错误真实原因。(500:服务器内部错误,无法完成请求、502:充当网关或代理的服务器,从远端服务器接收到了一个无效的请求、400:客户端请求的语法错误,服务器无法理解、404:服务器无法根据客户端的请求找到资源(网页))其他状态详解见:blog.csdn.net/t_332741160…

    3.Jmeter  Jvm 分配内存不足导致内存溢出

  • 现象:控制台出现报错,出现OutOfMemoryError
  • 解决思路:Windows中对应的文件路径:Jmeter_Home/bin/jmeter.bat
  •       set HEAP=-Xms512m -Xmx512m
  •       set NEW=-XX:NewSize=128m -XX:MaxNewSize=128m
  •      Linux下对应文件路径:Jmeter_Home/bin/jmeter
  •      HEAP=-Xms512m -Xmx512m
  •      NEW=-XX:NewSize=128m -XX:MaxNewSize=128m
  •      通常就meter默认的HEAP -Xms512:初始化内存大小,-Xmx512m:最大堆内存。需要增 加内存的时候需要注意
  •  - 一般会将-Xms和-Xmx两个值配置为相同值,目的是为了能在java的GC完成后堆内存不需要重新分隔计算堆区大小而浪费资源
  • - -Xms和-Xmx两个值修改的值一般需要为512的整数倍
  • - -Xmx不要超过物理内存的50%,超出可能会导致jmeter变慢
  • - 当脚本执行过程中出现内存溢出outfmenmory错误,先尝试增加增加HEAP的-Xms和-Xmx
  • - JDK32位的电脑Xmx不能超过1500m,最大1378m.否则在启动Jmeter时会报错
  • - -XX:MaxNewSize:新生代可被分配的内存的最大上限,这个值应该小于-Xmx的值,因为新生代占内存来自整个堆内存通常设置为-Xmx的三分之一
  • - jvm在执行GC时,会停止工作。MaxnewSize的增大,可以降低GC频率

   4.端口被占用

  • 现象:并发6000次/s,错误率高达66.89%
  • 错误日志:Non HTTP response code:java.net.BindException,Non HTTP response message: Address already in use
  • 原因:Jmeter windows压测环境:Windows Server 缺失MaxUserPort和TcpTimedWaitDelay;限制了tcpip最大连接数和响应时间
  • 解决办法:注册表HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/ Services/TCPIP/Parameters;添加MaxUserPort和TcpTimedWaitDelay,分别设置值为65534、30,以增大可分配的tcp连接端口数、减小处于TIME_WAIT状态的连接的生存时间

2.服务器硬件、网络

1.压测方式使用的是域名压测,走的外部网络,所以压测压力未能如预期一样对目标服务器施压,导致TPS非常低,服务器各种资源消耗也很小。

  • 现象:使用单台压测机器分别进行了100、500、1000进程压测,500个线程的时候tps只有180-200.再增加压力Tps上不去。
  • 解决思路:一开始以为服务器连接数有问题,修改Tomcat最大连接数无效果。最后统计压测端请求量与被测服务器接收请求量相差比较大
  • 解决方式:网络入口配置host/dns的形式将指定域名的请求全部指向测试服务器(对应IP)

2.原有集群到达最大限制,TPS达到280左右就出现CPU适应过高情况

  • 现象:2台web和4台service在调整配置、代码优化出现瓶颈,使用单台压测机器分别进行了100、500、1000进程压测,500个线程的时候tps达到280位最高并发,90%响应时间最小而且CPU等资源正常,增加并发数到1000后tps降低、响应时间增加CPU使用率>70%
  • 解决方法:增加集群机器

3. 中间件

1.Tomcat连接处瓶颈,导致高并发时出现接口超时

  • 现象:500线程组并发的时候,服务端日志出现大量超时提示,排查Tomcat线程数配置的时候发现maxThreads(线程池中最大活跃线程数)为100
  • 解决:修改maxThreads、accept-count为500后错误解决
  • - maxThreads:最大请求进程数,默认设置为200,该值设置应该考虑实际情况,当
  • 请求进程数达到最大值时,一般会出现错误提示:SEVERE: All threads (150) are currently busy, waiting. Increase maxThreads (150) or check the servlet status
  • - accept:可接队列长度,与maxThreads对应,当达到maxThreads后进入等待队列。而等待队列数达到最大值后,再有新请求后就会出现refuse connection(拒绝请求)

2.502 Bad Gateway和504 Gateway  Time-out

  • 问题定位:tomcat的参数配置问题
  • 解决办法:调整tomact配置文件server.xml的配置:主要是最大线程数、最大建立连接数和最长连接时间

3.JVM优化

  • 现象:TPS每隔段时间就将为0
  • 问题定位:(1)监控tcp的连接数,等待数;(netstat -an |grep 6222 | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}')(2)查看服务端FULL GC的次数(过多,FULL GC会导致所有线程
  • 解决办法:JVM调优+ tomcat参数调优
  • 1、取消飞行记录模式,去除参数(-XX:+UnlockCommercialFeatures -XX:+FlightRecorder)
  • 2、jdk1.8 下取消了-XX:PermSize=500m-XX:MaxPermSize=500m
  • 3、垃圾回收机制改成G1模式(堆内存被划分为固定大小的多个区域,存活的对象从一块区域转移到另一块区域,这样可以进行垃圾回收的同时不停止其他应用程序线程)
  • JVM的常用参数如下:
  •        -Xms设置初始化堆的最大值
  •       -Xmx 设置堆的最大值
  •        PS:-Xms和-Xmx一般是相同的,可以减少Full GC的频率,最大可以到服务器总内存 的80%
  •        -Xmn 设置年轻代的大小(年老代=最大值-年轻代),一般为最大值的1/3左右。

4. 数据库、缓存等

1.DB优化

  • 优化sql,尽可能少使用join、or语句,select出来的字段是必需的字段
  • 优化索引,让每条select都走索引
  • 设置连接池的最大连接数,设置为10000/14=700,(10000 为项目使用的mysql 最

      大连接数,14 为机器数)

  • 尝试测试不同的连接池,选择性能最佳的
  • 不使用数据库事务,因为数据库操作代码都在消费者中,在代码中做幂等性。查询一条语句性能测试(ms)

2.redis优化存储数结构

  • 将db 中的数据load 保存为redis 的hash 结构(全表保存),根据业务优化redis 存储结构,减少redis 查询次数(例如将phone 和券code 的领取状态单独存储)。

2.1.redis  cpu为单核,进行分片处理

  • 大量查询会成为严重短板,通过hash 值进行分片处理,因为项目不存在热点key 的问

题。优化过后redis 能够承受的量是之前的3 倍

2.2.设置redis最大连接数

  • Redis 最大连接数设置为:3*10000/14 = 2100(这里乘以3 是因为微利项目有三台redis)

3.mq优化消息

  • 消息体一般为redis key,可以去redis 拿取数据,优化消息存储大小。按功能不同,拆

分多个队列,加快单逻辑处理速度,微利项目根据业务拆分为5 个队列

3.1.加快消费者消费速度

  • 增加消费者数量为20 个,根据下游(DB、业务方)TPS 多次测试得出,可以利用消费者数

量控制下游的负载。

  • 增加消费者预读取数据数量为50 个,从而减少网络请求次数。
  • 优化消费逻辑,完善幂等操作(解决消息重复消费问题),db 操作,业务查询操作。

4.redis连接池pingjing

  • 优化后配置:

     redis.pool.maxTotal=5000

    redis.pool.maxIdle=100

    redis.pool.minIdle=50

  • 关键参数说明:

   maxTotal:资源池中最大连接池,默认值8

 - 最大连接数的配置需要结合实际情况进行调整,而考虑的关键因素包括:

 - 业务要求Redis达到的并发量

 - 客户端执行命令时间

 - Redis资源:如应用个数*maxTotal不能超过Redis的最大连接数

 - 资源开销:控制空闲连接,尽量使连接池的频繁创建、释放造成不必要的开销