背景:客户反馈说一个ETL任务迁移Oracle数据比较慢,于是远程定位排查。
发现:1:当前迁移的表数量以及表对应的状态均正常,表的数据量均比较大,在千万级别乃至上亿。 查看本产品的监控,发现使用的cpu和内存很少,查看日志日志并无异常日志,查看druid监控 页面可看到正在执行中的sql语句。
于是需要定位是抽取端还是写入端慢。因产品为docker部署,所以,需要进入到容器里面
通过ps -ef | grep java 获取到当前的进程为6,于是通过查看线程名进行过滤,发现抽取端均是warting状态,写入端为runnable状态,故而可以得知为写入端比较慢,因为抽取端一直在等待
查看某个线程更详细的信息可以通过命令进行查看,发现jdbc一直在往oracle中写数据
jstack 6 | grep -A 40 'MT-L-'
最后通过其它方式,判断问题在目标端oracle数据库的资源上。
参考资料:
- jstack命令:教你如何排查多线程问题 https://cloud.tencent.com/developer/article/1080280
- Linux下grep显示前后几行信息 https://cloud.tencent.com/developer/article/1459279
- jstack 官方文档:http://docs.oracle.com/javase/7/docs/technotes/tools/share/jstack.html
- 工具百宝箱(1)— Java日常问题诊断方法 https://www.wangyapu.com/2020/05/05/java_trouble_shooting/