大并发下程序如何排错呢?
下文笔者讲述大并发下程序排错的方法及示例分享,如下所示
大并发下程序排错必须拥有自己的一套完整的方法论,才能完美的解决相应的问题,如下所示 排错思路 + 工具链 + 日志策略 + 监控体系
排错四部法
问题类型 表现 排查方法 接口响应慢 / 超时 TPS 下降、RT 上升 使用 `Arthas` 查看方法耗时、使用 `SkyWalking` 追踪调用链 CPU 使用率高** CPU 达到 90%+ [top]+ `jstack` 抓取线程堆栈,找出占用高的线程 内存泄漏 / OOM GC 频繁、OOM 错误 使用 `jstat`、`MAT` 分析堆内存;开启 `-XX:+HeapDumpOnOutOfMemoryError` 线程池满 / 死锁 / 阻塞 请求堆积、无响应 `jstack` 分析线程状态,查看是否有死锁、等待 数据库瓶颈 SQL 执行慢、连接数爆满 查看慢查询日志、连接池配置、索引是否命中 缓存穿透 / 雪崩 / 击穿 缓存失效后DB压力剧增 加布隆过滤器、设置不同过期时间、集群部署 MQ 积压 / 消费延迟 消息队列堆积严重 查看消费者处理速度、日志、消费失败重试机制 三、核心排查工具推荐
JVM相关工具
工具 | 功能 |
`jps` | 查看 Java 进程 ID |
`jstack <pid>` | 查看线程堆栈信息(排查死锁、阻塞) |
`jstat -gc <pid> 1000` | 查看 GC 情况 |
`jmap -dump:format=b,file=heap.bin <pid>` | 导出堆转储文件,用于 MAT 分析 |
`VisualVM` / `JConsole` | 图形界面查看 JVM 状态 |
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。