1:如何判断 java 应用程序内存泄漏?

应用日志出现明显的内存溢出告警

老年代空间持续占用 99% 以上,FullGC 特别频繁

GC 日志中,每次 GC 剩余的对象持续增加

2:描述一下大量 TCP time-wait 的发现及解决方法

windows:dstat --tcp

linux:netstat -na -p tcp| findstr {port} | find /C "TIME"

解决方法:

降低 Timewait delay,减少该状态的数据包积存

增加 KeepAlive 时间,减少 tcp 中断

减少 tcp_max_tw_buckets,让 timewait 快速释放

tcp_abort_on_overflow,开启端口复用

tcp_fin_timeout,增加 fin timeout 超时时间,延迟 timewait 堆积

3:列举出 5 种以上服务器资源监控的命令或工具

top,atop,htop,vmstat,mpstat,iostat,pidstat,dstat

4:如何定位应用线程死锁

通过打印堆栈信息,如果发现两个线程互相持有对方的锁,即为死锁

5:客户交付一个性能测试项目,请阐述你的实施流程

沟通性能需求。确定业务逻辑和测试的范围,梳理项目架构,确定性能指标,记录各项配置

整理性能方案。明确测试执行的准入和准出,准备测试数据,部署测试环境,测试计划排期

调试性能脚本。调试测试脚本的业务与逻辑,调试压力工具,设计测试场景,调试监听平台

执行测试脚本。执行基准测试和稳定性测试,记录结果数据,对比性能准出,建立性能基线

性能结果调优。根据结果数据分析性能问题,定位问题源头,给出优化方案,调试优化数据

性能报告整理。记录测试结果和优化的过程,对比优化前后,形成数据对比,抄送相关人员

6:vmstat 中 in、cs 字段值怎么判断性能瓶颈?

##in 表示系统中断,cs 表示上下文切换 ##

in 高,cs 低,说明 CPU 在不停的请求资源

us 高,cs 低,说明有个进程持续占用 CPU

cs 高,in 低,说明内核在不停的切换进程

sy 高,cs 高,说明程序有大量的系统调用

7:你做过的性能测试项目性能测试指标是什么,哪些指标体现了应用的处理能力?

并发量,响应时间,TPS

通过既定的并发量,测试 TPS 上限,响应时间阈值,资源阈值

通过设计 TPS 容量,测试并发量的上限,做资源扩容

8:性能测试中 tps 如果上不去原因有哪些?

压力机资源不足,压力不能送达服务器

没有保持长连接,TCP 连接频繁中断

TCP 内核存在瓶颈,队列不够或者缓冲区不足

连接池太小,中间件处理不过来

Nginx 负载均衡策略不当,压力分配不均

Redis 瓶颈。hash 未合并,缓存被击穿,单条命令耗时过长

数据库没加索引,db 缓存空间不足

代码故障,list 使用 contain 方法进行遍历去重,线程阻塞或者死锁

jvm 内存分配故障,fullgc 频繁,内存溢出

服务器资源不足,上下文切换过快,中断过高,swap 交换频繁

9:如何定位 java 应用程序哪些对象引起内存泄露?

堆转储,利用 HeapAnalyzer 定位导致内存泄露的对象

10:简述 linux 系统 2 种中断机制和 2 种上下文切换方式以及对性能的影响?

网卡中断。网卡和内存交换产生的中断。网卡中断过高导致 cpu 中断频繁,cpu 利用率过低

缺页中断。内存和磁盘交互产生的中断。缺页中断过高导致磁盘交互频繁,磁盘 IO 过高

11:如何判断应用的最大处理能力?

通过持续负载测试,找到持续加压情况下的 TPS 拐点

12:如何判断网络瓶颈

丢包率过高
重传率过高
timewait 过高
reset 通知过多
应用的带宽利用率过低

13:你做过的性能测试项目最大处理能力是多少,出现了什么瓶颈?

瓶颈:对账户信息查询接口做 1000 并发量下的持续负载,TPS 稳定增加到 1400 左右开始剧烈抖动。当负载量增加到 500 左右,响应时间开始剧烈抖动,TPS 急剧下降,并出现连接超时异常。长连接数维持在 500 左右,和负载量大体相同。失效恢复之后能再次短暂稳定运行一段时间,最终连接数卡在 500 的位置停止处理,Cpu 利用率和数据包的 IO 达到顶点之后急剧下降,接近于 0,系统假死,服务处理彻底中断。通过监听磁盘发现,平均 IO 时间达到了一分钟
原因:调用接口调用都会打印自定义日志,导致磁盘处理缓慢,内核不断地中断去做数据读写。最终 IO 队列阻塞,服务假死

微信 uhz2008,有问题可以问我,不闲聊


↙↙↙阅读原文可查看相关链接,并与作者交流