精华内容
下载资源
问答
  • linux系统排查线程阻塞问题

    千次阅读 2018-08-04 17:04:41
    问题引入:在工作中会遇到某个程序占用cpu高或者不响应请求等问题,对于这类问题的排查首先考虑程序中是不是有线程阻塞。 首先,使用ps查看程序的进程号。 [root@Joe ~]# ps -ef|grep ProgramName root 11694 ...

    问题引入:在工作中会遇到某个程序占用cpu高或者不响应请求等问题,对于这类问题的排查首先考虑程序中是不是有线程阻塞。

    首先,使用ps查看程序的进程号。

    [root@Joe ~]# ps -ef|grep ProgramName
    root     11694 11607  1 Nov11 ?        00:12:51 ./ProgramName

    第二、可以使用pstack查询程序的栈跟踪

    [root@Joe ~]# pstack 11694

    保存两次打印的栈跟踪信息,并比较分析

    [root@Joe ~]# pstack 11694 > one
    [root@Joe ~]# pstack 11694 > two
    [root@Joe ~]# diff one two

    第三、使用strace跟踪进程执行时的系统调用和所接收的信号

    [root@Joe ~]# strace -p 11694

    知识点延伸:

    在排查这些问题时,还可能会使用top,netstat -anp等。

     

    展开全文
  • 查看线程阻塞线程栈

    千次阅读 2017-06-06 11:00:53
    我开发的worker,每隔几个月线上都会阻塞一次,一直都没查出问题。今天终于了了这个心结。把解决过程总结下和大家分享。  首先用jstack命令打出这个进程的全部线程堆栈。拿到线程dump文件之后,搜索自己的worker...

    我开发的worker,每隔几个月线上都会阻塞一次,一直都没查出问题。今天终于了了这个心结。把解决过程总结下和大家分享。

        首先用jstack命令打出这个进程的全部线程堆栈。拿到线程dump文件之后,搜索自己的worker名字。

    [plain]  view plain  copy
    1. "DefaultQuartzScheduler_Worker-10" prio=10 tid=0x00007f55cd54d800 nid=0x3e2e waiting for monitor entry [0x00007f51ab8f7000]  
    2.    java.lang.Thread.State: BLOCKED (on object monitor)  
    3.     at com.jd.chat.worker.service.impl.NewPopAccountSyncServiceImpl.addAccounts(NewPopAccountSyncServiceImpl.java:86)  
    4.     - waiting to lock <0x0000000782359268> (a com.jd.chat.worker.service.impl.NewPopAccountSyncServiceImpl)  
    5.     at com.jd.chat.worker.service.timer.AccountIncSyncTimer.run(AccountIncSyncTimer.java:114)  
    6.     at com.jd.chat.worker.service.timer.AbstractTimer.start(AbstractTimer.java:44)  
    7.     at com.jd.chat.worker.service.timer.AbstractTimer.doJob(AbstractTimer.java:49)  
    8.     at com.jd.chat.worker.web.context.StartAppListener$TimerJob.execute(StartAppListener.java:188)  
    9.     at org.quartz.core.JobRunShell.run(JobRunShell.java:202)  
    10.     at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573)  
    11.     - locked <0x0000000783641c68> (a java.lang.Object)  



        很快便找到了线程在哪一行被阻塞。但是就凭这么点信息,并不能查出问题的真正原因,这里推荐一个工具,叫tda.bat。同事给我的,网上应该有下载。把这个dump文件导入到tda中。找到阻塞的线程。阻塞的线程是红色的。


       之所以说这个软件好,是因为当你找到blocked的线程后,界面的下方,会打出阻塞的更详细的线程堆栈。截取这个堆栈的部分信息。

    [java]  view plain  copy
    1. at org.mariadb.jdbc.MySQLPreparedStatement.execute(MySQLPreparedStatement.java:141)  
    2.     at org.apache.commons.dbcp.DelegatingPreparedStatement.execute(DelegatingPreparedStatement.java:172)  
    3.     at org.apache.commons.dbcp.DelegatingPreparedStatement.execute(DelegatingPreparedStatement.java:172)  
    4.     at com.ibatis.sqlmap.engine.execution.SqlExecutor.executeUpdate(SqlExecutor.java:80)  
    5.     at com.ibatis.sqlmap.engine.mapping.statement.MappedStatement.sqlExecuteUpdate(MappedStatement.java:216)  
    6.     at com.ibatis.sqlmap.engine.mapping.statement.MappedStatement.executeUpdate(MappedStatement.java:94)  
    7.     at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.update(SqlMapExecutorDelegate.java:457)  
    8.     at com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.update(SqlMapSessionImpl.java:90)  
    9.     at org.springframework.orm.ibatis.SqlMapClientTemplate$9.doInSqlMapClient(SqlMapClientTemplate.java:380)  
    10.     at org.springframework.orm.ibatis.SqlMapClientTemplate$9.doInSqlMapClient(SqlMapClientTemplate.java:1)  
    11.     at org.springframework.orm.ibatis.SqlMapClientTemplate.execute(SqlMapClientTemplate.java:200)  
    12.     at org.springframework.orm.ibatis.SqlMapClientTemplate.update(SqlMapClientTemplate.java:378)  
    13.     at com.jd.im.data.dataresource.ImSqlMapClientTemplate.retriedWithoutAnyInterventionUpdate(ImSqlMapClientTemplate.java:169)  
    14.     at com.jd.im.data.dataresource.ImSqlMapClientTemplate.update(ImSqlMapClientTemplate.java:137)  
    15.     at com.jd.chat.dao.impl.WriteDaoImpl.update(WriteDaoImpl.java:21)  
    16.     at com.jd.chat.zone.service.impl.GroupServiceImpl.updateRoute(GroupServiceImpl.java:766)  
    17.     at com.jd.chat.worker.service.impl.NewPopAccountSyncServiceImpl.addAccounts(NewPopAccountSyncServiceImpl.java:267)  
    18.     - locked <0x0000000782359268> (a com.jd.chat.worker.service.impl.NewPopAccountSyncServiceImpl)  

        这个才是真正有用的堆栈!它告诉了我程序是在执行SQL的时候,SQL发生死锁,于是线程被阻塞。它还提供了更有用的信息,那就是到底是哪个SQL导致的死锁。堆栈的倒数第三行指示了导致死锁的SQL。

        但是一定要用这个工具才能找到具体的原因吗?答案当然是NO!

        告诉大家怎么不通过工具找到阻塞的真正原因!

        刚刚通过“BLOCKED”关键字搜到了线程堆栈,找到它的线程名“DefaultQuartzScheduler_Worker-10”。OK,然后,把最后的10改成1,也就是“DefaultQuartzScheduler_Worker-1”,然后再拿这个关键字搜索整个进程堆栈。

    [java]  view plain  copy
    1. "DefaultQuartzScheduler_Worker-1" prio=10 tid=0x00007f55cd2aa000 nid=0x3e25 runnable [0x00007f51b02c0000]  
    2.    java.lang.Thread.State: RUNNABLE  
    3.     at java.net.SocketInputStream.socketRead0(Native Method)  
    4.     at java.net.SocketInputStream.read(SocketInputStream.java:129)  
    5.     at java.io.BufferedInputStream.fill(BufferedInputStream.java:218)  
    6.     at java.io.BufferedInputStream.read1(BufferedInputStream.java:258)  
    7.     at java.io.BufferedInputStream.read(BufferedInputStream.java:317)  
    8.     - locked <0x0000000791370d50> (a java.io.BufferedInputStream)  
    9.     at org.mariadb.jdbc.internal.common.packet.buffer.ReadUtil.readFully(ReadUtil.java:82)  
    10.     at org.mariadb.jdbc.internal.common.packet.buffer.ReadUtil.readFully(ReadUtil.java:92)  
    11.     at org.mariadb.jdbc.internal.common.packet.RawPacket.nextPacket(RawPacket.java:77)  
    12.     at org.mariadb.jdbc.internal.common.packet.SyncPacketFetcher.getRawPacket(SyncPacketFetcher.java:67)  
    13.     at org.mariadb.jdbc.internal.mysql.MySQLProtocol.getResult(MySQLProtocol.java:891)  
    14.     at org.mariadb.jdbc.internal.mysql.MySQLProtocol.executeQuery(MySQLProtocol.java:982)  
    15.     at org.mariadb.jdbc.MySQLStatement.execute(MySQLStatement.java:280)  
    16.     - locked <0x0000000791370678> (a org.mariadb.jdbc.internal.mysql.MySQLProtocol)  
    17.     at org.mariadb.jdbc.MySQLPreparedStatement.execute(MySQLPreparedStatement.java:141)  

                   贴出这个进程堆栈的一部分。这个进程堆栈其实也就是刚刚tda软件界面下方展示的导致线程阻塞的真正的堆栈!这个线程是runnable状态的,可惜MySQL是锁死的。也就是说阻塞在了mysql里。

        感觉这是一个由张三的命案牵出李四的命案的故事。


    展开全文
  • Linux线程之条件阻塞代码 包含mutex 与pthread_cond_wait,pthread_cond_signal的应用 详细内容见readme.txt
  • 首先查看java进程的Pid , 输入 pgrep java假设java的pid为5066 则将线程信息保存到5066.dump文件中,输入 jstack -F 5066 >5066.dump
    1. 首先查看java进程的Pid ,   输入 pgrep java
    2. 假设java的pid为5066 则将线程信息保存到5066.dump文件中,输入  jstack -F 5066 >5066.dump
    展开全文
  • linux 查看线程或cpu

    2017-12-12 19:15:41
    在arm嵌入式中不能通过top -H -p pid 来查看cpu。所以我们通过查看/proc/pid/task/tid/stat 的信息和/proc/stat 中的信息来计算cpu#!/bin/sh echo '$1 threads cpu'for tid in `ls /proc/$1/task/` do tm=`cat /...

    在arm嵌入式中不能通过

    top -H -p pid 

    来查看cpu。

    所以我们通过查看/proc/pid/task/tid/stat 的信息和/proc/stat 中的信息来计算cpu

    #!/bin/sh
    echo '$1 threads cpu'
    
    for tid in `ls /proc/$1/task/`
    do
            tm=`cat  /proc/$1/task/$tid/stat |awk  -F " " '{print $14+$15}'`
            echo $tm
    done
    
    total=`cat /proc/stat |awk -F " " 'NR==1{print  $2+$3+$4+$5+$6+$7+$8}'`
    echo $total
    
    sleep 10s
    
    for tid in `ls /proc/$1/task/`
    do
            tm2=`cat  /proc/$1/task/$tid/stat |awk  -F " " '{print $14+$15}'`
            echo $tm2
    done
    
    total2=`cat /proc/stat |awk -F " " 'NR==1{print  $2+$3+$4+$5+$6+$7+$8}'`
    echo $total2
    
    total3=`expr $total2 - $total`
    tm3=`expr $tm2 - $tm`
    cpus=`cat /proc/cpuinfo| grep "processor"| wc -l`
    echo $cpus $total3 $tm3
    
    tcpu=`expr $tm3 \* $cpus \* 100 / $total3`
    echo "thread cps: $tcpu"

    附上/proc/stat 信息

    cat /proc/stat
    cpu 2255 34 2290 22625563 6290 127 456
    cpu0 1132 34 1441 11311718 3675 127 438
    cpu1 1123 0 849 11313845 2614 0 18
    intr 114930548 113199788 3 0 5 263 0 4 [… lots more numbers …]
    ctxt 1990473
    btime 1062191376
    processes 2915
    procs_running 1
    procs_blocked 0
    这些数字指明了CPU执行不同的任务所消耗的时间(从系统启动开始累计到当前时刻)。时间单位是USER_HZ或jiffies(通常是百分之一秒)。
    这些数据列的含义如下,我们从左至右逐一认识:
    •user:正常的进程在用户态下执行时间累积
    •nice: NICED的进程在用户态下执行时间列
    •system:进程在内核态的执行时间累积
    •idle:空闲时间累积
    •iowait :等待I / O完成时间累积
    •irq :硬中断时间
    •softirq:软中断时间

    /proc/pid/task/tid/stat 的信息详情http://blog.csdn.net/ctthuangcheng/article/details/18090701

    线程Cpu时间threadCpuTime = utime +stime

    展开全文
  • 相信大家对线程锁和线程阻塞都很了解,无非就是 synchronized, wait/notify 等, 但是你有仔细想过 Java 虚拟机是如何实现锁和阻塞的呢?它们之间又有哪些联系呢?如果感兴趣的话请接着往下看。 为保障多线程下处理...
  • 网关 zuul 线程阻塞分析

    千次阅读 2019-12-19 16:16:32
    网关 zuul 线程阻塞分析 本文基于一个线上真实问题。在 Zuul 无任何安全防护措施时,若遇到较大流量(单个Zuul应用在默认配置下200并发即可),将产生非常严重的后果。 本文主要是探寻下问题产生的原因,问题背景与...
  • linux查看线程状态

    万次阅读 2018-03-12 13:23:53
    在调试程序时需要查看各个线程的状态,方便定位问题。 解决 方法1、pstree pstree PID 方法2、top top 然后按H,会显示线程 -p 可以指定PID,但是在嵌入式平台很可能被裁掉了 此方法还可以查看...
  • Linux进程查看命令 PS命令 1.不带参数的ps使用 2.显示所有的当前进程 ps –ax -a 代表 all。同时加上x参数会显示没有控制终端的进程。 ps -ax | less 可以结合less命令和管道来使用以方便查看。 3.通过cpu和...
  • linux查看线程状态--jstack

    千次阅读 2017-07-01 15:50:59
    linux下运行多线程程序,想查看各个线程的运行情况,怎么办? Linux查看某进程的线程状态: 1.jps或top或ps -ef|grep java,找到需要的进程pid; 2.jstack pid,查看pid的所有线程状态信息;下面为一个示例:...
  • java线程阻塞问题排查

    2021-02-04 10:56:15
    因为这次的问题不是cpu标高,而是业务跑不下去导致的,所以重点在于查看时间过长的线程,举个粟子: 9335最高,以此为切入点 2、获取栈信息 命令:jstack进程id > jstack.log 3、分析栈内容 把栈信息发到本.....
  • linux机器cpu核数等于8  一、分析原因  1、单线程进行es数据召回,耗时30ms左右,猜猜是由于多线程导致的  2、切回线程池多线程执行es数据召回,每条数据耗时1000ms左右,此时线程池配置如下:  private...
  • SecureRandom 引发的线程阻塞

    千次阅读 2019-09-23 21:26:25
    写在前面--每个人都是在不断碰壁中获得成长,bug的逼格越高, 成长速度越快。 本人上周亲手写下了一个牛逼的bug...所有人,开始手忙脚乱,查看线上日志,抓包,阿尔萨斯监听 接口耗时。各个大神,各种手段,各显才...
  • linux 线程

    2016-11-15 16:16:27
    一.轻量级进程LWP  既然称作轻量级进程,可见其本质仍然是进程,与普通进程相比,LWP与其它进程共享所有(或大部分)逻辑地址空间和系统资源,一个进程可以创建多个LWP,这样它们共享...Linux内核是支持LWP的典型例
  • 然后再用jvisualvm工具查看发现服务器主机CPU使用率在90%之上并未呈现出下降趋势,查看实时线程有一批线程是一直处于运行状态且运行时间占比也非常高,初步判断是线程内部代码异常导致被阻塞。 问题排查 一开始...
  • linux线程属性

    2019-05-28 12:54:14
    本节作为指引性介绍,linux线程的属性是可以根据实际项目需要,进行设置,之前我们讨论的线程都是采用线程的默认属性,默认属性已经可以解决绝大多数开发时遇到的问题。如我们对程序的性能提出更高的要求那么需要...
  • linux 查看 单个线程 的io

    千次阅读 2018-06-01 17:31:00
    说明:1、Linux下没有原生的查看IO的软件,只能额外装。2、如果使用vmstat或者cat /proc/$PID/io,这些看的都太复杂了。下面是安装的比较直观的软件:1、iostat这个只能计算总的IO,没有单独某个进程的。安装:#...
  • Linux进程线程实验

    千次阅读 2017-04-18 13:12:24
    Linux 进程线程实验
  • linux线程编程

    2014-09-17 16:13:41
    linux线程设计是指基于Linux操作系统下的多线程设计,包括多任务程序的设计,并发程序设计,网络程序设计,数据共享等。Linux系统下的多线程遵循POSIX线程接口,称为pthread。编写Linux下的多线程程序,需要使用...
  • 前言 在日常编码的过程中,我们经常会使用Thread.sleep、LockSupport.park()主动阻塞线程,或者使用synchronized和...而当我们调用Thread.interrupt方法时,除了synchronized,其他线程阻塞的方式都会被唤醒。 于是本文
  • Linux 线程浅析

    千次阅读 2015-04-14 14:53:28
    进程和线程的区别与联系 在许多经典的操作系统教科书中,总是把进程定义为程序的执行实例,它并不执行什么, 只是维护应用程序所需的各种资源,而线程则是真正的执行实体。 为了让进程完成一定的工作,进程必须至少...
  • 前言: 在前嵌入式开发中,往往需要考虑占用内存大小...在Linux环境下的线程其实就是轻量级的进程,但是我们通过top 或 ps -aux 命令一般都是查不到具体的线程号tid,需要在各个线程实现代码中获取线程ID。 具体实现...
  • linux查看线程状态

    2017-11-02 12:44:00
    前端软件,采用了linux的系统,在开发的过程中出现了一个非常奇怪的现象。按键线程,总是感觉被挂起了或者是卡到了某个点,按下按键时,软件无法检测到按键事件。但是,在按键线程的大循环里面,加一个printf函数...
  • linux线程同步

    千次阅读 2019-06-03 12:06:44
    lock尝试加锁,如果加锁不成功,线程阻塞,阻塞到持有该互斥量的其他线程解锁为止。 unlock主动解锁函数, 同时将阻塞在该锁上的所有线程 全部唤醒 ,至于哪个线程先被唤醒,取决于优先级、调度。默认:先阻塞、...
  • Linux线程详解

    万次阅读 多人点赞 2019-06-03 12:06:33
    pthread_join函数 阻塞等待线程退出,获取线程退出状态 其作用,对应进程中 waitpid() 函数。 int pthread_join(pthread_t thread, void **retval); 成功:0;失败:错误号 参数:thread:线程ID (【注意】...
  • Linux线程

    2019-05-12 09:15:13
    1. Linux线程概念 2. 线程控制 2.1 线程创建 2.2 线程终止 2.3 线程等待 2.4 线程分离 3. 线程安全 4. 同步与互斥 4.1 互斥锁 4.2 死锁 4.3 同步 4.4 生产者与消费者模型 4.3 posix标准信号量 4.4 读写...
  • linux线程及线程同步(锁的应用)

    千次阅读 2018-06-08 15:36:33
    linux线程 linux原本没有线程,后来在windows多线程编程影响下linux内核开发者在进程基础上在功能上做出了类似windows线程的linux版本的线程,linux线程归根到底还是进程,只不过是轻量级的进程,开销比真正进程...
  • linux线程浅析

    2013-05-29 11:22:51
    关于linux线程     在许多经典的操作系统教科书中, 总是把进程定义为程序的执行实例, 它并不执行什么, 只是维护应用程序所需的各种资源. 而线程则是真正的执行实体.  为了让进程完成一定的   工作...
  • linux线程设计

    2012-08-27 17:31:03
     Linux系统下的多线程遵循POSIX线程接口,称为pthread。编写Linux下的多线程程序,需要使用头文件pthread.h,连接时需要使用库libpthread.a。顺便说一下,Linux下pthread的实现是通过系统调用clone()来实现的。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 55,379
精华内容 22,151
关键字:

linux查看线程阻塞

linux 订阅