1. 程式人生 > >linux檢視程序與執行緒資訊(pstree pstack jstack)

linux檢視程序與執行緒資訊(pstree pstack jstack)

導言

在日常開發運維中,經常需要對程序及其執行緒資訊進行獲取,來排查記憶體溢位,死鎖,阻塞等問題。本文主要是檢視程序及其程序堆疊資訊

一.PSTREE
pstree [-acGhlnpuUV][-H <程式識別碼>][<程式識別碼>/<使用者名稱稱>
說明:如果不指定程式識別碼或使用者名稱稱,則會把系統啟動時的第一個程式視為基層,並顯示之後的所有程式。若指定使用者名稱稱,便會以隸屬該使用者的第一個程式當作基層,然後顯示該使用者的所有程式。
使用ps命令得到的資料精確,但資料龐大,這一點對掌握系統整體概況來說是不容易的。pstree命令正好可以彌補這個缺憾。它能將當前的執行程式以樹狀結構顯示。pstree命令支援指定特定程式(PID)或使用者(USER)作為顯示的起始。

PSTREE(1)                        User Commands                       PSTREE(1)

NAME
       pstree - display a tree of processes

SYNOPSIS
       pstree [-a] [-c] [-h|-Hpid] [-l] [-n] [-p] [-u] [-Z] [-A|-G|-U] [pid|user]
       pstree -V

DESCRIPTION
       pstree  shows  running processes as a tree. The tree is
rooted at either pid or init if pid is omitted. If a user name is specified, all process trees rooted at processes owned by that user are shown. pstree visually merges identical branches by putting them in square brackets and prefixing them with the repetition count, e.g. init-+-getty |-getty |-getty ‘-getty becomes init---4*[getty]
Child threads of a process are found under the parent process and are shown with the process name in curly braces, e.g. icecast2---13*[{icecast2}] If pstree is called as pstree.x11 then it will prompt the user at the end of the line to press return and will not return until that has happened. This is useful for when pstree is run in a xterminal. OPTIONS -a Show command line arguments. If the command line of a process is swapped out, that process is shown in parentheses. -a implicitly disables compaction. -A Use ASCII characters to draw the tree. -c Disable compaction of identical subtrees. By default, subtrees are compacted whenever possible. -G Use VT100 line drawing characters. -h Highlight the current process and its ancestors. This is a no-op if the terminal doesn’t support highlighting or if neither the current process nor any of its ancestors are in the subtree being shown. -H Like -h, but highlight the specified process instead. Unlike with -h, pstree fails when using -H if highlighting is not available. -l Display long lines. By default, lines are truncated to the display width or 132 if output is sent to a non-tty or if the display width is unknown. -n Sort processes with the same ancestor by PID instead of by name. (Numeric sort.) -p Show PIDs. PIDs are shown as decimal numbers in parentheses after each process name. -p implicitly disables compaction. -u Show uid transitions. Whenever the uid of a process differs from the uid of its parent, the new uid is shown in parentheses after the process name. -U Use UTF-8 (Unicode) line drawing characters. Under Linux 1.1-54 and above, UTF-8 mode is entered on the console with echo -e  m\033%8 nd left with echo -e -V Display version information. -Z (SELinux) Show security context for each process. FILES /proc location of the proc file system AUTHORS Werner Almesberger <[email protected]> Craig Small <[email protected]id.au> BUGS Some character sets may be incompatible with the VT100 characters. SEE ALSO ps(1), top(1). Linux 2004-11-09 PSTREE(1)

問題背景

某日,在主機上不行執行java程序,每次執行都返回 “Error occurred during initialization of VM java.lang.OutOfMemoryError”。
首先認為記憶體資源已滿,或者java OPT引數過低,導致記憶體不足,故free -g檢視後返現機器還有110G記憶體。故排除,修改啟動指令碼,-Xmx1g由1G修改為2G,問題依舊。
free -g
此時懷疑是否為執行緒資源耗幹導致,故通過 pstree -p |wc 獲取當前使用者執行的執行緒總數,ulimit -u 獲取當前使用者的最多可執行執行緒數,果然執行緒滿了.
此時再通過 pstree -p |more 查詢到執行緒id
一個是id為30265的C程序,一個是id為3637的java程序,其中java程序開啟了10540個執行緒,應該是程式邏輯錯誤,導致執行緒溢位。

        |-masaike(30265)---masaike(30266)-+-{masaike}(30336)
        |                                           |-{masaike}(30339)
        |                                           |-{masaike}(30340)
        |                                           |-{masaike}(30341)
        |                                           |-{masaike}(30342)
        |                                           |-{masaike}(30343)
        |                                           |-{masaike}(30344)
        |                                           |-{masaike}(30345)
        |                                           |-{masaike}(30346)
        |                                           |-{masaike}(30347)
        |                                           |-{masaike}(30348)
        |                                           |-{masaike}(30349)
        |                                           |-{masaike}(30350)
        |                                           |-{masaike}(30351)
        |                                           |-{masaike}(30352)
        |                                           |-{masaike}(30353)
        |                                           |-{masaike}(30354)
        |                                           |-{masaike}(30355)
        |                                           |-{masaike}(30356)
        |                                           |-{masaike}(30357)
        |                                           |-{masaike}(30358)
        |                                           |-{masaike}(30359)
        |                                           |-{masaike}(30360)
        |                                           |-{masaike}(30361)
        |                                           |-{masaike}(30362)
        |                                           |-{masaike}(30382)
        |                                           |-{masaike}(30383)
        |                                           |-{masaike}(30384)
        |                                           |-{masaike}(30385)
        |                                           |-{masaike}(30386)
        |                                           |-{masaike}(30391)
        |                                           |-{masaike}(30392)
        |                                           |-{masaike}(30393)
        |                                           |-{masaike}(30394)
        |                                           |-{masaike}(30395)
        |                                           |-{masaike}(30396)
        |                                           |-{masaike}(30397)
        |                                           |-{masaike}(30398)
        |                                           |-{masaike}(30399)
        |                                           |-{masaike}(30400)
        |                                           |-{masaike}(30401)
        |                                           |-{masaike}(30402)
        |                                           |-{masaike}(30403)
        |                                           |-{masaike}(30404)
        |                                           |-{masaike}(30405)
        |                                           |-{masaike}(30406)
        |                                           |-{masaike}(30407)
        |                                           |-{masaike}(30408)
        |                                           |-{masaike}(30409)
        |                                           |-{masaike}(30410)
        |                                           |-{masaike}(30411)
        |                                           |-{masaike}(30412)
        |                                           |-{masaike}(30413)
        |                                           |-{masaike}(30414)
        |                                           |-{masaike}(30415)
        |                                           |-{masaike}(30416)
        |                                           |-{masaike}(30417)
        |                                           |-{masaike}(30418)
        |                                           |-{masaike}(30419)
        |                                           |-{masaike}(30420)
        |                                           |-{masaike}(30421)
        |                                           |-{masaike}(30422)
        |                                           |-{masaike}(30423)
        |                                           |-{masaike}(30424)
        |                                           |-{masaike}(30425)
        |                                           |-{masaike}(30426)
        |                                           |-{masaike}(30427)
-java(3637)-+-{java}(3638)
        |            |-{java}(3639)
        |            |-{java}(3640)
        |            |-{java}(3641)
        |            |-{java}(3642)
        |            |-{java}(3643)
        |            |-{java}(3644)
        |            |-{java}(3645)
        |            |-{java}(3646)
        |            |-{java}(3647)
        |            |-{java}(3648)
        |            |-{java}(3649)
        |            |-{java}(3650)
        |            |-{java}(3651)
        |            |-{java}(3652)
        |            |-{java}(3653)
        |            |-{java}(3654)
        |            |-{java}(3655)
        |            |-{java}(3656)
        |            |-{java}(3657)
        |            |-{java}(3658)
        |            |-{java}(3659)
        |            |-{java}(3660)
        |            |-{java}(3661)
        |            |-{java}(3662)
        |            |-{java}(3663)
        |            |-{java}(3664)
        |            |-{java}(3665)
        |            |-{java}(3666)
        |            |-{java}(3667)
        |            |-{java}(3668)
        |            |-{java}(3669)
        |            |-{java}(3670)
        |            |-{java}(3671)
        |            |-{java}(3678)
        |            |-{java}(3679)
        |            |-{java}(3680)
        |            |-{java}(3681)
        |            |-{java}(3682)
        |            |-{java}(3683)
        |            |-{java}(3691)
        |            |-{java}(3692)
        |            |-{java}(3693)
        |            |-{java}(3695)
        |            |-{java}(3696)
        |            |-{java}(3697)
        |            |-{java}(3698)
        |            |-{java}(3699)
        |            |-{java}(3701)
        |            |-{java}(3702)
        |            |-{java}(3703)
        |            |-{java}(3704)
        |            |-{java}(3705)
        |            |-{java}(3706)
        |            |-{java}(3707)
        |            |-{java}(3708)
        |            |-{java}(3709)
        |            |-{java}(3710)

獲得程序PID之後我們來獲取具體執行緒堆疊資訊,其中C程序使用pstack檢視執行緒堆疊資訊,這裡不進行邏輯上細緻分析,java程序採用jstack檢視執行緒堆疊資訊.

pstack 30265
Thread 7 (Thread 1084229984 (LWP 4552)): #0 0x000000302afc63dc in epoll_wait () from /lib64/tls/libc.so.6 #1 0x00000000006f0730 in ub::EPollEx::poll () #2 0x00000000006f172a in ub::NetReactor::callback () #3 0x00000000006fbbbb in ub::UBTask::CALLBACK () #4 0x000000302b80610a in start_thread () from /lib64/tls/libpthread.so.0 #5 0x000000302afc6003 in clone () from /lib64/tls/libc.so.6 #6 0x0000000000000000 in ?? () 
Thread 6 (Thread 1094719840 (LWP 4553)): #0 0x000000302afc63dc in epoll_wait () from /lib64/tls/libc.so.6 #1 0x00000000006f0730 in ub::EPollEx::poll () #2 0x00000000006f172a in ub::NetReactor::callback () #3 0x00000000006fbbbb in ub::UBTask::CALLBACK () #4 0x000000302b80610a in start_thread () from /lib64/tls/libpthread.so.0 #5 0x000000302afc6003 in clone () from /lib64/tls/libc.so.6 #6 0x0000000000000000 in ?? () 
Thread 5 (Thread 1105209696 (LWP 4554)): #0 0x000000302b80baa5 in __nanosleep_nocancel () #1 0x000000000079e758 in comcm::ms_sleep () #2 0x00000000006c8581 in ub::UbClientManager::healthyCheck () #3 0x00000000006c8471 in ub::UbClientManager::start_healthy_check () #4 0x000000302b80610a in start_thread () from /lib64/tls/libpthread.so.0 #5 0x000000302afc6003 in clone () from /lib64/tls/libc.so.6 #6 0x0000000000000000 in ?? () 
Thread 4 (Thread 1115699552 (LWP 4555)): #0 0x000000302b80baa5 in __nanosleep_nocancel () #1 0x0000000000482b0e in armor::armor_check_thread () #2 0x000000302b80610a in start_thread () from /lib64/tls/libpthread.so.0 #3 0x000000302afc6003 in clone () from /lib64/tls/libc.so.6 #4 0x0000000000000000 in ?? () 
Thread 3 (Thread 1126189408 (LWP 4556)): #0 0x000000302af8f1a5 in __nanosleep_nocancel () from /lib64/tls/libc.so.6 #1 0x000000302af8f010 in sleep () from /lib64/tls/libc.so.6 #2 0x000000000044c972 in Business_config_manager::run () #3 0x0000000000457b83 in Thread::run_thread () #4 0x000000302b80610a in start_thread () from /lib64/tls/libpthread.so.0 #5 0x000000302afc6003 in clone () from /lib64/tls/libc.so.6 #6 0x0000000000000000 in ?? () 
Thread 2 (Thread 1136679264 (LWP 4557)): #0 0x000000302af8f1a5 in __nanosleep_nocancel () from /lib64/tls/libc.so.6 #1 0x000000302af8f010 in sleep () from /lib64/tls/libc.so.6 #2 0x00000000004524bb in Process_thread::sleep_period () #3 0x0000000000452641 in Process_thread::run () #4 0x0000000000457b83 in Thread::run_thread () #5 0x000000302b80610a in start_thread () from /lib64/tls/libpthread.so.0 #6 0x000000302afc6003 in clone () from /lib64/tls/libc.so.6 #7 0x0000000000000000 in ?? () 
Thread 1 (Thread 182894129792 (LWP 4551)): #0 0x000000302af8f1a5 in __nanosleep_nocancel () from /lib64/tls/libc.so.6 #1 0x000000302af8f010 in sleep () from /lib64/tls/libc.so.6 #2 0x0000000000420d79 in Ad_preprocess::run () #3 0x0000000000450ad0 in main ()
jstack
Full thread dump Java HotSpot(TM) 64-Bit Server VM (20.45-b01 mixed mode):

"Attach Listener" daemon prio=10 tid=0x0000000054995000 nid=0x69b6 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"p: default-threadpool; w: Idle" daemon prio=10 tid=0x00002aaab02b5800 nid=0x7f11 in Object.wait() [0x0000000040dbe000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x000000078000d188> (a com.sun.corba.se.impl.orbutil.threadpool.WorkQueueImpl)
        at com.sun.corba.se.impl.orbutil.threadpool.WorkQueueImpl.requestWork(WorkQueueImpl.java:121)
        - locked <0x000000078000d188> (a com.sun.corba.se.impl.orbutil.threadpool.WorkQueueImpl)
        at com.sun.corba.se.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThread.run(ThreadPoolImpl.java:484)

"MultiThreadedHttpConnectionManager cleanup" daemon prio=10 tid=0x0000000054c58000 nid=0x7b6a in Object.wait() [0x00000000439e1000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x0000000780004078> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:118)
        - locked <0x0000000780004078> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:134)
        at org.apache.commons.httpclient.MultiThreadedHttpConnectionManager$ReferenceQueueThread.run(MultiThreadedHttpConnectionManager.java:1122)

"Thread-6" prio=10 tid=0x00002aaab0753000 nid=0x7b47 waiting on condition [0x00000000438e0000]
   java.lang.Thread.State: WAITING (parking)
        at sun.misc.Unsafe.park(Native Method)
        - parking to wait for  <0x0000000780000108> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
        at java.util.concurrent.locks.LockSupport.park(LockSupport.java:156)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1987)
        at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:399)
        at com.linkage.serv.hwcall.HWCallMessageSender$1.run(HWCallMessageSender.java:33)

"Thread-4" daemon prio=10 tid=0x0000000054aa8800 nid=0x7b45 waiting on condition [0x00000000437df000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
        at java.lang.Thread.sleep(Native Method)
        at com.linkage.system.utils.corba.CorbaService$NSHeartbeat.run(CorbaService.java:793)

"p: default-threadpool; w: Idle" daemon prio=10 tid=0x00002aaab029e800 nid=0x7b44 in Object.wait() [0x00000000436de000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x000000078000d188> (a com.sun.corba.se.impl.orbutil.threadpool.WorkQueueImpl)
        at com.sun.corba.se.impl.orbutil.threadpool.WorkQueueImpl.requestWork(WorkQueueImpl.java:121)
        - locked <0x000000078000d188> (a com.sun.corba.se.impl.orbutil.threadpool.WorkQueueImpl)
        at com.sun.corba.se.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThread.run(ThreadPoolImpl.java:484)

總結

時間有限,不贅述。

相關推薦

linux檢視程序執行資訊(pstree pstack jstack)

導言 在日常開發運維中,經常需要對程序及其執行緒資訊進行獲取,來排查記憶體溢位,死鎖,阻塞等問題。本文主要是檢視程序及其程序堆疊資訊 一.PSTREE pstree [-acGhlnpuUV][-H <程式識別碼>][<程式識別碼

Linux程序執行的概念以及區別

linux程序與執行緒的區別,早已成為IT界經常討論但熱度不減的話題。無論你是初級程式設計師,還是資深專家,都應該考慮過這個問題,只是層次角度不同罷了。對於一般的程式設計師,搞清楚二者的概念並在工作中學會運用是其思考的主要問題;對於資深工程師,如何在系統層面實現兩種技術及其各自的效能和實現代價是其思考的主要問

Windows下檢視程序執行的相關工具

pslist是用命令列檢視程序/執行緒;ProcessExplorer是圖形化的檢視程序/執行緒。 ======================================================================================================

Linux程序執行的關係

一.基礎知識:執行緒和程序 按照教科書上的定義,程序是資源管理的最小單位,執行緒是程式執行的最小單位。在作業系統設計上,從程序演化出執行緒,最主要的目的就是更好的支援SMP以及減小(程序/執行緒)上下文切換開銷。 無論按照怎樣的分法,一個程序至少需要一個執行緒作為它的指令執行體,程序管理著資源(比如cpu、記

Linux系統學習】程序執行

程序執行新程式 程序等待 wait()函式 程序執行新程式 fork()/exec()組合是典型的Linux

LINUX作業系統知識:程序執行詳解

當一個程式開始執行後,在開始執行到執行完畢退出這段時間內,它在記憶體中的部分就叫稱作一個程序。 Linux 是一個多工的作業系統,也就是說,在同一時間內,可以有多個程序同時執行。我們大家常用的單CPU計算機實際上在一個時間片段內只能執行一條指令。   那麼Linux是如何實現多程序的同時執行的呢?原來Linu

Linux程序執行的區別 詳細總結

首先,簡要了解一下程序和執行緒。對於作業系統而言,程序是核心之核心,整個現代作業系統的根本,就是以程序為單位在執行任務。系統的管理架構也是基於程序層面的。在按下電源鍵之後,計算機就開始了複雜的啟動過程,此處有一個經典問題:當按下電源鍵之後,計算機如何把自己由靜止啟動起來的?本

linux裡的程序執行(上)

在學習linux的過程中,程序與執行緒可謂一對好兄弟,是必然要掌握的內容。 一:何所謂程序 何所謂執行緒         程序:程序(Process)是計算機中的程式關於某資料集合上的一次執行活動,是系統進行資源分配與排程的基本單位。         執行緒:執行緒是作

linux程序執行狀態檢視

檢查 使用 ps -fe |grep programname 檢視獲得程序的pid,再使用 ps -Lf pid 檢視對應程序下的執行緒數. 查詢資料發現可以通過設定 ulimit -s 來增加每程序執行緒數。 每程序可用執行緒數 = VIRT上限/stack size

Linux程序排程】程序執行的本質區別?

簡而言之,執行緒是程序的一部分,程序是程式的一部分。 異同: 1、程序是資源分配的基本單位,而執行緒是排程的基本單位; 2、程序與程序之間是獨立的,一個程序的異常終止不會影響其它程序,而執行緒與執行

Linux程序執行的區別

程序與執行緒的區別,早已經成為了經典問題。自執行緒概念誕生起,關於這個問題的討論就沒有停止過。無論是初級程式設計師,還是資深專家,都應該考慮過這個問題,只是層次角度不同罷了。一般程式設計師而言,搞清楚二者的概念,在工作實際中去運用成為了焦點。而資深工程師則在考慮系統層面如

Linux程序執行的區別——不要太經典

Linux程序與執行緒的區別 程序與執行緒的區別,早已經成為了經典問題。自執行緒概念誕生起,關於這個問題的討論就沒

12 認識程序執行 (進階)

認識程序與執行緒(python)   一段時間沒有更新部落格了,今天和大家講講關於 python 程序和執行緒的知識點。(個人心得,多多指教!) 階段一:併發與並行的深入理解 ​ 並行一定是併發,但併發不一定是並行。 ​ 並行是相對的,並行是絕對的。 1、關於並行與併發的問題引入: 問題一: 計算

程序執行的一個簡單解釋 --- 轉載

程序與執行緒的一個簡單解釋       ---  轉載自 阮一峰的部落格   程序(process)和執行緒(thread)是作業系統的基本概念,但是它們比較抽象,不容易掌握。 最近,我讀到一篇材料,發現有一個很好的

程序間,執行間的通訊方式及程序執行的區別

近日想總結下程序間,執行緒間的通訊方式,在網上搜索了下,感覺寫的很好,照搬過來,當做加深記憶。 幾種程序間的通訊方式 (1) 管道(pipe):管道是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有血緣關係的程序間使用。程序的血緣關係通常指父子程序關係。 (2)有名管道(named p

程序執行理解和關係

程序 執行緒的含義 程序就是一個程式在一個數據集上的一次動態執行過程。 程序一般由程式、資料集、程序控制塊三部分組成。我們編寫的程式用來描述程序要完成哪些功能以及如何完成;資料集則是程式在執行過程中所需要使用的資源;程序控制塊用來記錄程序的外部特徵,描述程序的執行變化過程,系統可以利用它

python程序執行小結

傳統方式是呼叫2個方法執行1個任務,方法按順序依次執行# -*- coding:utf-8 -*-import threadingimport timedef run(n): print('task',n) time.sleep(3)if __name__ == '__main__': ru

程序執行的理解

1.程序:也就是一個應用程式 2.執行緒:一個應用程式由多個執行緒組成,執行緒是程式執行的最小單元 3.多執行緒:同步完成多項任務   java中如何實現多執行緒: >第一種方法:   1.寫一個類繼承Thread,重寫run方法;run方法呼叫自己的執行緒   2.在呼叫方法之

Linux訊息佇列執行例項理解

相較於程序,執行緒不僅擁有程序的併發性,相互獨立等特點,更有佔用資源較少,效率高等特點。 建立執行緒 int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine)

程序執行(直接copy)

轉載自:https://www.cnblogs.com/zhehan54/p/6130030.html 在理解程序和執行緒概念之前首選要對併發有一定的感性認識,如果伺服器同一時間內只能服務於一個客戶端,其他客戶端都再那裡傻等的話,可見其效能的低下估計會被客戶罵出翔來,因此併發程式設計應運而生,併