性能監控/優化系列——CPU相關

 CPU相關

1. 從下向上定位
     1.1 CUP監控(指令執行速度-單位時間內執行的指令條數, CUP緩存的miss率)
     1.2 OS的監控
     1.3 JVM的監控
       工具:Intel VTune or AMD’s CodeAnalyst Performance Analyzer(window/linux)
       選擇正確的CPU架構和平臺系統很重要,確認應用是否正運行在一個正確的CPU和系統架構上(涉及multiple cores per CPU and multiple hardware threads per core),每個hardware thread在OS看來就是一個processor。
       Oracle SPARC T-series CPU的特點:每個CPU包含多個核,每個核有4個hardware thread,任何時候只有一個hardware thread運行在clock cycle上,當發生latency events時(eg CPU MISS,那麼需要去內存取數據,相對於CPU會有延時),另外一個runnable的hardware thread就會進入下一個clock cycle,因此整體的執行效率要高。特別是有大量多線程運行的應用程序。它擁有slower clock rate。
      傳統的CPU的特點:每個CPU包含多個核,每個核僅有一個hardware thread或者是hyperthreaded cores,因此當latency events到來時會造成阻塞,從而clock cycle被浪費。另外,因爲hardware thread的有限性,會引起大量的線程上下文交換80000以上 clock cycles才能完成)。
2. User CPU utilization is the percent of time the application spends in application code.
3. kernel or system CPU utilization is the percent of time the application spends executing operating system kernel code on behalf of the application
4. 高的system CPU utilization暗示共享資源競爭激勵或IO設備交互過多
5. 對於計算密集型應用需要關注:instructions per clock(IPC)和 cycles per instruction(CPI),這個數據的獲取不好弄,沒有比較好的監控工具,爲了提高這種應用的性能主要是減少stalls量,提高CPU的緩存利用率。
6. stall的概念:它是停止運轉的意思,發生在當cpu執行時,所需要的數據卻不在寄存器或cache中,需要去裝載內存的數據,這期間有一個等待,這裏叫做stall。這個時間大概是several hundred clock cycles
7. 現代操作系統所提供的CPU利用率的數據包括了CPU的stall,實際上stall期間CPU並沒有工作。
8. CPU運行隊列的概念(vmstat查看):The run queue is where lightweight processes(linux下進程和線程是統一的,是輕量級進程的兩種形式) are held that are ready to run but are waiting for a CPU where it can execute,當準備執行的進程數多於處理器數時就會放入到運行隊中。一個長的運行隊列表明系統在飽和工作狀態。當運行隊列的長度4倍於虛擬處理器數或更大時,系統會出現明顯的遲緩,需要及時處理。方法一般兩個:1. 增加CPU數;2. 減少當個CPU的負載,其實質是reduces the number of active threads per virtual processor and as a result fewer lightweight processes build up in the run queue。當隊列長度達到處理器數的1倍時需要開始關注,但不需要處理。
9. 虛擬處理器數的概念:The number of virtual processors is the number of hardware threads on the system,它的值等於Runtime.availableProcessors()。
10.垃圾回收/優秀的算法和數據結構的重要性:reducing garbage collection frequency or alternative algorithms and data structures will result in fewer CPU instructions/ fewer CPU cycles to execute the same work。
11. 常用命令:vmstat/mpstat(列出多個CPU的情況)/top;pstack/jstack查看線程堆棧;如果一個Java進程的CPU使用率很高,命令 prstat -mL 5 can be mapped to a Java process and Java thread(s),然後再結合pstack 3897/2,/jstack命令就可以定位問題了。
Solarisprstat -mL 5命令:
Java代碼  收藏代碼
  1. PID USERNAME USR SYS TRP TFL DFL LCK SLP LAT VCX ICX SCL SIG PROC/LWPID  
  2. 3897 huntch 6.0 5.7 0.1 0.0 0.0 2.6 8.2 78 9K 8K 64K 0 java/2  
  3. 3897 huntch 4.9 4.8 0.0 0.0 0.0 59 0.0 31 6K 6K 76K 0 java/13  
  4. 3897 huntch 4.7 4.6 0.0 0.0 0.0 56 0.0 35 5K 6K 72K 0 java/14  
  5. 3917 huntch 7.4 1.5 0.0 0.0 0.0 3.8 53 34 5K 887 16K 0 java/28  
 
發現3897這個進程有三個輕量級進程2/13/14,現在可以通過pstack 3897/2查看這個輕量級進程2的線程堆棧:
Java代碼  收藏代碼
  1. ----------------- lwp# 2 / thread# 2 --------------------  
  2. fef085c7 _lwp_cond_signal (81f4200) + 7  
  3. feb45f04 __1cNObjectMonitorKExitEpilog6MpnGThread_pnMObjectWaiter__v_  
  4. (829f2d4, 806f800, e990d710) + 64  
  5. fe6e7e26 __1cNObjectMonitorEexit6MpnGThread__v_ (829f2d4, 806f800) + 4fe  
  6. fe6cabcb __1cSObjectSynchronizerJfast_exit6FpnHoopDesc_  
在linux下,top -H查看線程情況,包括CPU,內存等佔用情況。進入到top環境後,可以使用P來按照CPU排序,使用M按照內存排序。
 from: http://chinese-darren.iteye.com/blog/1752469
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章