V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
pank
V2EX  ›  Java

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

  •  
  •   pank · Nov 8, 2019 · 7109 views
    This topic created in 2376 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
        1
    90xchun  
       Nov 8, 2019 via iPhone
    你还得用下 pidstat 这个能直接找到那个线程占用的 cpu 资源高,猜是徒劳的
    loongwang
        2
    loongwang  
       Nov 8, 2019
    发现 A 服务消耗 cpu 最高的有 8 个线程,然后用线程 id 从 jstack 导出的 stack 日志中发现全都是 8 个 GC 的线程,且都是 runable 状态,应该不是 GC 出现的问题。

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