• docker 运行中的容器CPU 莫名其妙使用率升高过百,解决 :Unable to open socket file:


    服务器CPU莫名其妙升高。。。

    通过监控工具查看。CPU达到 733%。。。。

    于是,查找众多资料,发现。

    步骤都差不多。。

    1、进入容器,查看 进程号

    top

    结果如下:看到排第一的进程,拿到pid

    Tasks: 151 total,   1 running, 150 sleeping,   0 stopped,   0 zombie
    %Cpu(s): 17.5 us,  1.6 sy,  0.0 ni, 80.2 id,  0.0 wa,  0.0 hi,  0.8 si,  0.0 st
    KiB Mem : 16265568 total,   182552 free, 12032964 used,  4050052 buff/cache
    KiB Swap:        0 total,        0 free,        0 used.  3893084 avail Mem 
    
      PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                                                                                                 
    25970 root      20   0 8803864   3.1g  13892 S 120.0 19.7  60:57.15 java                                                                                                                                                                    
    15188 root      20   0 4630448   3.1g   9204 S  40.0 19.8 671:05.97 java                                                                                                                                                                    
     1082 root      20   0 1385500  79148   8740 S   6.7  0.5  61:47.84 dockerd                                                                                                                                                                 
        1 root      20   0   43600   3728   2388 S   0.0  0.0   0:03.42 systemd                                                                                                                                                                 
        2 root      20   0       0      0      0 S   0.0  0.0   0:00.00 kthreadd 

    2、使用top -H -p 进程号查看异常线程、查看线程

    top -H -p 25970

    得到如下结果:

    top - 13:07:01 up 2 days, 19:38,  6 users,  load average: 1.87, 1.67, 1.60
    Threads: 252 total,   1 running, 251 sleeping,   0 stopped,   0 zombie
    %Cpu(s): 18.8 us,  1.3 sy,  0.0 ni, 79.2 id,  0.0 wa,  0.0 hi,  0.7 si,  0.0 st
    KiB Mem : 16265568 total,   168684 free, 12043804 used,  4053080 buff/cache
    KiB Swap:        0 total,        0 free,        0 used.  3882576 avail Mem 
    
      PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                                                                                                                                                                  
    26246 root      20   0 8821340   3.1g  13892 R 99.9 19.7  48:16.31 java                                                                                                                                                                     
    26105 root      20   0 8821340   3.1g  13892 S  0.7 19.7   0:10.20 java                                                                                                                                                                     
    26243 root      20   0 8821340   3.1g  13892 S  0.7 19.7   0:07.85 java                                                                                                                                                                     
    26252 root      20   0 8821340   3.1g  13892 S  0.7 19.7   0:07.80 java   

    3、使用printf "%x " 线程号将异常线程号转化为16进制

    printf "%x
    " 26246

    得到如下结果

    [root@iZwz97bb75hzl6vsvx8xb9Z ~]# printf "%x
    " 26246
    6686

    4、使用jstack 进程号|grep 16进制异常线程号 -A90来定位异常代码的位置(最后的-A90是日志行数,也可以输出为文本文件或使用其他数字)。可以看到异常代码的位置。

    jstack 25970|grep 6686 -A90

    得到如下结果:提示:说明本机查看docker容器的线程失败。

    [root@iZwz97bb75hzl6vsvx8xb9Z ~]# jstack 25970|grep 6686 -A90
    25970: Unable to open socket file: target process not responding or HotSpot VM not loaded
    The -F option can be used when the target process is not responding

    总结:不行呀。因为这是docker的容器,在外部无法接入。而在容器内无法处理。因为依赖基础镜像的阉割精简版。

    所以修改依赖基础镜像为完整版。

    #FROM openjdk:8-jre-alpine
    FROM java:8
    .......

    而且需要进入到容器内,才可以操作。于是打包,发布,重复以上步骤。。

    解决:

    docker exec -it my-server bash

    重复以上的各步骤

    然后。

    printf "%x
    " 136
    88
    jstack 8|grep 88 -A90 >/home/soft/881.log
    等待15s
    jstack 8|grep 88 -A90 >/home/soft/882.log 
    等待15s
    jstack
    8|grep 88 -A90 >/home/soft/883.log

    将结果导出到宿主机

    退出容器,

    exit

    docker cp my-server:/tmp/soft .

    最终通过查看快照881,882,883

    查找内容中的 自己的程序代码,并且在状态为RUNNABLE中的记录。最终。找到死循环程序

     java.lang.Thread.State: RUNNABLE

    修复问题,重新发布,问题解决。

  • 相关阅读:
    Xcode 环境下的汇编与 C/C++/ObjC (上)
    OpenGL ES的从地上爬起来,第1部分:
    Accessorizer的使用说明!
    我常用的iphone开发学习网站
    ruby+seleniumwebdriver一步一步完成自动化测试(2)—–一个测试用例
    Selenium Grid深入学习
    Seleniumwebdriver系列教程(14)————为firefox设置代理
    Seleniumwebdriver系列教程(15)————万能的截图
    Selenium Grid
    RSPEC入门学习
  • 原文地址:https://www.cnblogs.com/a393060727/p/13832977.html
Copyright © 2020-2023  润新知