国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

【VisualVM 簡明教程】(4): 分析CPU

ormsf / 594人閱讀

摘要:快照,帶線程命令,是顯示全部進程,是顯示線程,全格式輸出顯示進程樹,不加顯示所有實時快照推薦程度按數字從小到大。

有時候好好的程序放到生產服務器上一段時間后,就會發現服務器響應緩慢,進而進一步發現是cpu過高,于是就慌了,造成cpu過高的原因很多,不過大多是由于資源吃緊造成,例如:sql執行過慢,程序里存在死循環,數據庫連接未釋放,網絡阻塞導致的第三方框架代碼出現死循環,大量的操作導致死鎖等

案例:死循環造成CPU過高
public class CpuTest {
 
    public static void main(String[] args) throws InterruptedException {
        loop();
        endlessLoop();
    }
 
 
    public static void endlessLoop() throws InterruptedException {
 
        while (true) {
            System.out.println("hello world! loop!");
        }
    }
 
    public static void loop(){
        for (int i = 0; i < 10000; i++) {
            System.out.println("hello world! endless loop!");
        }
    }
}

分析點擊抽樣器->CPU->查看CPU樣例,發現endlessLoop()方法最耗CPU(這里有2個方法 loop和endlessLoop)

查看線程cpu耗時,發現main線程最耗時,點擊增量,可以從此刻觀察,cpu耗時的增長速率

查看線程dump,主要觀察main線程,發現main線程當前狀態下一直在執行CpuTest.endlessLoop(CpuTest.java:14),這里可以定位問題位置,同時細心的童鞋可以觀察看后面執行System.out.println("");方法是要先加鎖的。

截圖一段,我生產服務器(tomcat+springmvc)main線程的情況,其實只想說明web項目啟動的main方法在中間件里。

補充

VisualVm只能定位JVM的cpu情況,但是生產主機上不光是Java程序,這時我們要采取另外的方案。

1.看監控數據是否正常,cpu,mem。

CPU占用1.5左右(100-98.0id) 內存占用50%(435/100*100%=43.5%) 阿里云監控內存大小轉成實際占用內存大小,類似windows ,平均負載 0.1 差不多,其他幾個參數,這里暫不介紹。

2.假設異常,找到異常的PID。

這里推薦htop(清晰進程,線程,命令行,排序支持鼠標雙擊,過濾,kill程序,標記某個線程或者進程,安裝apt-get install htop)

如果你沒有服務器上安裝軟件的權限的話,就老老實實用top。通過top命令(默認3秒刷新,回車空格手動刷新,top -d 5 5秒刷新,也可以進入top后輸入d設置刷新時間,top -p 4360 監控指定進程),然后按X ,默認按照CPU%排序,查看系統運行情況,如果想強制按CPU 降序,則輸入大寫P,如果強制按內存降序,則輸入大寫M(top命令是交互式的)。

解讀
1).現在系統時間 10:18.44 ,系統一直運行了 131天16小時51分,當前有1個用戶登錄系統(相同賬號也算不同用戶),平均負載分別為0.00,0.01,0.05(分別為1分鐘,5分鐘,15分鐘的負載情況,load average是每隔5秒鐘檢查一次活躍的進程數,用特定的算法得到的數值,然后除以邏輯CPU數量,如果負載持續大于cpu個數,則表明負載過高) 。大概可以看出系統負載很低,運行狀態健康。

2).當前一共有103個進程,處于運行的有2個,處于休眠狀態的有101個,處于停止狀態的有0個,處于僵尸狀態的有0個。大概可以看出系統進程總數較少,環境比較單純,運行中的進程不多。

3).0.3 us 用戶空間占用CPU 0.3%,0.7 sy內核占用CPU 0.7%,0.0 ni改變過優先級的進程占用CPU的百分比,98.0 id空閑CPU的百分比為98.0,0.3 waIO等待所占用CPU的百分比為0.3,0.3 hi硬中斷(Hardware IRQ)占用CPU的百分比為0.3(外設給CPU的異步信號(中斷),例如:網卡收到數據包),0.0 si軟中斷占用cpu的百分比為0(軟件本身給操作系統內核的中斷信號,通常由硬中斷處理程序對操作系統內核的中斷),0.3 st 虛擬機被hypervisor偷去CPU的時間。

4).KiB Mem 代表內存占用,1016272 total 內存總的大小1g(以kb為單位),941492 used 使用中的內存總量為0.9g,74780 free空閑內存總量為74m(嚇一跳吧,才74M,這個不是實際剩余的內內存大小)115900 buffers緩存的內存量為115m,389836 cached cached大小380M。空閑內存總量只有74m,如果是windows去理解的話,此臺服務器已經快掛了,實際內存大小等于74M+ buffers+cached = 580m(哈哈,夠用,才占用一半呢), linux的內存管理和windows是不一樣的,Linux會借用空閑的內存當作磁盤緩存, 磁盤數據緩存會讓linux運行的更快,它永遠不會從程序中拿出內存,它沒有任何缺點,只是會混淆新手,如果你的應用程序需要更多的內存,他們會回收一部分用作磁盤數據緩存的物理內存,返回給應用程序,這個過程不需要啟動交換,磁盤緩存(Disk caching)是不能禁用的, 但是可以釋放磁盤緩存 1).只釋放pagecache(文件緩存) echo 1 > /proc/sys/vm/drop_caches 2).釋放dentries和inodes echo 2 > /proc/sys/vm/drop_caches 3).釋放pagecache,dentries和inodes echo 3 > /proc/sys/vm/drop_caches
具體原理可以查看linuxatemyram

我們利用free 進一步證實上面的內容


1).shared代表被線程共享的內存大小(大多數已經舍棄掉),buffer用來給塊設備做緩存(記錄文件系統的metadata和tracking in flight pages),cache緩存文件(第二次打開就很快),linux系統cached比較大,cached大小390m,buffers為110m。

2).435288代表 -buffers/cache (應用程序實際使用330m內存) 580984 代表 +buffers/cache(實際剩余內存大小580m)。

3).重要等式 total = used + free used(-buffers/cache) = used(Mem)-buffers(Mem)-cached(Mem) free(+buffers/cache) = free(Mem) + buffers(Mem) +cached(Mem)

4).free命令的值是從 /proc/meminfo 文件里讀到的。

5).Swap 交換區 總共大小 0 kb,已經使用0kb,釋放了0Kb,如果swap used > 0,則可以說明系統內存瓶頸了

6).內存總和 free -t 總和等于total(Mem) + total(Swap)。

7).一般常用命令 free -s 3 每3秒觀察一次內存使用情況。

占用cpu最高的進程是java,PID為28628,USER進程所有者root,PR優先級20,NI為0(負值優先級高,正值優先級低,PR=NI+20) ,VIRT進程使用虛擬內存1G(java進程最高只能占用到1G),RES進程實際使用的物理內存270M(不包含swap和shared),SHR共享內存大小5M,S進程狀態隨眠狀態(S睡眠,R運行,T停止或被跟蹤,Z僵尸,D不可中斷睡眠態),%CPU占用CPU 0.7%,%MEM占用內存27%,TIME+進程使用cpu的時間54分40.12秒。總體看java進程運行良好。

3.這里假設PID為16368的進程占用CPU比較高(因為做了多次實驗,所以PID沒辦法和上面的28628保持一致),
先用ps -ef | grep java,也可以用htop filter java,也可以jps -v 找到 java的進程ID 16368(只能查看當前用戶的java pid,不太建議使用,-v顯示詳細信息,也可以不加)


?代表終端設備未知,Sl代表休眠狀態多線程

Linux通過進程查看線程的方法 1).htop按t(顯示進程線程嵌套關系)和H(顯示線程) ,然后F4過濾進程名。2).ps -eLf | grep java(快照,帶線程命令,e是顯示全部進程,L是顯示線程,f全格式輸出) 3).pstree -p (顯示進程樹,不加pid顯示所有) 4).top -Hp (實時) 5).ps -T -p (快照) 推薦程度按數字從小到大

4.利用jstack 16368 > 2016-1-21.tdump (jstack是jdk自帶的生成java stack和native stack的工具) 把threaddump輸出到文件里,這里假設PID為16369(一般比進程號+1的是main線程,如果存在main線程貌似最先分配)的線程占用CPU最高,將其ID轉成16進制0x3ff1(使用命令 printf "%x " 16369 輸出3ff1)。

5.搜索threaddump文件,nid= 0x3ff1的線程堆棧,通過堆棧信息,就可以定位到占用CPU最高的代碼地方(這里是正常的)。

好啦,CPU沖高問題排查完畢,有了這樣的知識體系,以后完全可以舉一反三,coder君同時附上其他常用配合命令。

每隔一秒顯示新生代,老年代,持久代垃圾回收情況

jstat -gcutil 16368 1000ms 參考jstat -help,也可以查看遠程主機的GC情況,需要遠程主機開啟jstatd服務。

觀察堆內存情況

jmap -dump:format=b,file=2016-1-21.mdump 16368 生成堆dump,放到mat或者vvm進行分析,上篇分析OOM有講到。

查看jvm系統參數

jinfo 16368

參考資料

性能分析神器VisualVM

vvm命令

感謝您的耐心閱讀,如果您發現文章中有一些沒表述清楚的,或者是不對的地方,請給我留言,你的鼓勵是作者寫作最大的動力,
如果您認為本文質量不錯,讀后覺得收獲很大,不妨小額贊助我一下,讓我更有動力繼續寫出高質量的文章。

支付寶

微信

作 者 : @mousycoder

原文出處 : http://mousycoder.com/2016/02...

創作時間:2016-2-14

更新時間:2016-2-14

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/65479.html

相關文章

  • VisualVM 簡明教程】(5): 分析線程

    摘要:是代表的主機第一個請求服務,使用線程池,生成一個單獨的線程來處理請請求。單個線程詳細的數據查看線程的堆棧生成某個時刻的線程這些線程的來由一清二楚,很快就能定位問題所在。 VisualVM提供分析圖形化監控線程的運行狀態,有時候可能不是我們自己代碼沒寫好造成資源的浪費,而是系統引入了很多第三方包(也包括容器)的時候,他們可能私自建立線程,如果邏輯處理不當,可能會造成資源的浪費。 以下均用...

    Prasanta 評論0 收藏0
  • JVM詳解3.JDK監控和故障處理工具

    摘要:點擊進入我的博客命令行工具這些工具大多數是類庫的一層薄的包裝,它們的主要功能代碼是在類庫中實現的。可視化工具是到目前為止隨發布的功能最強大的運行監視和故障處理程序,并且可以預見在未來一段時間內都是官方主力發展的虛擬機故障處理工具。 點擊進入我的博客 3.1 JDK命令行工具 showImg(https://segmentfault.com/img/remote/14600000174...

    Keven 評論0 收藏0
  • 細述 Java垃圾回收機制→Java Garbage Collection Monitoring a

    摘要:垃圾回收監控和分析工具是在安裝時免費提供的。監控現在可以監控垃圾回收過程了。至少我們可以知道程序中存在和對象內存分配和垃圾回收相關的問題。到此為止,關于垃圾回收的系列文章已經完結了。 本文非原創,翻譯自Java Garbage Collection Monitoring and Analysis在Java中為對象分配和釋放內存空間都是由垃圾回收線程自動執行完成的。和C語言不一樣的是Ja...

    xuhong 評論0 收藏0
  • 使用JDK自帶的VisualVM進行Java程序的性能分析

    摘要:是什么是自帶的一個用于程序性能分析的工具,安裝完畢后就有啦,在安裝目錄的文件夾下能找到名稱為。假設我自己實現了一個快速排序算法,我想測一測它的性能。首先我在下圖代碼第行執行我的快速排序算法之處設置一個斷點。回到,按結束應用程序的執行。 VisualVM是什么? showImg(https://segmentfault.com/img/remote/1460000016730111); ...

    piapia 評論0 收藏0
  • VisualVM 簡明教程】(6): 檢測死鎖

    摘要:并且分別給出了,線程的堆棧,就可以很快定位代碼。避免無限期等待當一個線程必須等待另外一個線程的時候,最好加上一個等待時間。 運行了一段時間的程序,可能因為不小心的一些修改,造成死鎖,本人就VisualVM簡單的介紹下死鎖的檢測。 死鎖程序 package jvisualVM; public class DeadLock { public static void main(S...

    oneasp 評論0 收藏0

發表評論

0條評論

ormsf

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<