场景: 图片微服务需要请求第三方厂家,第三方厂家挂了之后,导致和图片微服务没有关系的用户管理也变得很慢
排查思路
top -c
查看 cpu 和内存占用 shift+p CPU 排序, shift+m 内存排序, 右上角有一个load average 指标有三个参数,如果 (a+b+c)/3 超过0.6 则表示系统负载有点重uptime
简单的看负载vmstat -n 2 3
查看 cpu信息, 需要查看的信息为
r: 运行和等待CPU 时间片的进程数,等待的数量不能超过总CPU数量的两倍。
b: 等待资源的进程数,比如正在等待的磁盘IO 网络IO
us: 用户进程消耗的cpu时间百分比,长期大于50%需要优化
如果 us + sy > 80% 可能cpu不足
sy:内核进程小号的cpu时间百分比cat /proc/cpuinfo |grep processor | wc -l
查看cpu个数mpstat -P ALL 2
查看所有cpu信息,如果 idle 低于60则表示cpu有压力free -h
内存iostat -xdk 2 3
磁盘io性能评估 .
rkB/s 每秒读取数量 kB
wkB/s 每秒写入数据量 kB
svctm I/O 请求的平均服务时间,单位毫秒
util 一秒钟里面有百分几用于IO操作,如果100%则表示磁盘带宽跑满
方案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
- 查看图片微服务的请求方式,为 httpclient,超时时间选到了300秒,但是linux下只支持到127秒,windows最大只有21秒就返回失败
- 编写一个不存在的请求,用jmeter进行压测,看其他服务能否正常使用.
- 实际情况测试发现2000请求打到图片微服务,但是其他功能还是可用。
方案2 所有获取图片的接口全部超时,导致其他服务自身拖垮速度,而不是只是等待一个被沾满的图片微服务耗时
- 把获取图片的接口直接sleep 20 秒,看其他服务的情况
- jmeter 压测
jmeter -n -t JMX文件 -l log.jtl
, - 查看某个接口的当前连接数,实时刷新
watch -n 时间 'netstat -nat | grep -i "端口号" |wc -l'
- 使用
watch -n 0.5 free -g
查看内存使用情况,发现内存全部被消耗光了 - 压测接口的时候发现整个服务器内存都被吃光了,批量kill掉服务
jps -l | grep 服务名 | awk '{print $1}' | xargs -I {} kill {}
- 重启所有微服务之后,内存还剩下 57G。 判断可能微服务内存分配不当,导致所有微服务内存把服务器内存吃掉, 用
jinfo PID
查看每个微服务的内存使用情况,并且微服务并没有指定 Xms Xmx.查看默认情况 - 使用 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 等待可用套接字
- 所有获取图片的接口全部都需要等待60秒返回,前端的套接字被占用光,导致没有额外的请求可以去获取。导致页面雪崩
- 测试情况: 一个页面中有30个地方同时请求图片服务,图片服务直接hold住请求30秒,再返回。访问该页面之后所有页面立马卡主,访问 某接口需要2分钟才返回,但是这个接口我用swagger访问只需要7毫秒。