1. 程式人生 > >linux程序和執行緒排查 · 記一次JVM CPU高負載的排查辦法

linux程序和執行緒排查 · 記一次JVM CPU高負載的排查辦法

前言通過本文,你將學會:1、linux上程序及程序中執行緒排查的基本方法,如檢視程序中的執行緒數此文中的執行緒一般指輕量級程序。檢視所有程序資訊 top -H 加上-H這個選項啟動top,top一行顯示一個執行緒(指的是(輕量級)程序? )。否則,它一行顯示一個程序。先輸入top -p 20378 只顯示該程序的變化情況 ,但是在按H(shift + h)後,會顯示threads的資訊,但是總的CPU佔用之和遠小於沒按H之前的佔用之和。輕量級程序(LWP)輕量級程序(LWP)是一種實現多工的方法。與普通程序相比,LWP與其他程序共享所有(或大部分)它的邏輯地址空間和系統資源;與執行緒相比,LWP有它自己的程序識別符號,優先順序,狀態,以及棧和區域性儲存區,並和其他程序有著父子關係。後文中的LWP粗略認為是執行緒。LWP的一個重要作用是提供了一個使用者級執行緒實現的中間系統。LWP可以通過系統呼叫獲得核心提供的服務,因此,當一個使用者級執行緒執行時,只需要將它連線到一個LWP上便可以具有核心支援執行緒的所有屬性。實驗觀察
某個時刻下的截圖個別時間下出現CPU佔用1000%,出現次數幾乎可以忽略。操作總結一般通過top -H定位想要具體分析的Java程序對應的PID,此處為22564。htopinstall htop 一個比top更強大的命令,支援點選 %CPU %MEM後進行排序檢視程序下的執行緒資訊兩種命令ps -Lf pid 檢視對應程序下的執行緒資訊pstree -p 22564 通過程序PID檢視程序下執行緒的PID上面兩個命令的缺點: 沒有執行緒佔用資源的資訊ps -Lf pid通過ps -Lf pid 檢視對應程序下的執行緒資訊 ,查到pid 22564下有1個程序(自身)+48個執行緒,如下圖所示:
上圖是截圖左半部分 上圖是截圖右半部分 pstree -p 22564 pstree -p 22564 通過程序PID檢視程序下執行緒的PIDps命令詳解ps –e | grep javaps命令可以檢視程序狀態,如執行如下命令:ps –e | grep java結果如下圖:可以看到,只打印了一個程序的資訊;27989是執行緒id,java是指執行的java命令。這是因為啟動一個tomcat,內部所有的工作都在這一個程序裡完成,包括主執行緒、垃圾回收執行緒、Acceptor執行緒、請求處理執行緒等等。ps –o nlwp 27989通過ps –o nlwp 27989
命令,可以看到該程序內有多少個執行緒;其中,nlwp含義是number of light-weight process。獲取真正在running的執行緒可以看到,該程序內部有73個執行緒;但是73並沒有排除處於idle狀態的執行緒。要想獲得真正在running的執行緒數量,可以通過以下語句完成:ps -eLo pid ,stat | grep 27989 | grep running | wc -l其中ps -eLo pid ,stat可以找出所有執行緒,並列印其所在的程序號和執行緒當前的狀態;兩個grep命令分別篩選程序號和執行緒狀態;wc統計個數。其中,ps -eLo pid ,stat | grep 27989輸出的結果如下: 圖中只截圖了部分結果;Sl表示大多數執行緒都處於空閒狀態。JVM CPU高負載的排查辦法 今天線上一個java程序cpu負載100%。按以下步驟查出原因。    1.執行top -c命令,找到cpu最高的程序的id    2.執行top -H -p pid,這個命令就能顯示剛剛找到的程序的所有執行緒的資源消耗情況。找到CPU負載高的執行緒pid 8627, 把這個數字轉換成16進位制,21B3(10進位制轉16進位制,用linux命令: printf %x 8627)。    3.執行jstack -l pid,拿到程序的執行緒dump檔案。這個命令會打出這個程序的所有執行緒的執行堆疊。    4.用記事本開啟這個檔案,搜尋“21B3”,就是搜一下16進位制顯示的執行緒id。搜到後,下面的堆疊就是這個執行緒打出來的。排查問題從這裡深入。    今天最後排查出來的結果是“VM THREAD”把程序的資源耗盡。那隻能說明是jvm在耗cpu。很容易想到是瘋狂的GC,按關鍵字 “overhead” 搜一下系統日誌, 發現 “java.lang.OutOfMemoryError: GC overhead limit exceeded”日誌。問題明瞭了。jvm在瘋狂的Full GC,而且有個大物件始終根節點路徑可達,無法釋放。dump了一下這個例項的記憶體,發現確實有大物件,佔用了一個多G的堆記憶體。

相關推薦

linux程序執行排查 · JVM CPU負載排查辦法

前言通過本文,你將學會:1、linux上程序及程序中執行緒排查的基本方法,如檢視程序中的執行緒數此文中的執行緒一般指輕量級程序。檢視所有程序資訊 top -H 加上-H這個選項啟動top,top一行顯示一個執行緒(指的是(輕量級)程序? )。否則,它一行顯示一個程序。先輸入

生產 CPU 負載排查實踐

前言 前幾日早上開啟郵箱收到一封監控報警郵件:某某 ip 伺服器 CPU 負載較高,請研發儘快排查解決,傳送時間正好是凌晨。 其

Linux程序執行關係淺析 (轉載)

  程序概念   程序是表示資源分配的基本單位,又是排程執行的基本單位。例如,使用者執行自己的程式,系統就建立一個程序,併為它分配資源,包括各種表格、記憶體空間、磁碟空間、I/O裝置等。然後,把該程序放人程序的就緒佇列。程序排程程式選中它,為它分配CPU以及其它有關資源,該程序才真正執行。所以,

Linux程序執行

目錄   程序 概念  程序建立fork--系統呼叫  程序ID  殭屍程序  孤兒程序  程序退出  等待子程序  exec函式族(接管一個程序的所有資源)  守護

linux 程序執行 對比

執行緒和程序 這個概念不管在什麼作業系統中都是一樣的,也是面試官比較喜歡問的,代表你對程式優化的功底,搞安卓的時候,經常被用來優化處理速度 還有資料的處理,結合handler 一起處理,解決經常出現介面死掉問題。 既然總結了,這一次充分總結下: 程序

JVM Metaspace溢出排查

jvm參數 oom task visualvm map 排除 創建 thread 類裝載 多圖預警! 環境:系統測試(Windows Server/JRE8/tomcat7) 現象:應用運行幾天後,出現訪問超時,服務器cpu利用率居高不下 問題日誌:OutOfMemory

linux問題排查 - cpu佔用率的程序執行

1.簡介           一個程式,完成它預設的功能,並不能說明它是一個優良的程式。好的程式,應該是對資源的合理利用,亦或是 用更少的資源(使用合理的演算法),實現更多有效的產出。 &

程序執行Linux下的程式設計

程序和執行緒及Linux下的程式設計 一、概述 程序和執行緒網路上有一堆解釋,我不喜歡抄襲,也不喜歡套用太教科書的說法。就以我自己的理解來說說程序和執行緒吧,當然自己的理解肯定不是很嚴謹,但是理解起來應該會比教科書快一點。程序和執行緒都可以認為是併發執行程式,但是隻有多處理器下的多執行緒

linux檢視程序所有子程序執行

linux檢視程序所有子程序和執行緒 原文連線:https://blog.csdn.net/uestczshen/article/details/74091892    問題: 我的程式在其內部建立並執行了多個執行緒,我怎樣才能在該程式建立執行緒後監控其中單個執行緒?

Linux系統程式設計——程序執行的區別與聯絡

在許多經典的作業系統教科書中,總是把程序定義為程式的執行例項,它並不執行什麼, 只是維護應用程式所需的各種資源,而執行緒則是真正的執行實體。 為了讓程序完成一定的工作,程序必須至少包含一個執行緒。 程序,直觀點說,儲存在硬碟上的程式執行以後,會在記憶體空間裡形成

linux程序執行狀態檢視

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

Linux程序執行同步的幾種方式

   引用:http://community.csdn.net/Expert/TopicView3.asp?id=4374496 linux下程序間通訊的幾種主要手段簡介:    1. 管道(Pipe)及有名管道(named pipe):管道可用於具有親緣關係程序間的通訊,有名管道克服了管道沒有名字的

三十七、Linux 執行——執行清理控制函式、程序執行啟動方式比較、執行的狀態轉換

37.1 執行緒清理和控制函式 1 #include <pthread.h> 2 3 void pthread_cleanup_push(void (* rtn)(void *), void *arg); 4 void pthread_cleanup_pop(int execute);

Java多執行記憶體模型():程序執行基礎

Java多執行緒和記憶體模型(一) 由於java是執行在 JVM上 的,所以需要涉及到 JVM 的記憶體模型概念,需要理解記憶體模型,就需要多執行緒的基礎; 而執行緒是基於載體執行緒裡的,所以我們藉由作業系統的程序來講一講。 程序 什麼是程序?

Java進階 ——— Java多執行)之程序執行

引言 講到執行緒,不可避免的提到程序。而因為執行緒無法脫離程序單獨存在,那什麼是程序? 延伸閱讀,Java多執行緒系列文章 什麼是程序? 程序:具有一定獨立功能的程式關於某個資料集合上的一次執行活動,程序是系統進行資源分配和排程的最小單位。 例如手機執行的眾多

程序執行(修改優先順序 Windows IPC 應用移植到 Linux)

當前,很多全球商務和服務都正在趨於開源 —— 業界的所有主要參與者都在爭取實現此目標。這一趨勢催生了一個重要的遷移模式:為不同平臺(Windows、OS2、Solaris 等)維持的現有產品將被移植到開放原始碼的 Linux 平臺。  很多應用程式在設計時並未考慮到需要將它們移植到 Linux。這有可能使移

linux核心學習之程序執行

Linux程序、執行緒問題 2010年8月15日,今天研究的是Linux的程序管理,昨天是記憶體定址,感慨頗深啊,《深入理解Linux核心》這本書真是浪得虛名,根本沒有說到問題的本質,一些概念的由來、定義、區別以及聯絡,技術的原理,執行過程,整體結構,各部分銜接等等問題統統

計算Linux系統程序執行CPU及記憶體使用率(c++原始碼)

proc檔案系統下的 /proc/stat, /proc/meminfo, /proc/<pid>/status, /proc/<pid>/stat 總的cpu時間totalCpuTime = user + nice+ system + idle +

linux命令實戰】Linux檢視程序的所有子程序執行

得到程序的pid: ps -ef | grep process_name | grep -v “grep” | awk ‘{print $2}’ 檢視程序的所有執行緒 ps mp 6648 -o THREAD,tid USER %CPU PRI SC

文帶你懟明白程序執行通訊原理

程序間通訊 程序是需要頻繁的和其他程序進行交流的。例如,在一個 shell 管道中,第一個程序的輸出必須傳遞給第二個程序,這樣沿著管道進行下去。因此,程序之間如果需要通訊的話,必須要使用一種良好的資料結構以至於不能被中斷。下面我們會一起討論有關 程序間通訊(Inter Process Communicatio