问题解决:neo4j内存不够,导致cpu一直100%,利用arthas最终解决

    前几天使用公司的产品sati,将前段时间爬取的数据导入neo4j数据库。发现导入的时候数据一直在导入,一度以为sati出问题了。考虑了一下会不会是自己的neo4j数据库有问题,所以就排查了一下,果然是neo4j的问题。在这里记录一下吧。

一、使用top命令定位

    1.top查看自己进程发现一个java进程cpu使用率到达100%。记录进程pid(此时第一感觉是full gc)
    2.top -Hp pid命令定位到线程pid
    3.printf "%x\n" 线程pid 将十进制的id转换为16进制。

二、利用jstack打印堆栈信息

    1.jstack pid > xxx.dump 将堆栈信息打印到xxx.dump
    2.gedit xxx.dump 然后定位到16进制的线程id。发现是一个neo4j线程,不是gc进程。我傻了,想了一下,可以用阿里神器arthas,动态查看下线程情况,看下怎么回事。

 三、利用arthas动态查看堆栈

    1.java -jar arthas-boot.jar 启动arthas
    2.选择对应的java进程,发现有个neo4j的,肯定就是你了。
    3.dashboard命令动态观察了一下情况,发现在gc区年轻代中eden区的大小在疯狂变化。突然反应过来!!我在做数据抽取,把大量的数据写入neo4j,neo4j运行在jvm上,发现eden区只有633M总量。年轻代用的是并行收集器和G1配合,导致这里空间不足一直做young gc。
    4. vim neo4j.conf 查看配置情况,发现最小堆和最大堆都只有1g大小,这是自己刚使用neo4j时留下的,那个时候简单配了下。立刻调到10g,重新做数据抽取。进程不再100%,最多看到83%,几十秒下来数据也抽取完了。问题解决,开心!!!

四、总结

    出现问题不要慌张,利用所学的东西,一步一步排查就好。善用各种排查工具,另外arthas真好玩。
全部评论

相关推荐

1 收藏 评论
分享
牛客网
牛客企业服务