zoukankan      html  css  js  c++  java
  • (转)linux命令-- pstack命令(跟踪进程栈)

    原文:https://www.cnblogs.com/kongzhongqijing/articles/7685699.html

    pstack是一个shell脚本,用于打印正在运行的进程的栈跟踪信息,它实际上是gstack的一个链接,而gstack本身是基于gdb封装的shell脚本.。此命令可显示每个进程的栈跟踪。pstack 命令必须由相应进程的属主或 root 运行。可以使用 pstack 来确定进程挂起的位置。此命令允许使用的唯一选项是要检查的进程的 PID。

    与jstack功相比, 它能对潜在的死锁予以提示, 而pstack只提供了线索, 需要gdb进一步的确定。

    pstack是gdb的一部分,如果系统没有pstack命令,使用yum搜索安装gdb即可。

    这个命令在排查进程问题时非常有用,比如我们发现一个服务一直处于work状态(如假死状态,好似死循环),使用这个命令就能轻松定位问题所在;可以在一段时间内,多执行几次pstack,若发现代码栈总是停在同一个位置,那个位置就需要重点关注,很可能就是出问题的地方;

    示例1:查看bash程序进程栈

    复制代码
    /opt/app/tdev1$ps -fe| grep bash
    tdev1   7013  7012  0 19:42 pts/1    00:00:00 -bash
    tdev1  11402 11401  0 20:31 pts/2    00:00:00 -bash
    tdev1  11474 11402  0 20:32 pts/2    00:00:00 grep bash
    /opt/app/tdev1$pstack 7013
    #0  0x00000039958c5620 in __read_nocancel () from /lib64/libc.so.6
    #1  0x000000000047dafe in rl_getc ()
    #2  0x000000000047def6 in rl_read_key ()
    #3  0x000000000046d0f5 in readline_internal_char ()
    #4  0x000000000046d4e5 in readline ()
    #5  0x00000000004213cf in ?? ()
    #6  0x000000000041d685 in ?? ()
    #7  0x000000000041e89e in ?? ()
    #8  0x00000000004218dc in yyparse ()
    #9  0x000000000041b507 in parse_command ()
    #10 0x000000000041b5c6 in read_command ()
    #11 0x000000000041b74e in reader_loop ()
    #12 0x000000000041b2aa in main ()
    复制代码

    或者类似这样执行

    复制代码
    $ sudo pstack $(pgrep -uroot php-fpm)
    [sudo] password for guanyy:
    #0  0x000000380d8e86f3 in __epoll_wait_nocancel () from /lib64/libc.so.6
    #1  0x00000000007ec4a4 in fpm_event_epoll_wait ()
    #2  0x00000000007e1517 in fpm_event_loop ()
    #3  0x00000000007dc887 in fpm_run ()
    #4  0x00000000007e3bd8 in main ()
    复制代码

    实例2:ps -eLo pid,lwp,pcpu |grep pid

    利用一个最简单的命令就能够定位到哪段程序可能存在性能问题:获取进程ID,通过pstack命令查看里边的各个线程id以及对应的线程现在正在做什么事情,分析多组数据就可以获得哪些线程里有慢操作影响了服务器的性能,从而得到解决方案

    由此可以判断出来在LWP 30222这个线程产生了性能问题,执行时间长达31.4毫秒的时间,再观察无非就是下面的几个语句出现的问题,只需要简单排查就知道了问题瓶颈。

     

    本地线程ID

    "NativeThread ID"所指的本地线程是指该java虚拟机所对应的虚拟机中的本地线程,java代码是依附于java虚拟机的本地线程执行的,当启动一个线程时,是创建一个native本地线程,本地线程才是真实的线程实体,为了更加深入理解本地线程和java线程的关系,可以通过以下方式将java虚拟机的本地线程打印出来:
    1、试用ps -ef|grep java 获得java进行id
    2、试用pstack<java pid> 获得java虚拟机本地线程的堆栈
    从操作系统打印出来的虚拟机的本地线程看,本地线程数量和java线程数量是相同的,说明二者是一一对应的关系。
    那么本地线程号如何与java线程堆栈文件对应起来呢,每一个线程都有tid,nid的属性。----dump文件中每个线程的nid值。

    技术链接
  • 相关阅读:
    tomcat websocket 实现网页在线即时聊天
    可编辑DIV 光标位置 处理
    Java匿名内部类使用与示例
    JS判断值是否是数字
    BAT等大型互联网公司的网站架构演化历程
    GIT总结
    5.1_二叉树
    4.4_8种常用排序算法5(基数排序)
    4.3_8种常用排序算法4(归并排序)
    4.3_8种常用排序算法3(选择排序:简单选择排序+堆排序)
  • 原文地址:https://www.cnblogs.com/liujiacai/p/14716339.html
Copyright © 2011-2022 走看看