图片服务接口返回缓慢导致的前端整体崩溃

场景: 图片微服务需要请求第三方厂家,第三方厂家挂了之后,导致和图片微服务没有关系的用户管理也变得很慢

排查思路

  1. top -c 查看 cpu 和内存占用 shift+p CPU 排序, shift+m 内存排序, 右上角有一个load average 指标有三个参数,如果 (a+b+c)/3 超过0.6 则表示系统负载有点重
  2. uptime 简单的看负载
  3. vmstat -n 2 3查看 cpu信息, 需要查看的信息为
    r: 运行和等待CPU 时间片的进程数,等待的数量不能超过总CPU数量的两倍。
    b: 等待资源的进程数,比如正在等待的磁盘IO 网络IO
    us: 用户进程消耗的cpu时间百分比,长期大于50%需要优化
    如果 us + sy > 80% 可能cpu不足
    sy:内核进程小号的cpu时间百分比
  4. cat /proc/cpuinfo |grep processor | wc -l 查看cpu个数
  5. mpstat -P ALL 2 查看所有cpu信息,如果 idle 低于60则表示cpu有压力
  6. free -h 内存
  7. iostat -xdk 2 3 磁盘io性能评估 .
    rkB/s 每秒读取数量 kB
    wkB/s 每秒写入数据量 kB
    svctm I/O 请求的平均服务时间,单位毫秒
    util 一秒钟里面有百分几用于IO操作,如果100%则表示磁盘带宽跑满

方案1 很多服务都需要调用图片微服务获得图片,导致图片微服务的连接数被沾满,导致雪崩.

排查思路:

  1. 微服务配置
# 最大线程数
server.tomat.max-threads=5000
# 最大连接数
server.tomcat.max-connections=20000
# 长链接个数   -1 表示无限制
server.tomcat.max-keep-alive-requests=-1
# 长链接保持时间
server.tomcat.keep-alive-timeout=30000
  1. 查看图片微服务的请求方式,为 httpclient,超时时间选到了300秒,但是linux下只支持到127秒,windows最大只有21秒就返回失败
  2. 编写一个不存在的请求,用jmeter进行压测,看其他服务能否正常使用.
  3. 实际情况测试发现2000请求打到图片微服务,但是其他功能还是可用。

方案2 所有获取图片的接口全部超时,导致其他服务自身拖垮速度,而不是只是等待一个被沾满的图片微服务耗时

  1. 把获取图片的接口直接sleep 20 秒,看其他服务的情况
  2. jmeter 压测 jmeter -n -t JMX文件 -l log.jtl
  3. 查看某个接口的当前连接数,实时刷新 watch -n 时间 'netstat -nat | grep -i "端口号" |wc -l'
  4. 使用 watch -n 0.5 free -g 查看内存使用情况,发现内存全部被消耗光了
  5. 压测接口的时候发现整个服务器内存都被吃光了,批量kill掉服务 jps -l | grep 服务名 | awk '{print $1}' | xargs -I {} kill {}
  6. 重启所有微服务之后,内存还剩下 57G。 判断可能微服务内存分配不当,导致所有微服务内存把服务器内存吃掉, 用 jinfo PID 查看每个微服务的内存使用情况,并且微服务并没有指定 Xms Xmx.查看默认情况
  7. 使用 jvisualVM 监控远程linux服务使用情况 运行 jar包 nohup java -Djava.rmi.server.hostname=LINUX服务器ip -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=JMX端口 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -jar 需要执行的jar包 &

方案3 在测试的时候发现浏览器提示 chrome 等待可用套接字

  1. 所有获取图片的接口全部都需要等待60秒返回,前端的套接字被占用光,导致没有额外的请求可以去获取。导致页面雪崩
  2. 测试情况: 一个页面中有30个地方同时请求图片服务,图片服务直接hold住请求30秒,再返回。访问该页面之后所有页面立马卡主,访问 某接口需要2分钟才返回,但是这个接口我用swagger访问只需要7毫秒。

结论:需要在大量请求的接口不能耗时,否则会消耗前端的连接数。

原因: 这次出现的原因是因为图片访问需要走一个平台,那个平台需要授权token,当时那个平台挂了无限返回 401,代码的逻辑是遇到401就重试2次,每次走的http请求超时时间又是21秒,于是每个获取图片的请求都会被hold住60秒。

Tips: 之前看访问请求都只看 XHR 的time显示多少就以为是多少,但是选择请求之后还有一个 Timeing窗口,可以查看 发现 Connection Start 就花了2分钟。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值