Linux CPU問題排查


某個進程的內存占用情況

查找進程pid——>進入該進程的目錄/proc/{pid}/。有三個文件記錄了進程內存

root@ROUTER:~# ps | grep zebra
 1507 root      9504 S    /usr/sbin/zebra -d
30884 root      1324 S    grep zebra
root@ROUTER:~# cd /proc/1507
root@ROUTER:/proc/1507# cat stat
1507 (zebra) S 1 1505 1505 0 -1 4194624 170600 2189441 4 9 3679 4445 22287 35573 20 0 16 0 5745 9732096 1105 4294967295 65536 617472 2127216064 0 0 0 0 4102 1401024201 0 0 0 17 0 0 0 0 0 0 686220 910636 20680704 2127216310 2127216329 2127216329 2127216620 0
root@ROUTER:/proc/1507# cat statm
2376 1105 742 135 0 877 0
root@ROUTER:/proc/1507# 
root@ROUTER:/proc/1507# cat status
Name:	zebra
Umask:	0002
State:	S (sleeping)
Tgid:	1507
Ngid:	0
Pid:	1507
PPid:	1
TracerPid:	0
Uid:	0	0	0	0
Gid:	0	0	0	0
FDSize:	32
Groups:	0 
VmPeak:	    9920 kB
VmSize:	    9504 kB
VmLck:	       0 kB
VmPin:	       0 kB
VmHWM:	    4820 kB
VmRSS:	    4420 kB
RssAnon:	    1452 kB
RssFile:	    2952 kB
RssShmem:	      16 kB
VmData:	    3376 kB
VmStk:	     132 kB
VmExe:	     540 kB
VmLib:	    5224 kB
VmPTE:	      16 kB
VmPMD:	       0 kB
VmSwap:	       0 kB
Threads:	16
SigQ:	0/944
SigPnd:	0000000000000000
ShdPnd:	0000000000000000
SigBlk:	0000000000000000
SigIgn:	0000000200001006
SigCgt:	000000005381eec9
CapInh:	0000000000000000
CapPrm:	0000003fffffffff
CapEff:	0000003fffffffff
CapBnd:	0000003fffffffff
CapAmb:	0000000000000000
Cpus_allowed:	1
Cpus_allowed_list:	0
voluntary_ctxt_switches:	19498
nonvoluntary_ctxt_switches:	34374
root@ROUTER:/proc/1507# 

  

  1. 從status這個文件的幾個參數來說明。VmPeak和VmSize這兩個參數一致,VmPeak指的是當前進程運行過程中占用內存的峰值。VmSize指的是進程現在正在占用的內存。(這兩個值是否正常不應該一直都相等?因為如果一直都相等說明占用內存一直在升高?可以用這個現象來排查進程是否有內存泄露?)
  2. 在statm的第一個數字2376表示的也是進程內存占用,只是他是以Page表示,而VmSize以KB表示,1Page=4KB。stat的第23個字節vsize數值為643141632,看statm文件說明是說它單位也是Page,但是我們的linux版本顯示的單位是B。
  3. VmHWM是程序得到分配到物理內存的峰值。VmRSS是程序現在使用的物理內存。單位是KB。statm的第二個數字和stat的第24個數字都是單位為Page的占用內存值。
  4. VmRSS和VmSize的差別是什么?
  5. Threads: 16,表示這個進程有 16 個線程在運行。

怎么判斷系統內存是否泄漏?

root@ROUTER:/mnt/mmcblk0p1/home# free
             total       used       free     shared    buffers     cached
Mem:        417752     285236     132516      16544      64680      47324
-/+ buffers/cache:     173232     244520
Swap:            0          0          0

  

在linux中利用free命令查看free的情況,顯示出來的可用

內存=free+buffers+cached

即等於-/+ buffers/cache:一行中的第二個數值244520.這個才是實際可用的內存,當系統的free不夠時會將cached的內容轉向free。

所以查看系統內存是否泄漏,就是利用腳本定期打印可用內存的值,檢查一段時間后內存大小是否變小。

 

理解內存的分配機制

這個比較復雜,可以參考一個鏈接:https://www.cnblogs.com/ralap7/p/9184773.html

按照鏈接中描述的方式去理解當一個進程工作時,內存是如何分配的。然后通過查看/proc/{pid}/maps,可以具體查看到某個進程當前工作過程中占用的內存位置。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM