大家好,我们生产系统上面现在有一个接口,这个接口里面的代码有的时候运行很慢,后来我把代码分成了好几段,每段代码前后都加了开始时间和结束时间。今天下午 2020/4/7 14:48:00 的时候,运维找我说又发现客户调了这个接口,我们 9 秒才返回结果。我去生产上把日志下载下来,发现在 2020/4/7 14:25:22 的时候,有一段很普通的 JAVA 代码(就是从一个对象上面调 get 方法,获取数据,不涉及 SQL 和多线程)确实运行了 9 秒。然后,我用同样的参数又调了一下那接口,400 毫秒就返回了。邪门的是,并不是每次慢都是这段代码,有的时候是另外一段,有的时候又是另外一段代码。请问这种情况,你们是怎么分析问题并解决问题的?难道这种问题就解决不了吗?这种情况发生的不是太频繁,几乎 1 到 2 周会发生一次。我个人分析如下:1 、肯定不是 JAVA 代码的问题,因为这些代码都很简单,很普通。也不是数据库的问题。更不是网络的问题,因为就是那段普通 JAVA 代码运行了 9 秒。2 、既然不是 JAVA 代码和数据库、网络的问题,那么有可能是 JVM 的问题或者服务器的 CPU 或者 IO 的问题。现在我就是要找代码慢的那个时刻的 JVM 的概况和当时服务器 CPU 或者 IO 的概况。我想在代码中把 JVM 当时的堆栈内存情况打印出来。还有把当时服务器的 CPU 和 IO 概况也打印出来。不知道这样做是否可行?各位 JAVA 大神给支点大招,谢谢各位大神。
1 ic2y 2020-04-08 09:03:39 +08:00 1.你的问题的格式 看起来 很乱,没有分行? 2.如果是这种奇怪的问题,你得贴代码,还有平台、jdk 版本;只描述信息,没人看得懂 |
![]() | 2 redford42 2020-04-08 09:08:08 +08:00 ![]() 蹲点一下看走近科学结局 |
![]() | 3 cheng6563 2020-04-08 09:08:35 +08:00 via Android 是不是开了 swap 内存不足了 |
![]() | 4 Aresxue 2020-04-08 09:11:47 +08:00 jstack 看线程,打印什么的不靠谱,不一定是业务线程。我这就遇到过很多其他处理阻塞主程的操作, 比如日志输出(输出流重定向到 kafka )因为用的第三方库不够健壮一步发送 kafka 消息阻塞了业务线程。 |
![]() | 5 madizmChou 2020-04-08 09:12:28 +08:00 多大的对象 |
![]() | 6 Aresxue 2020-04-08 09:13:09 +08:00 条件允许直接上 arthas,把你整个函数切成片分析 |
![]() | 7 VoidChen 2020-04-08 09:13:20 +08:00 我觉得是可能是资源占用问题,可以排查下服务器上部署了哪些组件,重点关注那些数据库或者搜索引擎,像 redis 或者 es 那种 |
![]() | 8 TMaize 2020-04-08 09:13:34 +08:00 via Android 代码里面有没有用生成随机数的相关函数 |
9 micean 2020-04-08 09:22:06 +08:00 这种第一次慢,后面恢复正常的情况都是网络 IO 连接池假连接造成的 |
![]() | 10 sagaxu 2020-04-08 09:22:54 +08:00 via Android 没有 gc 日志? fgc 叠加 swap 能卡几十秒,在内存 32G,剩余 20G 以上的情况下。 |
![]() | 11 arthas2234 2020-04-08 09:28:18 +08:00 码字的时候能不能,分一下段落 |
![]() | 12 fzhyzamt 2020-04-08 09:34:24 +08:00 你这什么条件都没,只能靠猜啊 1. gc 2. 插的桩有问题 3. 那个对象是个代理,实际上是 IO 4. 机器卡死 5. 拿不到 CPU |
13 sampeng 2020-04-08 09:52:32 +08:00 via iPhone ![]() 监控都没,这不叫分析,这叫蒙 |
14 nicevar 2020-04-08 10:02:50 +08:00 ![]() 就你这个描述,James Gosling 来了也跟我在同一水平线上。。。 问题不是出在语言上,可能出在环境或资源占用上 |
15 sherlockJuan 2020-04-08 10:07:49 +08:00 手写 JDBCTemplate,压测试试,之前我们碰到过类似的问题,发现是有些类没管理好,访问量一上去,总是会重新创建对象,就变慢了 |
16 nanguaboy 2020-04-08 10:12:22 +08:00 ![]() 我猜一下,可能是随机数的原因 |
17 thoreyunpeng 2020-04-08 10:14:25 +08:00 是不是 FGC 了 记录时间看 GCLog 吧 |
![]() | 18 shenlanAZ 2020-04-08 10:22:48 +08:00 你这是在写日记 |
![]() | 19 MOETAN0 2020-04-08 10:24:37 +08:00 建议先做这 2 个事情: 1,开启 jvm 的 GC 详细日志 2,使用 nmon 等 linux 性能监控工具记录服务器运行性能指标 |
![]() | 20 haoz1w0w 2020-04-08 10:27:26 +08:00 盲猜随机数 |
![]() | 21 rockyou12 2020-04-08 10:36:53 +08:00 如果只在 linux 环境出问题,还真的很可能是系统的随机数生成的问题 |
22 Jooooooooo 2020-04-08 10:57:13 +08:00 重新提问吧 |
![]() | 23 purensong 2020-04-08 11:14:19 +08:00 ![]() 你这个提问没个分段,看不下去,不知道怎么这么多人评论的,我用心排版的帖就没几个人回复 |
![]() | 24 raymanr 2020-04-08 11:19:42 +08:00 我自己的一点个人经验, 我的电脑突然很卡的时候... 多半就是电脑散热底座的风扇接触不良没转了 和代码不一定有关系 |
![]() | 25 itechify PRO 感谢楼上大佬们,涨了新姿势,随机数生成会导致系统出问题 |
26 crazyq 2020-04-08 11:53:34 +08:00 大佬们,为什么 Linux 将环境下随机数生成会导致系统慢呢。。 |
![]() | 27 cobola 2020-04-08 12:13:58 +08:00 这种情况下 关机重启下就好了 |
![]() | 28 no1xsyzy 2020-04-08 12:16:07 +08:00 |
![]() | 30 purensong 2020-04-08 13:58:36 +08:00 @no1xsyzy 好的,感谢回访。发帖确实不多,一般都习惯看别人的,段落组织我觉得没必要八股文吧。 表达清楚就可以了,off-topic 也只是片言,又不是官方发文需要字斟句酌。 |
![]() | 31 no1xsyzy 2020-04-08 14:07:45 +08:00 @purensong #30 并不是八股,而是方便别人看,或者说这样自顶向下说更容易让地球人理解。 off-topic 三两句还好,你这太多了,导致别人根本不知道你想表达什么,distraction 。 |
![]() | 32 wozhizui 2020-04-08 14:27:49 +08:00 推荐可以往 jvm 调优的方向考虑,是不是系统的 class 很多。如果确定不是代码的问题,就从磁盘 io 、网络 io 方向考虑,排除后再考虑 jvm 调优,很有可能是 jvm 的内存管理的问题。 毕竟如果是代码问题,能很容易看出来,复杂度大 O 啥的,很明显。 |
33 lff0305 2020-04-08 15:24:14 +08:00 @crazyq linux java 默认调用的随机数生成器要从硬件操作(比如网络,磁盘读写)来构造. 在某些环境尤其是虚拟机,这个随机数生成的速度很慢,造成所有调用 java SecureRandom 的地方阻塞住(等待随机数). 解决方法: 用-D 指定老式的种子 /数学运算来生成的伪随机数. |
34 lff0305 2020-04-08 15:25:48 +08:00 添加 printGC log 的参数重新试试 看看是不是出问题的时候 stop the world 了 |
![]() | 35 colincat 2020-04-08 15:36:35 +08:00 arthas 拿这个工具去看看就知道了 |
![]() | 36 index90 2020-04-08 15:55:31 +08:00 估计是 stop the world 了 |
37 fewok 2020-04-08 16:27:24 +08:00 Thread.sleep(9000) 挺简单代码,为啥需要执行 9 秒呢?? |
38 yamasa 2020-04-08 17:29:14 +08:00 我一直觉得好的排版是学会提问的第一步。还是先 jstack jmap 和 gc 日志三步走起来看看吧。最好顺带把 jvm 在问题现场期间的 cpu 和 io 都 profile 一下看看 |
![]() | 39 HolmLoh 2020-04-08 17:39:29 +08:00 你有没有看过是否发生了 full gc |
40 Chinsung 2020-04-08 17:52:18 +08:00 1.看一下 gc 日志,可能是当时发生了 full gc 。 2.同一台宿主机上有没有其他服务在运行,可能是资源抢占导致的。 |
41 z3jjlzt 2020-04-08 19:23:00 +08:00 大概率 fjc 了 |
![]() | 42 RipL 2020-04-08 20:05:58 +08:00 1.加 gc 日志,2. 接入 amp 工具,查看接口当时的 cpu 内存 jvm 等情况 |
44 zhangjiayi1095 2020-04-09 14:53:05 +08:00 arthas 看看这个方法的运行状态,到底是哪里慢 |