zoukankan      html  css  js  c++  java
  • 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,可以具体查看到某个进程当前工作过程中占用的内存位置。

  • 相关阅读:
    Git:五、操作远程仓库
    Git:四、连接GitHub远程仓库
    Git:三、工作原理
    Git:二、本地文件操作
    Git:一、简介&安装Git 2.20.1——Mac&Win
    Web前端:博客美化:四、网易云音乐单曲播放器
    设计模式之代理模式(proxy pattern)
    OpenCC的编译与多语言使用
    唯一标识符漫谈
    vscode local attach 和 remote debug
  • 原文地址:https://www.cnblogs.com/chenxiaomeng/p/12018951.html
Copyright © 2011-2022 走看看