pank
V2EX  ›  Java

服务出现 CPU 100%(8 核, 16G)

  •  
  •   pank · Nov 8, 2019 · 7747 views
    This topic created in 2553 days ago, the information mentioned may be changed or developed.

    最近在做服务拆分,把 A 服务中某部分的逻辑抽取到 B 服务,服务间调用采用 http 接口。然后 A 服务出现了 cpu100%的情况。

    发现 A 服务消耗 cpu 最高的有 8 个线程,然后用线程 id 从 jstack 导出的 stack 日志中发现全都是 8 个 GC 的线程,且都是 runable 状态,应该不是 GC 出现的问题。

    继续在 stack 日志中发现了大量线程处于 BLOCKED,且阻塞的部分都是一些类库的部分,比较的杂乱,暂未找到规律。把抽取之前的代码放到同样的环境,没有发现这个问题。有经验的老哥给我一点思路。下面是 stack 日志的一些截图:

    MVtVOO.md.jpg

    MVtemD.md.jpg

    MVtif1.md.jpg

    MVtnTH.md.jpg

    MVtSw4.md.jpg

    MVtPYR.md.jpg

    24 replies  •  2019-11-09 23:49:11 +08:00
    90xchun
    90xchun
    Nov 8, 2019 via iPhone
    1
    你还得用下 pidstat 这个能直接找到那个线程占用的 cpu 资源高,猜是徒劳的
    loongwang
    loongwang
    Nov 8, 2019
    2
    发现 A 服务消耗 cpu 最高的有 8 个线程,然后用线程 id 从 jstack 导出的 stack 日志中发现全都是 8 个 GC 的线程,且都是 runable 状态,应该不是 GC 出现的问题。

    STW 的时候会 block 所有用户线程. 看起来很有可能是 GC 的问题
    pank
    pank
    OP
    Nov 8, 2019
    3
    @loongwang ,但是在抽服务之前没有经过 http 接口调用的时候从来没有发生过这种情况,会不会跟服务间调用的时候频繁的序列化,反序列化对象有关呢
    pank
    pank
    OP
    Nov 8, 2019
    4
    @90xchun,我用 top -p pid -H 已经找到了消耗 cpu 最高的线程,共有 8 个都是 gc 的线程,业务的线程几乎没有怎么消耗 cpu。这个想不明白。
    0NF09LJPS51k57uH
    0NF09LJPS51k57uH
    Nov 8, 2019
    5
    看起来像死锁了
    loongwang
    loongwang
    Nov 8, 2019
    6
    @pank 那就看下 gc 堆信息.
    sagaxu
    sagaxu
    Nov 8, 2019 via Android
    7
    把 gc 日志打出来看看
    kirin
    kirin
    Nov 8, 2019
    8
    https://www.jianshu.com/u/1e1cd4da105c
    可以参考这个排查过程, 看看对你有没有帮助.
    choiwanxy
    choiwanxy
    Nov 8, 2019
    9
    为什么 GC 一直跑呢,要不 dump 一下,看是不是 OOM,看下是不是直动态生成类,加载类导致元空间满了,也会造成 fullGC
    choiwanxy
    choiwanxy
    Nov 8, 2019
    10
    也可以先简单看下堆大小,是不是一直是到了临界值。是的话,当然会一直 GC
    Raymon111111
    Raymon111111
    Nov 8, 2019
    11
    看一下 gc 相关的指标
    pank
    pank
    OP
    Nov 8, 2019
    12
    @loongwang ,头疼😂,启动参数没加 GC 相关的配置。主要是测试环境复现不了,加上去又得在生产上定位发版。
    pank
    pank
    OP
    Nov 8, 2019
    13
    @kirin,感谢回复,不过按照这个定位不出问题,消耗 CPU 最多的是 GC 线程。
    wh520
    wh520
    Nov 8, 2019
    14
    可以看看是不是 http 调用超时,线程数飙升导致的。
    wh520
    wh520
    Nov 8, 2019
    15
    仔细看了下,不是 GC 的问题,毕竟不是 Full GC,应该是 HTTP 连接的问题,可以仔细看看远程调用策略是否有问题。
    Jrue0011
    Jrue0011
    Nov 8, 2019
    16
    用 jmap 看看?
    pank
    pank
    OP
    Nov 8, 2019
    17
    @Jrue0011 ,jmap 导出的 heap 文件有 3.3G ,用 MAT 倒是打开了,一脸懵逼,不会用这东西定位啊😥
    realpg
    realpg
    Nov 8, 2019
    18
    JAVA 啊 一般我都是淘个 2500 元的 24 线程 96G 内存的物理机跑
    wwwzhujibcom
    wwwzhujibcom
    Nov 8, 2019
    19
    被 CC 了吗
    snappyone
    snappyone
    Nov 8, 2019
    20
    jstat -gcutil pid 500 10 看下
    dorothyREN
    dorothyREN
    Nov 8, 2019
    21
    @realpg #18 话说老哥现在还有靠谱点的二手服务器渠道吗
    realpg
    realpg
    Nov 8, 2019
    22
    @dorothyREN #21 万能的淘宝 都是走量的 没有啥不靠谱的
    msg7086
    msg7086
    Nov 9, 2019
    23
    难道是内存吃完了?
    fullerene
    fullerene
    Nov 9, 2019
    24
    @choiwanxy 老哥你好,偶然看到你在有赞面试的时候的那个帖子。我这边有个 api 对接的需求想和你聊下可以么。马化腾:OTQzMjIxNA==
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2894 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 53ms · UTC 12:40 · PVG 20:40 · LAX 04:40 · JFK 07:40
    ♥ Do have faith in what you're doing.