Linux CPU问题排查
某个进程的内存占用情况
查找进程pid——>进入该进程的目录/proc/{pid}/。有三个文件记录了进程内存
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | 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 # |
- 从status这个文件的几个参数来说明。VmPeak和VmSize这两个参数一致,VmPeak指的是当前进程运行过程中占用内存的峰值。VmSize指的是进程现在正在占用的内存。(这两个值是否正常不应该一直都相等?因为如果一直都相等说明占用内存一直在升高?可以用这个现象来排查进程是否有内存泄露?)
- 在statm的第一个数字2376表示的也是进程内存占用,只是他是以Page表示,而VmSize以KB表示,1Page=4KB。stat的第23个字节vsize数值为643141632,看statm文件说明是说它单位也是Page,但是我们的linux版本显示的单位是B。
- VmHWM是程序得到分配到物理内存的峰值。VmRSS是程序现在使用的物理内存。单位是KB。statm的第二个数字和stat的第24个数字都是单位为Page的占用内存值。
- VmRSS和VmSize的差别是什么?
- Threads: 16,表示这个进程有 16 个线程在运行。
怎么判断系统内存是否泄漏?
1 2 3 4 5 | 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,可以具体查看到某个进程当前工作过程中占用的内存位置。
声明 欢迎转载,但请保留文章原始出处:) 博客园:https://www.cnblogs.com/chenxiaomeng/
如出现转载未声明 将追究法律责任~谢谢合作
分类:
性能测试
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具