常见性能问题排查

Posted doupi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了常见性能问题排查相关的知识,希望对你有一定的参考价值。

(1)端口被CLOSE_WAIT占用,重启后过了半天又重现

可以通过tcpdump抓包看看连接状态,分析是否是服务端的FIN packet没有发出去。

正常的关闭流程是:服务端在接收到客户端发送的关闭请求FIN后,会进入CLOSE_WAIT状态,同时发送ACK回去。在完成与客户端直接的通信操作之后,再向客户端发送FIN,进入LAST_ACK状态。
如果连接是CLOSE_WAIT状态,而不是LAST_ACK状态,说明还没有发FIN给Client,那么可能是在关闭连接之前还有许多数据要发送或者其他事要做,导致没有发这个FIN packet。
建议确定关闭请求的四次握手,哪个环节出了问题,再去排查业务代码,可能是由于超时或者异常导致没有正常关闭连接。

(2)抛出异常需要构建异常栈,对异常进行捕获和处理,这个过程比较消耗系统的性能

创建异常对象时会调用父类Throwable的fillInStackTrace()方法生成栈追踪信息,也就是调用native的fillInStackTrace()方法去爬取线程堆栈信息,为运行时栈做一份快照,正是这一部分开销很大.

一般在定义业务异常时可以自己实现自定义异常,继承RuntimeException,然后将writableStackTrace设置为false。
以下是RuntimeException的构造函数:
protected RuntimeException(String message, Throwable cause,
        boolean enableSuppression,
        boolean writableStackTrace) {
    super(message, cause, enableSuppression, writableStackTrace);
}

 

以上是关于常见性能问题排查的主要内容,如果未能解决你的问题,请参考以下文章

Redis常见延迟问题排查手册!附33条优化建议

java性能问题排查提效脚本工具

直播疑难杂症排查— 首开慢

HAWQ技术解析(十八) —— 问题排查

Day660.定位排查应用问题 -Java业务开发常见错误

用HAWQ轻松取代传统数据仓库(十八) —— 问题排查