应用日志出现明显的内存溢出告警
老年代空间持续占用 99% 以上,FullGC 特别频繁
GC 日志中,每次 GC 剩余的对象持续增加
解决方法:
降低 Timewait delay,减少该状态的数据包积存
增加 KeepAlive 时间,减少 tcp 中断
减少 tcp_max_tw_buckets,让 timewait 快速释放
tcp_abort_on_overflow,开启端口复用
tcp_fin_timeout,增加 fin timeout 超时时间,延迟 timewait 堆积
top,atop,htop,vmstat,mpstat,iostat,pidstat,dstat
通过打印堆栈信息,如果发现两个线程互相持有对方的锁,即为死锁
沟通性能需求。确定业务逻辑和测试的范围,梳理项目架构,确定性能指标,记录各项配置
整理性能方案。明确测试执行的准入和准出,准备测试数据,部署测试环境,测试计划排期
调试性能脚本。调试测试脚本的业务与逻辑,调试压力工具,设计测试场景,调试监听平台
执行测试脚本。执行基准测试和稳定性测试,记录结果数据,对比性能准出,建立性能基线
性能结果调优。根据结果数据分析性能问题,定位问题源头,给出优化方案,调试优化数据
性能报告整理。记录测试结果和优化的过程,对比优化前后,形成数据对比,抄送相关人员
##in 表示系统中断,cs 表示上下文切换 ##
in 高,cs 低,说明 CPU 在不停的请求资源
us 高,cs 低,说明有个进程持续占用 CPU
cs 高,in 低,说明内核在不停的切换进程
sy 高,cs 高,说明程序有大量的系统调用
并发量,响应时间,TPS
通过既定的并发量,测试 TPS 上限,响应时间阈值,资源阈值
通过设计 TPS 容量,测试并发量的上限,做资源扩容
压力机资源不足,压力不能送达服务器
没有保持长连接,TCP 连接频繁中断
TCP 内核存在瓶颈,队列不够或者缓冲区不足
连接池太小,中间件处理不过来
Nginx 负载均衡策略不当,压力分配不均
Redis 瓶颈。hash 未合并,缓存被击穿,单条命令耗时过长
数据库没加索引,db 缓存空间不足
代码故障,list 使用 contain 方法进行遍历去重,线程阻塞或者死锁
jvm 内存分配故障,fullgc 频繁,内存溢出
服务器资源不足,上下文切换过快,中断过高,swap 交换频繁
堆转储,利用 HeapAnalyzer 定位导致内存泄露的对象
网卡中断。网卡和内存交换产生的中断。网卡中断过高导致 cpu 中断频繁,cpu 利用率过低
缺页中断。内存和磁盘交互产生的中断。缺页中断过高导致磁盘交互频繁,磁盘 IO 过高
通过持续负载测试,找到持续加压情况下的 TPS 拐点
丢包率过高
重传率过高
timewait 过高
reset 通知过多
应用的带宽利用率过低
瓶颈:对账户信息查询接口做 1000 并发量下的持续负载,TPS 稳定增加到 1400 左右开始剧烈抖动。当负载量增加到 500 左右,响应时间开始剧烈抖动,TPS 急剧下降,并出现连接超时异常。长连接数维持在 500 左右,和负载量大体相同。失效恢复之后能再次短暂稳定运行一段时间,最终连接数卡在 500 的位置停止处理,Cpu 利用率和数据包的 IO 达到顶点之后急剧下降,接近于 0,系统假死,服务处理彻底中断。通过监听磁盘发现,平均 IO 时间达到了一分钟
原因:调用接口调用都会打印自定义日志,导致磁盘处理缓慢,内核不断地中断去做数据读写。最终 IO 队列阻塞,服务假死
微信 uhz2008,有问题可以问我,不闲聊