精华内容
下载资源
问答
  • Java 线上cpu占用过高分析 1、top 命令查看占用过高线程 9401 root 20 0 3163948 43592 11932 S 1.3 1.2 0:15.81 java 2609 polkitd 20 0 1333984 209256 11044 S 0.3 5.6 1:27.59 mysqld

    Java 线上cpu占用过高分析

    1、top 命令查看占用过高线程

     9401 root      20   0 3163948  43592  11932 S   1.3  1.2   0:15.81 java                                                                    
     2609 polkitd   20   0 1333984 209256  11044 S   0.3  5.6   1:27.59 mysqld                                 
    13301 root      10 -10  145952  20784   5980 S   0.3  0.6  84:17.34 AliYunDun                              
    23125 polkitd   20   0 1780292 514228  11512 S   0.3 13.8  19:45.03 mysqld  
    

    可以看出pid 为9401的线程占用过高

    2、查看是哪个线程占用过高, 哪个线程耗费了多长时间

    ps -mp 9401 -o THREAD,tid,time参数
    // 参数解释
    -m 显示所有的线程
    -p pid 进程使用cpu的时间
    -o 该参数是用户自定义格式

    USER     %CPU PRI SCNT WCHAN  USER SYSTEM   TID     TIME
    root      1.8   -    - -         -      -     - 00:00:20
    root      0.0  19    - futex_    -      -  9401 00:00:00
    root      1.7  19    - n_tty_    -      -  9402 00:00:19
    root      0.0  19    - futex_    -      -  9403 00:00:00
    root      0.0  19    - futex_    -      -  9404 00:00:00
    root      0.0  19    - futex_    -      -  9405 00:00:00
    

    可以看出9402线程 占用过高

    3、将线程id转换为16进制格式(英文字母小写格式) -> printf “%x\n” 有问题的线程id

    printf "%x\n" 9402
    

    结果: 24ba

    4、jstack 进程ID|grep tid(16进制线程小写英文) -A60

    jstack 9402 | grep 24ba -A60
    

    结果:

    "main" #1 prio=5 os_prio=0 tid=0x00007fc380009800 nid=0x2c84 runnable [0x00007fc387caa000]
       java.lang.Thread.State: RUNNABLE
    	at java.io.FileOutputStream.writeBytes(Native Method)
    	at java.io.FileOutputStream.write(FileOutputStream.java:326)
    	at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82)
    	at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:140)
    	- locked <0x00000000c701b490> (a java.io.BufferedOutputStream)
    	at java.io.PrintStream.write(PrintStream.java:482)
    	- locked <0x00000000c7004fb0> (a java.io.PrintStream)
    	at sun.nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:221)
    	at sun.nio.cs.StreamEncoder.implFlushBuffer(StreamEncoder.java:291)
    	at sun.nio.cs.StreamEncoder.flushBuffer(StreamEncoder.java:104)
    	- locked <0x00000000c7004f70> (a java.io.OutputStreamWriter)
    	at java.io.OutputStreamWriter.flushBuffer(OutputStreamWriter.java:185)
    	at java.io.PrintStream.newLine(PrintStream.java:546)
    	- eliminated <0x00000000c7004fb0> (a java.io.PrintStream)
    	at java.io.PrintStream.println(PrintStream.java:737)
    	- locked <0x00000000c7004fb0> (a java.io.PrintStream)
    	at TestJavaLinux.main(TestJavaLinux.java:11)
    
    "VM Thread" os_prio=0 tid=0x00007fc380073000 nid=0x2c87 runnable 
    
    "GC task thread#0 (ParallelGC)" os_prio=0 tid=0x00007fc38001e800 nid=0x2c85 runnable 
    
    "GC task thread#1 (ParallelGC)" os_prio=0 tid=0x00007fc380020800 nid=0x2c86 runnable 
    
    "VM Periodic Task Thread" os_prio=0 tid=0x00007fc3800bf000 nid=0x2c8e waiting on condition 
    
    JNI global references: 5
    

    由此可见是 at TestJavaLinux.main(TestJavaLinux.java:11) 我们的11行代码产出的原因

    我们在代码里面写了死循环
    在这里插入图片描述

    5、注意:

    注意:这里要使用程序启动的用户执行此命令

    使用root会提示:

    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

    展开全文
  • Linux线上CPU占用过高排查

    千次阅读 2019-02-13 14:38:09
    发现正在运行的JAVA项目CPU占用率很,百分之110左右了,那么问题一定出在这个程序中 Ps -mp pid -o THREAD,tid,time 再通过ps命令查看这个程序的线程信息,tid代码线程ID,time代表这个线程的已运行时间 由...

    问题是这样的,将项目部署到服务器上后,发现应用程序的响应速度非常慢,于是开始进行了排查。

    TOP
    首先查看系统资源占用信息,TOP看一下

    发现正在运行的JAVA项目CPU占用率很高,百分之110左右了,那么问题一定出在这个程序中

    Ps -mp pid -o THREAD,tid,time
    再通过ps命令查看这个程序的线程信息,tid代码线程ID,time代表这个线程的已运行时间

    由上面TOP可知进程ID为17569

    于是可以看到这个进程中有3个线程的CPU占用率很高,并且它们目前也运行了13分钟了,它们的TID分别为17569

    进制转换,2HEX
    再将这3个TID转为16进制,为等会在jstack中查找方便
    Printf “%x\n” number


    得到这个数的16进制为44a1

    jstack查看进程信息
    有了线程ID的16进制后,再在jstack中查看进程堆栈信息(之所有拿到TID信息,主要是为了查找方便)
    通过jstack -pid 再grep查询


    从这里能看出,这3个线程目前还处于运行状态的
    再通过jstack查看详细点的信息


    其中显示出了较为详细的代码信息
    本地代码问题排查
    再通过回到代码中查看CanalLauncher.main方法

     通过code review发现,canal的代码中有一段连接判断的while循环,一直在调用,修改增加Thread.sleep(),问题解决

    public static void main(String[] args) {
            try {
                running = true;
                logger.info("## set default uncaught exception handler");
                setGlobalUncaughtExceptionHandler();
    
                logger.info("## load canal configurations");
                String conf = System.getProperty("canal.conf", "classpath:canal.properties");
                Properties properties = new Properties();
                RemoteConfigLoader remoteConfigLoader = null;
                if (conf.startsWith(CLASSPATH_URL_PREFIX)) {
                    conf = StringUtils.substringAfter(conf, CLASSPATH_URL_PREFIX);
                    properties.load(CanalLauncher.class.getClassLoader().getResourceAsStream(conf));
                } else {
                    properties.load(new FileInputStream(conf));
                }
    
                remoteConfigLoader = RemoteConfigLoaderFactory.getRemoteConfigLoader(properties);
                if (remoteConfigLoader != null) {
                    // 加载远程canal.properties
                    Properties remoteConfig = remoteConfigLoader.loadRemoteConfig();
                    // 加载remote instance配置
                    remoteConfigLoader.loadRemoteInstanceConfigs();
                    if (remoteConfig != null) {
                        properties = remoteConfig;
                    } else {
                        remoteConfigLoader = null;
                    }
                }
    
                final CanalStater canalStater = new CanalStater();
                canalStater.start(properties);
    
                if (remoteConfigLoader != null) {
                    remoteConfigLoader.startMonitor(new RemoteCanalConfigMonitor() {
    
                        @Override
                        public void onChange(Properties properties) {
                            try {
                                // 远程配置canal.properties修改重新加载整个应用
                                canalStater.destroy();
                                canalStater.start(properties);
                            } catch (Throwable throwable) {
                                logger.error(throwable.getMessage(), throwable);
                            }
                        }
                    });
                }
    
                while (running) {
                    Thread.sleep(1000);
                }
    
                if (remoteConfigLoader != null) {
                    remoteConfigLoader.destroy();
                }
            } catch (Throwable e) {
                logger.error("## Something goes wrong when starting up the canal Server:", e);
            }
        }

    重新打包mvn clean install -Dmaven.test.skip -Denv=release,上传替换问题解决。

    读者看到这里,基本上猜出个大概,是的就是阿里的mysql跨机房数据同步中间件canal

    展开全文
  • 表象:服务挂了,CPU占用比较,一直在百分之九十多。肯定有小伙伴会说常规操作 ,reboot一下完事儿了。其实这样吧没毛病,但是解决不了根本问题。啥也不多说。咱们先说下线上排查三板斧。就算不能解决问题也能猜个...
  • 线上CPU占用超90%排查方法top命令查看占用CPU的进程pid使用top -Hp [pid] 查看当前进程的线程CPU占用情况使用 jstack -l [pid] > jstack_log ,导出堆栈信息定位代码行数 top命令查看占用CPU的进程pid 登录CPU占用...

    top命令查看占用CPU的进程pid

    登录CPU占用高的机器,使用top命令找出占用CPU最高的Java进程
    在这里插入图片描述

    使用top -Hp [pid] 查看当前进程的线程CPU占用情况

    找到当前占用CPU异常的Java进程后,再使用top -Hp [pid],可以显示出该进程内所有的线程,以及线程相关的一些信息
    在这里插入图片描述

    使用 jstack -l [pid] > jstack_log ,导出堆栈信息

    发现该进程中29094线程占用CPU居高不下,使用jstack -l [pid] > jstack_log 命令,连续几次导出该进程的堆栈信息
    在这里插入图片描述

    定位代码行数

    将第2步中找到的高CPU占用率线程PID转换成十六进制,在导出的线程堆栈信息文件中搜索,定位代码
    在这里插入图片描述
    最后走查该行代码上下文的异常情况,此处是模拟了三层循环,上万次执行导致的CPU占用高。
    以上为我在实际工作过程中遇到的一次服务CPU占用异常的排查步骤,最终原因确实是代码中有三层循环,循环内是一个equals比较,但是循环次数太多浪费大量CPU资源,各种同学也注意实际开发中尽量避免这种多层循环嵌套的逻辑,一方面有风险另一方面可读性也很差。比如在循环查找两个List中元素对比时,可以采用先将其中一个List转换为Map处理,极大减少这种循环次数。

    展开全文
  • 线上CPU负载过高处理

    2021-03-05 15:26:34
    线上CPU报警 占用 90% 告警了一晚上 第二天才看的。 二、处理 1.top 命令 使用 top 命令查看后,load average 也是超负荷的状态,用户态的CPU占比 确实很(us),而且是居不下,然后我就找到占比的...

    一、背景

    线上CPU报警 占用率过 90% 告警了一晚上 第二天才处理的。

    二、处理 

    1.top 命令

    使用 top 命令查看后,load average 也是超负荷的状态,用户态的CPU占比 确实很高(us),而且是居高不下,然后我就找到占比高的进程号 查看

    2.查看CPU占比高的进程

    3.进程信息查询

    看到进程信息我忽然明白了,由于程序 BUG 导致大量历史文件堆积,程序处理不动了,虽然我kill 了任务但是任务的进程依然没有杀死 

    4.kill掉进程

    使用kill 没有杀死进程,就加了  -9 的参数

    ​​kill -9 31703

     

    然后 ,就CPU资源马上被释放了 

    展开全文
  • 1.通过top命令发现mysql占用cpu高 2.用show full processlist查看当前的慢语句 3.查看db列找到慢语句对应的数据库 4.通过ps -ef|grep jboss 命令查看当前jboss进程 5.通过数据库配置文件找到对应的jboss进程 6.然后...
  • 线上java cpu占用过高问题排查

    千次阅读 2018-07-27 10:04:35
    2.查看此进程中占用CPU的线程排行 ps -mp PID(这里替换) -o THREAD,tid,time|sort -rn|head -n 20 从这里可以看出线程21154占用内存最高,我们继续。 3.将此线程id转换成16进制,为我们接下来的...
  • 如果线上服务器发生CPU占用率高时,应该如何排查并定位问题。1、问题发现本文整理自一个真实的案例,是楼主负责的业务,在一次大促之前的压测时发现了这个问题。在每次大促之前,我们的测试人员都会对网站进行压力...
  • 线上服务器cpu占用高

    2021-05-14 10:26:16
    线上服务器负载很,于是常规操作; 1.top 获取占用cpu最高进程PID 2.top -H -p 17532 获取该进程占用最高的线程TID 17536 root 20 0 8806416 3.9g 13400 R 90.5 24.9 36:21.95 java 17539 root 20 0 ...
  • 线上java程序CPU占用过高问题排查

    万次阅读 多人点赞 2017-09-18 16:01:55
    工作中负责的有一个项目是使用iReport+JasperReport实现的一个打印系统。最近这个线上程序经常无响应,重启后恢复正常,但是时不时还是会出现类似的问题。 最后发现是JasperReport的一个... 导致系统CPU占用超高。
  • java线上应用cpu占用过高排查

    千次阅读 2018-03-01 17:04:38
    1. jps(或者使用top命令得到pid) jps(Java Virtual Machine Process Status Tool)是JDK ...top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器。 t...
  • 如果线上服务器CPU占用过高,如何定位问题呢? 1.使用 top 命令查看占用CPU最高的pid 2.使用 top -H -p pid或 top -Hp pid命令查看占用cpu最大的线程id即 tid 3.使用命令 printf ‘%x/n’ tid 打印出线程id的...
  • 线上cpu负载过高问题排查

    千次阅读 2018-04-29 23:44:26
    生产故障-JVM进程CPU占用率高于100%。 某日,运维同学反馈生产环境有故障,某个JVM进程CPU负载一直居不下。登入服务器用 top -c 命令查看进程情况。 定位故障的思路: - 通过Top -c命令查看进程信息,找出...
  • 排查过程 终端执行top命令,查看CPU占用情况(定位进程) ...通过以上命令,我们可以看到,进程ID为1893的Java进程的CPU占用率达到了181%,基本可以定位到是我们的Java应用导致整个服务器的CPU占用率飙升。
  • 线上mysql cpu过高

    2021-05-25 20:19:50
    文章目录前言一、背景二、分析1.mysql cpu 过高分析2. mysql 内存过高对服务端的影响1、现象总结 前言 线上mysql服务器cpu1000%的分析 一、背景 早上接到mysql的报警,cpu 800%,紧接着发现线上服务的官网都打不...
  • 线上服务器CPU占用怎么办? 如果线上服务器发生CPU占用率高时,应该如何排查并定位问题。 1、问题发现 本文整理自一个真实的案例,是楼主负责的业务,在一次大促之前的压测时发现了这个问题。 ...
  • 某天反馈服务卡 1.先top -c 按进程到低排序,找出进程的pid 2.然后 top -H -P PID 找出进程... gstack.log 把占用高的线程日志截存出来 最后让开发定位哪段代码有问题后解决。 转载于:https://www.cnblogs...
  • //线上cpu负载过高 问题排查   1.安装jstack yum install -y java-1.8.0-openjdk-devel-debug   2.使用top命令 查询进程占用cpu最高的pid。 shirft +p   3.查询占用cpu最高进程中的 子...
  • 那么,书归正传,本文我们就来简单介绍一下,如果线上服务器发生CPU占用过高的问题时,应该如何排查并定位问题。 1 问题发现 本文整理自一个真实的案例,是楼主负责的业务,在一次大促之前的压测时发现了...
  • 线上服务器CPU占用率飙如何解决

    千次阅读 2019-09-23 08:58:00
    线上服务器CPU占用如何排查定位问题定位线程定位代码问题解决 1、登录服务器,执行top命令,查看CPU占用情况: $top PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1893 admin 20 0 7127m 2.6g 38m ...
  • 查看占用cpu高的进程 top 如下图:可看出PID为11866的java进程占用cpu最高, 查看进程中最耗cpu的子线程 top -Hp 11866 如下图:可看出PID为7166的线程占用cpu最高,达到了97.7% 将最耗cpu的线程id转换为16进制...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 23,317
精华内容 9,326
关键字:

线上cpu占用过高