精华内容
下载资源
问答
  • 从创建进程到占用cpu的过程
    千次阅读
    2021-05-13 08:58:03

    1、用top命令指定固定的PID

    top -p 10997

    7ec1c3ef031816bca844b84052452daf.png

    查询指定进程的PID

    ps -ef | grep zookeeper

    jim 10997 1959 0 12月14 pts/2 00:00:01 /usr/lib/jvm/java-8-oracle/bin/java -Dzookeeper.log.dir=. -Dzookeeper.root.logger=INFO,CONSOLE -cp /home/jim/opt/zookeeper-3.4.9/bin/../build/classes:/home/jim/opt/zookeeper-3.4.9/bin/../build/lib/*.jar:/home/jim/opt/zookeeper-3.4.9/bin/../lib/slf4j-log4j12-1.6.1.jar:/home/jim/opt/zookeeper-3.4.9/bin/../lib/slf4j-api-1.6.1.jar:/home/jim/opt/zookeeper-3.4.9/bin/../lib/netty-3.10.5.Final.jar:/home/jim/opt/zookeeper-3.4.9/bin/../lib/log4j-1.2.16.jar:/home/jim/opt/zookeeper-3.4.9/bin/../lib/jline-0.9.94.jar:/home/jim/opt/zookeeper-3.4.9/bin/../zookeeper-3.4.9.jar:/home/jim/opt/zookeeper-3.4.9/bin/../src/java/lib/*.jar:/home/jim/opt/zookeeper-3.4.9/bin/../conf: -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.local.only=false org.apache.zookeeper.server.quorum.QuorumPeerMain /home/jim/opt/zookeeper-3.4.9/bin/../conf/zoo.cfg

    2、使用ps查询指定进程名或者PID的占用情况

    ps -aux | grep zookeeper

    ps -aux | grep 2181

    jim 10997 0.0 0.1 11522940 65176 pts/2 Sl 12月14 0:01 /usr/lib/jvm/java-8-oracle/bin/java -Dzookeeper.log.dir=. -Dzookeeper.root.logger=INFO,CONSOLE -cp /home/jim/opt/zookeeper-3.4.9/bin/../build/classes:/home/jim/opt/zookeeper-3.4.9/bin/../build/lib/*.jar:/home/jim/opt/zookeeper-3.4.9/bin/../lib/slf4j-log4j12-1.6.1.jar:/home/jim/opt/zookeeper-3.4.9/bin/../lib/slf4j-api-1.6.1.jar:/home/jim/opt/zookeeper-3.4.9/bin/../lib/netty-3.10.5.Final.jar:/home/jim/opt/zookeeper-3.4.9/bin/../lib/log4j-1.2.16.jar:/home/jim/opt/zookeeper-3.4.9/bin/../lib/jline-0.9.94.jar:/home/jim/opt/zookeeper-3.4.9/bin/../zookeeper-3.4.9.jar:/home/jim/opt/zookeeper-3.4.9/bin/../src/java/lib/*.jar:/home/jim/opt/zookeeper-3.4.9/bin/../conf: -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.local.only=false org.apache.zookeeper.server.quorum.QuorumPeerMain /home/jim/opt/zookeeper-3.4.9/bin/../conf/zoo.cfg

    10997为PID

    0.0为CPU占用百分比(注意:如果有两个CPU,32核64线程,那么总占比是6400%)

    0.1为内存占用百分比

    3、查看更详细的内存占比

    cat /proc/10997/status

    Name: java

    State: S (sleeping)

    Tgid: 10997

    Ngid: 0

    Pid: 10997

    PPid: 1959

    TracerPid: 0

    Uid: 1000 1000 1000 1000

    Gid: 1000 1000 1000 1000

    FDSize: 256

    Groups: 4 24 27 30 46 113 128 130 132 134 1000 1002

    NStgid: 10997

    NSpid: 10997

    NSpgid: 10987

    NSsid: 10914

    VmPeak: 11522940 kB

    VmSize: 11522940 kB

    VmLck: 0 kB

    VmPin: 0 kB

    VmHWM: 65176 kB

    VmRSS:65176kB

    VmData: 11462972 kB

    VmStk: 140 kB

    VmExe: 4 kB

    VmLib: 17064 kB

    VmPTE: 460 kB

    VmPMD: 28 kB

    VmSwap: 0 kB

    HugetlbPages: 0 kB

    Threads: 25

    SigQ: 0/128292

    SigPnd: 0000000000000000

    ShdPnd: 0000000000000000

    SigBlk: 0000000000000000

    SigIgn: 0000000000000003

    SigCgt: 2000000181005ccc

    CapInh: 0000000000000000

    CapPrm: 0000000000000000

    CapEff: 0000000000000000

    CapBnd: 0000003fffffffff

    CapAmb: 0000000000000000

    Seccomp: 0

    Cpus_allowed: ff

    Cpus_allowed_list: 0-7

    Mems_allowed: 00000000,00000001

    Mems_allowed_list: 0

    voluntary_ctxt_switches: 86

    nonvoluntary_ctxt_switches: 2

    VmRSS为内存

    Linux下查看哪些进程占用的CPU、内存资源

    1.CPU占用最多的前10个进程: ps auxw|head -1;ps auxw|sort -rn -k3|head -10 2.内存消耗最多的前10个进程 ps auxw|head -1;ps a ...

    Linux下如何查看哪些进程占用的CPU内存资源最多

    linux下获取占用CPU资源最多的10个进程,可以使用如下命令组合: ps aux|head -1;ps aux|grep -v PID|sort -rn -k +3|head linux下获取占用 ...

    linux下查看哪个进程占用内存多

    1.用top命令 1.top top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器 可以直接使用top命令后,查看%MEM的内容.可以 ...

    Linux下查看某个进程打开的文件数-losf工具常用参数介绍

    Linux下查看某个进程打开的文件数-losf工具常用参数介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在linux操作系统中,一切皆文件.通过文件不仅仅可以访问常规数据,还 ...

    linux下查看当前进程以及杀死进程

    ###linux下查看当前进程以及杀死进程 查看进程 ps命令查找与进程相关的PID号: ps a :显示现行终端机下的所有程序,包括其他用户的程序. ps -A :显示所有程序. ps c :列出程 ...

    [转] linux 下查看一个进程运行路径的方法

    http://blog.csdn.net/brioxu/article/details/5104736 在linux下查看进程大家都会想到用 ps -ef|grep XXX ps -aux | hea ...

    linux 下查看java进程

    linux下查看出问题的java进程,便于发现程序问题.命令如下: 找到存在问题的java进程号,ps -ef|grep java ,如进程30021 卡住,需要查看该进程信息,那么敲入命令: jst ...

    linux 下查看一个进程执行路径

    在linux下查看进程大家都会想到用 ps -ef|grep XXX 但是看到的不是全路径.怎么看全路径呢? 每一个进程启动之后在 /proc以下有一个于pid相应的路径 比如:ps -ef|grep ...

    linux下查找java进程占用CPU过高原因

    1. 查找进程 top查看进程占用资源情况 明显看出java的两个进程22714,12406占用过高cpu.   2.查找线程 使用top -H -p 查看线程占用情况   3. ...

    随机推荐

    一场属于HTML5守望者的盛宴——记图灵参加HTML5峰会

    2013年8月,北京正是一个火热的季节.一场火热的盛会,HTML5 峰会如约来袭.这是一场属于 HTML5 守望者的盛宴!HTML5作为一项新兴的技术,其未来是光明的,但是道路却是曲折的.需要标准的不 ...

    C++的优秀特性4:指针

    (转载请注明原创于潘多拉盒子) 其实指针不是C++的特性,而是地地道道的C的特性.有人说C++继承了C的指针,实在是败笔,造成内存泄漏云云,纯粹是不懂.可以这么说,如果没有指针,C++会逊色很多,应用 ...

    link@import

    1.两者区别 1)link属于XHTML标签,而@import是CSS提供的;2)页面被加载的时,link会同时被加载,而@import引用的CSS会等到页面被加载完再加载; 3)import只在IE ...

    ContextLoaderListener初始化的前后文和DispatcherServlet初始化的上下文关系

    ContextLoaderListener初始化的上下文加载的Bean是对于整个应用程序共享的,不管是使用什么表现层技术,一般如DAO层.Service层Bean: DispatcherServlet ...

    Docker容器命令

    ★根本前提:本地主机有镜像才能创建容器 ⒈docker run [Options] 镜像名称或镜像ID [Command] [Arg...] 用途:利用镜像创建容器实例 Options说明(常用):注 ...

    First 1

    一,Python介绍 1,python的出生与应用 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆(中文名字:龟叔)为了在阿姆斯特丹打 ...

    vs 15 key

    vs 15 Key :HM6NR-QXX7C-DFW2Y-8B82K-WTYJV vs 15 Key :2XNFG-KFHR8-QV3CP-3W6HT-683CH

    P4001 [BJOI2006]狼抓兔子(对偶图)

    P4001 [BJOI2006]狼抓兔子 最短路+对偶图 看这题最容易想到的就是网络流.Dinic可以过,据说还跑得比正解快. 如果不写网络流,那么需要知道2个前置知识:平面图和对偶图(右转baidu ...

    如何查找文件中的schema约束

    1.下载一个spring3.2的jar和source 然后打开source的文件(路径:\spring-framework-3.2.5.RELEASE\docs\spring-framework-re ...

    更多相关内容
  • linux查看各进程占用cpu/内存情况

    万次阅读 多人点赞 2021-07-01 14:16:39
    如果是这种情况,那么最好的办法是识别出 Linux 机器上消耗过多内存的进程。 一、ps、top命令: ps 和 top 命令常用来查看Linux系统进程相关信息。 ps命令:可以查看进程的瞬间信息。 top命令:可以持续的监视...

         

    目录

    一、ps、top命令:

    1、ps命令

    1.1 语法 :

    1.2、使用场景

    2、top命令

    1、语法:

    2、top命令内容说明:

    3、top命令使用过程中的交互的命令

    二、排序进程

    1、复杂方法

    2、简单方法:


     很多时候,你可能遇见过系统消耗了过多的内存。如果是这种情况,那么最好的办法是识别出 Linux 机器上消耗过多内存的进程。

    一、ps、top命令:

    ps 和 top 命令常用来查看Linux系统进程相关信息。

    ps命令:可以查看进程的瞬间信息。

    top命令:可以持续的监视进程的信息。

    1、ps命令

           ps命令用于报告当前系统的进程状态。可以搭配kill指令随时中断、删除不必要的程序。ps命令是最基本同时也是非常强大的进程查看命令,使用该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵死、哪些进程占用了过多的资源等等,总之大部分信息都是可以通过执行该命令得到的。

    1.1 语法 :

      ps (选项)

    选项描述
    -a显示所有终端机下执行的程序,除了阶段作业领导者之外。
    a显示现行终端机下的所有程序,包括其他用户的程序。
    -A显示所有程序。
    -c显示CLS和PRI栏位。
    c列出程序时,显示每个程序真正的指令名称,而不包含路径,选项或常驻服务的标示。
    -C<指令名称>指定执行指令的名称,并列出该指令的程序的状况。
    -d显示所有程序,但不包括阶段作业领导者的程序。
    -e此选项的效果和指定"A"选项相同。
    e列出程序时,显示每个程序所使用的环境变量。
    -f显示UID,PPIP,C与STIME栏位。
    f用ASCII字符显示树状结构,表达程序间的相互关系。
    -g<群组名称>此选项的效果和指定"-G"选项相同,当亦能使用阶段作业领导者的名称来指定。
    g显示现行终端机下的所有程序,包括群组领导者的程序。
    -G<群组识别码>列出属于该群组的程序的状况,也可使用群组名称来指定。
    h不显示标题列。
    -H显示树状结构,表示程序间的相互关系。
    -j或j采用工作控制的格式显示程序状况。
    -l或l采用详细的格式来显示程序状况。
    L列出栏位的相关信息。
    -m或m显示所有的执行绪。
    n以数字来表示USER和WCHAN栏位。
    -N显示所有的程序,除了执行ps指令终端机下的程序之外。
    -p<程序识别码>指定程序识别码,并列出该程序的状况。
    p<程序识别码>此选项的效果和指定"-p"选项相同,只在列表格式方面稍有差异。
    r只列出现行终端机正在执行中的程序。
    -s<阶段作业>指定阶段作业的程序识别码,并列出隶属该阶段作业的程序的状况。
    s采用程序信号的格式显示程序状况。
    S列出程序时,包括已中断的子程序资料。
    -t<终端机编号>指定终端机编号,并列出属于该终端机的程序的状况。
    t<终端机编号>此选项的效果和指定"-t"选项相同,只在列表格式方面稍有差异。
    -T显示现行终端机下的所有程序。
    -u<用户识别码>此选项的效果和指定"-U"选项相同。
    u以用户为主的格式来显示程序状况。
    -U<用户识别码>列出属于该用户的程序的状况,也可使用用户名称来指定。
    U<用户名称>列出属于该用户的程序的状况。
    v采用虚拟内存的格式显示程序状况。
    -V或V显示版本信息。
    -w或w采用宽阔的格式来显示程序状况。
    x显示所有程序,不以终端机来区分。
    X采用旧式的Linux i386登陆格式显示程序状况。
    -y配合选项"-l"使用时,不显示F(flag)栏位,并以RSS栏位取代ADDR栏位 。
    -<程序识别码>此选项的效果和指定"p"选项相同。
    –cols<每列字符数>设置每列的最大字符数。
    –columns<每列字符数>此选项的效果和指定"–cols"选项相同。
    –cumulative此选项的效果和指定"S"选项相同。
    –deselect此选项的效果和指定"-N"选项相同。
    –forest此选项的效果和指定"f"选项相同。
    –headers重复显示标题列。
    –help在线帮助。
    –info显示排错信息。
    –lines<显示列数>设置显示画面的列数。
    –no-headers此选项的效果和指定"h"选项相同,只在列表格式方面稍有差异。
    –group<群组名称>此选项的效果和指定"-G"选项相同。
    –Group<群组识别码>此选项的效果和指定"-G"选项相同。
    –pid<程序识别码>此选项的效果和指定"-p"选项相同。
    –rows<显示列数>此选项的效果和指定"–lines"选项相同。
    –sid<阶段作业>此选项的效果和指定"-s"选项相同。
    –tty<终端机编号>此选项的效果和指定"-t"选项相同。
    –user<用户名称>此选项的效果和指定"-U"选项相同。
    –User<用户识别码>此选项的效果和指定"-U"选项相同。
    –version此选项的效果和指定"-V"选项相同。
    –widty<每列字符数>此选项的效果和指定"-cols"选项相同



    1.2、使用场景

    ps -ef         #显示所有当前进程
    ps aux         #显示所有当前进程
    ps -ax         #显示所有当前进程
    ps -u pungki   #根据用户过滤进程
    ps -aux --sort -pcpu | less #根据 CPU 使用来升序排序
    ps -aux --sort -pmem | less #根据用户过滤进程
    ps -aux --sort -pcpu,+pmem | head -n 10 #查询全10个使用cpu和内存最高的应用
    ps -C getty    #通过进程名和PID过滤
    ps -f -C getty #带格式显示的,通过进程名和PID过滤
    ps -L 1213     #根据线程来过滤进程
    ps -axjf(或pstree)   #树形显示进程
    ps -eo pid,user,args  # 显示安全信息
    ps -U root -u root u  #格式化输出 root 用户(真实的或有效的UID)创建的进程

    2、top命令

           top命令用来显示执行中的程序进程,使用权限是所有用户。

    1、语法:

     格式  :

         top [-] [d delay] [q] [c] [S] [s] [i] [n]

    主要参数:
    d:指定更新的间隔,以秒计算。
    q:没有任何延迟的更新。如果使用者有超级用户,则top命令将会以最高的优先序执行。
    c:显示进程完整的路径与名称。
    S:累积模式,会将己完成或消失的子行程的CPU时间累积起来。
    s:安全模式。
    i:不显示任何闲置(Idle)或无用(Zombie)的行程。
    n:显示更新的次数,完成后将会退出top。

    2、top命令内容说明:

    在上图中:

    第一行表示的项目依次为当前时间、系统启动时间、当前系统登录用户数目、平均负载。

    第二行显示的是所有启动的进程、目前运行的、挂起(Sleeping)的和无用(Zombie)的进程。

    第三行显示的是目前CPU的使用情况,包括系统占用的比例、用户使用比例、闲置(Idle)比例。

    第四行显示物理内存的使用情况,包括总的可以使用的内存、已用内存、空闲内存、缓冲区占用的内存。

    第五行显示交换分区使用情况,包括总的交换分区、使用的、空闲的和用于高速缓存的大小。

    第六行显示的项目最多,下面列出了详细解释。

    PID         进程id
    USER        进程所有者
    PR          进程优先级
    NI          nice值。负值表示高优先级,正值表示低优先级
    VIRT        进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
    RES         进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
    SHR         共享内存大小,单位kb
    S           进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程,N表示该进程优先 
                值是负数。
    %CPU        上次更新到现在的CPU时间占用百分比
    %MEM        进程使用的物理内存百分比
    TIME+       进程使用的CPU时间总计,单位1/100秒
    COMMAND     进程名称(命令名/命令行)

    3、top命令使用过程中的交互的命令

        top命令使用过程中,还可以使用一些交互的命令来完成其它参数的功能。这些命令是通过快捷键启动的。
    <空格>:立刻刷新。
    P:根据CPU使用大小进行排序。
    T:根据时间、累计时间排序。
    q:退出top命令。
    m:切换显示内存信息。
    t:切换显示进程和CPU状态信息。
    c:切换显示命令名称和完整命令行。
    M:根据使用内存大小进行排序。
    W:将当前设置写入~/.toprc文件中。这是写top配置文件的推荐方法。

    可以看到,top命令是一个功能十分强大的监控系统的工具,对于系统管理员而言尤其重要。但是,它的缺点是会消耗很多系统资源。

    二、排序进程

    1、复杂方法

    linux下获取占用CPU资源最多的10个进程,可以使用如下命令组合:

    ps aux|head -1;ps aux|sort -rn -k +3|head

    linux下获取占用内存资源最多的10个进程,可以使用如下命令组合:

    ps aux|head -1;ps aux|sort -rn -k +4|head

      head 默认获取10行,可以在后面加 -n 控制显示数量,如获取三行

       ps aux|head -1;ps aux|sort -rn -k +3|head -3

    该命令组合实际上是下面两句命令:

    ps aux|head -1

         主要是为了获取标题(USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND)

    ps aux|sort -rn -k +3|head
         sort -rn -k +3该命令中的-rn的r表示是结果倒序排列,n为以数值大小排序,而-k +3则是针对第3列的内容进行排序,第三列是 cpu,第四列是内存,再使用head命令获取默认前10行数据。(其中的|表示管道操作)

    2、简单方法:

       top

    展开全文
  • Tomcat进程占用CPU过高怎么办?

    千次阅读 多人点赞 2021-08-01 21:57:18
    代码Bug创建了大量的线程,导致CPU频繁上下文切换 通常所说的CPU使用率过高,隐含着一个用来比较高与低的基准值,比如 JVM在峰值负载下的平均CPU利用率40% CPU使用率飙80%就可认为不正常 JVM进程包含多个Java...

    CPU经常会成为系统性能的瓶颈,可能:

    • 内存泄露导致频繁GC,进而引起CPU使用率过高
    • 代码Bug创建了大量的线程,导致CPU频繁上下文切换

    通常所说的CPU使用率过高,隐含着一个用来比较高与低的基准值,比如

    • JVM在峰值负载下的平均CPU利用率40%
    • CPU使用率飙到80%就可认为不正常

    JVM进程包含多个Java线程:

    • 一些在等待工作
    • 另一些则正在执行任务

    最重要的是找到哪些线程在消耗CPU,通过线程栈定位到问题代码
    如果没有找到个别线程的CPU使用率特别高,考虑是否线程上下文切换导致了CPU使用率过高。

    案例

    程序模拟CPU使用率过高 - 在线程池中创建4096个线程

    在Linux环境下启动程序:
    java -Xss256k -jar demo-0.0.1-SNAPSHOT.jar
    线程栈大小指定为256KB。对于测试程序来说,操作系统默认值8192KB过大,因为需要创建4096个线程。

    使用top命令,我们看到Java进程的CPU使用率达到了961.6%,注意到进程ID是55790。

    用更精细化的top命令查看这个Java进程中各线程使用CPU的情况:

    #top -H -p 55790
    

    可见,有个叫“scheduling-1”的线程占用了较多的CPU,达到了42.5%。因此下一步我们要找出这个线程在做什么事情。

    1. 为了找出线程在做什么,用jstack生成线程快照。
      jstack输出较大,一般将其写入文件:
    jstack 55790 > 55790.log
    

    打开55790.log,定位到第4步中找到的名为 scheduling-1 的线程,其线程栈:

    看到AbstractExecutorService#submit这个函数调用,说明它是Spring Boot启动的周期性任务线程,向线程池中提交任务,该线程消耗了大量CPU。

    上下文切换开销?

    经历上述过程,往往已经可以定位到大量消耗CPU的线程及bug代码,比如死循环。但对于该案例:Java进程占用的CPU是961.6%, 而“scheduling-1”线程只占用了42.5%的CPU,那其它CPU被谁占用了?

    第4步用top -H -p pid命令看到的线程列表中还有许多名为“pool-1-thread-x”的线程,它们单个的CPU使用率不高,但是似乎数量比较多。你可能已经猜到,这些就是线程池中干活的线程。那剩下的CPU是不是被这些线程消耗了呢?

    还需要看jstack的输出结果,主要是看这些线程池中的线程是不是真的在干活,还是在“休息”呢?
    发现这些“pool-1-thread-x”线程基本都处WAITING状态。

    • Blocking指的是一个线程因为等待临界区的锁(Lock或者synchronized关键字)而被阻塞的状态,请你注意的是处于这个状态的线程还没有拿到锁
    • Waiting指的是一个线程拿到了锁,但需等待其他线程执行某些操作。比如调用了Object.wait、Thread.join或LockSupport.park方法时,进入Waiting状态。前提是这个线程已经拿到锁了,并且在进入Waiting状态前,os层面会自动释放锁,当等待条件满足,外部调用了Object.notify或者LockSupport.unpark方法,线程会重新竞争锁,成功获得锁后才能进入到Runnable状态继续执行。

    回到我们的“pool-1-thread-x”线程,这些线程都处在“Waiting”状态,从线程栈我们看到,这些线程“等待”在getTask方法调用上,线程尝试从线程池的队列中取任务,但是队列为空,所以通过LockSupport.park调用进到了“Waiting”状态。那“pool-1-thread-x”线程有多少个呢?通过下面这个命令来统计一下,结果是4096,正好跟线程池中的线程数相等。

    grep -o 'pool-2-thread' 55790.log | wc -l
    

    剩下CPU到底被谁消耗了?
    应该怀疑CPU的上下文切换开销了,因为我们看到Java进程中的线程数比较多。

    下面通过vmstat命令来查看一下操作系统层面的线程上下文切换活动:

    cs那一栏表示线程上下文切换次数,in表示CPU中断次数,我们发现这两个数字非常高,基本证实了我们的猜测,线程上下文切切换消耗了大量CPU。
    那具体是哪个进程导致的呢?

    停止Spring Boot程序,再次运行vmstat命令,会看到in和cs都大幅下降,这就证实引起线程上下文切换开销的Java进程正是55790。

    总结

    遇到CPU过高,首先定位哪个进程导致的,之后可以通过top -H -p pid命令定位到具体的线程。
    其次还要通jstack查看线程的状态,看看线程的个数或者线程的状态,如果线程数过多,可以怀疑是线程上下文切换的开销,我们可以通过vmstat和pidstat这两个工具进行确认。

    展开全文
  • java进程占用CPU和内存太高问题排查

    千次阅读 2021-07-21 09:57:03
    线上排查java进程占用cpu过高问题 一、创建springBoot项目 新建的项目需引入web依赖支持,方便我们通过http调用 pom.xml文件如下: <?xml version="1.0" encoding="UTF-8"?> <project xmlns=...


    线上排查java进程占用cpu过高问题

    一、创建springBoot项目

    新建的项目需引入web依赖支持,方便我们通过http调用
    pom.xml文件如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.5.2</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
        <groupId>com.javapc</groupId>
        <artifactId>demo</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>javapc</name>
        <description>Demo project for Spring Boot</description>
        <properties>
            <java.version>1.8</java.version>
        </properties>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
            <!-- 引入web依赖 -->
    <!--        <dependency>-->
    <!--            <groupId>org.springframework.boot</groupId>-->
    <!--            <artifactId>spring-boot-starter-web</artifactId>-->
    <!--        </dependency>-->
        </dependencies>
    
        <build>
            <plugins>
                <!-- springboot打包插件 -->
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                    <configuration>
                        <mainClass>com.javapc.demo.JavapcApplication</mainClass>
                        <!-- <skip>true</skip> -->
                    </configuration>
                    <executions>
                        <execution>
                            <goals>
                                <goal>repackage</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    
    </project>
    

    修改启动类

    package com.javapc.demo;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    public class JavapcApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(JavapcApplication.class, args);
    
            int count = 9;
            while(count < 10){
                count = count >> 2 << 2;
                System.out.println(count);
            }
        }
    }
    

    打包
    在这里插入图片描述
    将打好的demo-0.0.1-SNAPSHOT.jar上传到虚拟机并启动。简单吧,不再细说。

    二、CPU占用过高问题排查

    启动demo-0.0.1-SNAPSHOT.jar

    java -jar demo-0.0.1-SNAPSHOT.jar &
    

    启动后使用top -c 命令显示运行中的进程列表信息,找到 cpu 占有率最高的 java 进程号。
    在这里插入图片描述
    通过shift + p 通过 cpu 占用率进行排序,可知44974 的java进程占用 cpu 最高。
    下面使用 jstack 命令生成 Java 进程中所有线程的快照

    jstack -l 44974 > /root/44974.stack
    

    扩展
    问题:
    在执行命令时可能会报一下错误:

    Unable to open socket file: target process not responding or HotSpot VM not loaded
    

    分析:
    Java进程启动时会自动创建 hsperfdata_$USER 目录,并生成 44974 文件, hsperfdata_$USER 目录默认会创建在 /tmp 目录下,如下图:
    在这里插入图片描述
    由于Linux一切皆文件的特性,也就是说一个Java进程实际上会对应到一个PID文件,stack命令依赖于进程的PID文件也就是44974文件,报错这个是由于这个PID文件可能已经被系统给删除了。
    那到底是被谁删掉的呢,当然是linux系统自己删的。
    linux系统有个删除管理机制:系统每天会用tmpwatch命令检查并删除 /tmp 下超过240小时未访问过的文件和目录。

    解决:
    https://bxoon.blog.csdn.net/article/details/111881528

    使用top -Hp pid查看 java 进程中占用 cup 最高的线程,也可以通过shift + p 进行排序

    top -Hp 44947
    

    在这里插入图片描述
    由上图可知是 44975 的进程 cpu 占用率最高,将 44975 十进制数转换为十六进制

    [root@localhost ~]# printf "%x\n" 44975
    afaf
    

    进入/root 目录,打开刚通过 stack 命令生成的 44974.stack 文件,并在文件中搜索 afaf
    在这里插入图片描述
    到此定位到问题,就是JavapcApplication.java的第14
    在这里插入图片描述

    三、内存占用过高问题排查

    使用 top -c 命令显示运行中的进程列表信息,通过 shift + m 按内存占用率进行排序
    在这里插入图片描述
    利用 jmap 生成堆转储快照

    [root@localhost ~]# jmap -dump:format=b,file=/root/dumpheap_125280.hprof 125280
    Dumping heap to /root/dumpheap_125280.hprof ...
    Heap dump file created
    
    

    将dumpheap_125280.hprof 125280文件下载到本地,然后装入“jvisualvm”工具中。
    在这里插入图片描述
    分析过程在jvisualvm分析内存溢出问题讲述过,如需阅读请跳转至该文查看。

    四、附加📎

    https://download.csdn.net/download/qq_39774931/20391277

    展开全文
  • 果然看到有多个php-fmp进程占用cpu过高,都达到100%了 于是打算监听一下进程,看看在执行什么操作,使用strace 命令: #监听进程 strace -o /tmp/output.txt -T -tt -F -e trace=all -p 7757 #查看log tail -f /...
  • Linux下怎么限制进程CPU占用

    千次阅读 2020-12-24 17:28:30
    Linux下怎么限制进程CPU占用率Linux下怎么限制进程CPU占用率 Linux下怎么限制进程CPU占用率 工作遇到一个情况需要根据CPU的负载来限流的场景,测试需要模拟不同的CPU 负载。所以写了一个简单的循环, 但是这个会导致...
  • CPU进程, 线程的占用关系

    千次阅读 2020-09-15 22:35:21
    并发和并行的概念区分: 并发,指的是多个事情,在...只有在多CPU或者一个CPU多核的情况中,才会发生并行。否则,看似同时发生的事情,其实都是并发执行的。 ...
  • linux kswapd0进程cpu占用一直居高不下

    千次阅读 2022-02-17 15:14:23
    kswapd0占用CPU时, 说明机器的全部内存(物理内存+虚拟内存)已经用尽了. 机器不得不把内存里的内容卸载硬盘, 然后才能加载所要的程序, 数据. 这个过程机器会反复进行, 这时机器会很慢. 最根本的解决办法是增加物理...
  • 3.1 工作队列3.2 等待队列3.3 唤醒进程3.4 内核接收网络数据全过程3.5 进程阻塞为什么不消耗CPU进程如何阻塞?进程阻塞为什么不消耗CPU? 要想明白进程如何阻塞,阻塞为什么不消耗CPU,就要先明白 计算机是如何...
  • 都知道可以在任务管理器中查看进程CPU 和内存占用,那么如何通过 .NET 编写代码的方式来获取 CPU 和内存占用呢? .NET 中提供了 PerformanceCounter 类型,可以用来监视系统中大量的性能问题。 本文内容获取...
  • 在程序开发的过程中,难免遇到进程占用cpu过高(现网居多、开发环境)的情况,现网出现这种情况就需要及时的能定位问题,快速解决,否则就导致系统不可用,用户投诉等多种一系列的问题。 2、java进程占用CPU过高...
  • Windows进程的内存占用以及CPU占用

    千次阅读 2020-03-06 21:26:05
    在测试过程中,有时我们需要关注某个进程的内存占用CPU占用、句柄数等情况,在Windows系统中,使用windows自带的性能监视器可以达到目的。 使用方法 运行“perfmon”,打开性能监视器;新建自定义的数据收集器...
  • 1、获取系统cpu: 使用WindowsAPI函数GetSystemTimes(),为获取当前使用率,通过执行两次的方式进行...//Windows程序获取cpu占用率 void GetCpuUsage_WIN(double* CPUResult) { CPUResult[0] = 0; CPUResult[1...
  • 进程阻塞为什么不占用cpu资源

    万次阅读 多人点赞 2019-07-03 15:29:54
    阻塞是进程调度的关键一环,指的是进程在等待某事件(如接收网络数据)发生之前的等待状态,recv、select和epoll都是阻塞方法。 如下面所示一段服务端server的代码: #!/usr/bin/python # -*- coding: UTF-8 -*...
  • Java程序占用 CPU 过高怎么排查

    千次阅读 2021-11-12 10:20:57
    Java程序占用 CPU 过高怎么排查 线上一台服务器 CPU 使用率100% 了,如果你碰到这样的情况,如何排查并找到问题原因? 这就是一个套路题,所谓套路题就是有标准的套路解法的,掌握了套路,不仅能解决面试官,还能...
  • 操作系统:为什么IO操作不占用CPU却会导致进程阻塞?Web服务器每接收一个请求都会创建一个新的线程吗?Tomcat服务器工作原理?
  • 刚开始远程工作,就接到短信告警,系统CPU占用过高,立即登录系统查看,登录的过程异常缓慢,不过总算登录了 ABRT报告发现了一个问题 ABRT是一个自动汇报错误的工具,主要是为用户提供简洁的,全面的错误信息 ...
  • 文章目录说明【必看】CPU占用代码测试内存占用代码测试硬盘IO测试hdparm命令dd命令硬盘IO写速度测试硬盘IO读速度测试创建一个自定义大小的文件 说明【必看】 下面占用代码,虽然已经很详细了,但没有一定linux基础 ...
  • 系统lsass.exe进程占用cpu的解决

    万次阅读 2017-12-20 10:13:55
    一、打开浏览器出现lsass.exe进程占用一个cpu核心100%。 二、lsass.exe进程是微软为Windows?操作系统定义的系统进程,存在于基于Windows NT的系统,如Windows 2000/Xp/2003/Vista系统中。其描述为:LSA Shell ...
  • 发现服务器异常,一般先想到用top命令查看占用CPU高的进程,但如果是高手入侵,可能会替换掉你系统的一些重要命名。所以建议装系统后,把诸如/usr/bin目录的top、ps、kill等重要命令先备份好。一旦发现被入侵,先...
  • 1、top:观察占用CPU或者MEN(内存)使用情况最高的进程,记录PID; TIP: (1)、“1” 显示出多个逻辑CPU使用情况; (2)、“X” 高亮显示CPU列,并排序,&quot;Z&quot;红色展示; (3)、“shift + &...
  • 1.获取内存占用信息 获取步骤: (1)获取当前进程句柄 使用GetCurrentProcess(),返回一个当前进程的句柄   (2)定义一个保存内存信息的结构体 PROCESS_MEMORY_COUNTERS pmc; 结构体定义如下: typedef ...
  • Linux进程、线程绑定CPU以及独占CPU

    千次阅读 2019-11-01 16:54:49
    一、进程绑定cpu 我们通过系统调用sched_setaffinity进行绑定,通过sched_getaffinity获取绑定关系。注意这对方法是进程级别的绑定。代码中指定cpu0和cpu3,我们可以通过htop查看,两个cpu使用达到了100%,其他的...
  • win10升级后CFT加载程序占用CPU高,目前网上的解释是微软BUG,需要待后续版本解决,CPU持续占用较高,干不了其它事情,可以用如下方法解决。 用windows进程管理杀死后,由于此进程会自动启动非常顽固,可以创建...
  • 使用Process Explorer可以很方便查看某个进程各个线程的CPU占用率,可以为排查问题提供帮助。我使用的Process Explorer版本是v16.21 64bit。使用VS 2008创建一个MFC对话框程序,在代码中创建两个线程,如下: m_...
  • 易语言api CreateProcess 创建进程

    千次阅读 2020-06-04 09:58:55
    封装进程创建的原因主要是易语言自带的运行和执行命令不能启动游戏,当我们写一键启动,批量启动游戏时,便用到了进程_创建的命令。 用到的API CreateProcess WIN32API函数CreateProcess用来创建一个新的进程和它...
  • 今天断断续续的收到管理平台的异常报警,cpu占用过高和jvm old占用过高,这个时候赶紧去排查原因,下面记录了我的排查过程,可能里面还有不正确的地方,欢迎各位大佬指正,也欢迎大家关于类似的案例一起交流,下面就...
  • 从而会产生CPU占用过高,服务器告警等问题。因EPG的一个访问一次对数据库操作量不大,查询完数据就完成ok了,wait_timeout 设置在120s内就很完美了。 1、第一种修改方式 需重启MySQL(6.5为例) 1.1、修改参数配置文件...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 200,598
精华内容 80,239
关键字:

从创建进程到占用cpu的过程