分享一个辅助分析内存泄漏的脚本

  最近给系统做了一点优化,前几天去查看系统监控,想看看上线前后cpu使用率曲线变化情况。查看的时候意外发现上线前后内存占用相差不少,20%以上。

本来我没怎么在意这个问题,因为我们系统会在运行过程中缓存部分数据内容。但客户觉得有异常,坚持要查。于是把一个月的内存使用情况调出来看,这一看就发现问题了:

  系统内存占用确实是在缓慢增加,一两天的内存使用率曲线看不出什么,但一个月的可以明显看出来,是一条斜率很小的直线。

  发现了有内存泄漏,但是想具体分析是哪个进程泄漏的还真不好办。因为我们系统有上千个进程在跑,而监控系统又只记录了总体内存占用情况,没记录单个进程内存占用。

  没有枪,没有炮,只能自己来造 :) 。 我设计了一个简单的分析方法:

  1 首先,我写一个脚本,每天定期记录系统所有进程使用情况,保存到文件,以时间戳命名。(用ps实现)

  2 脚本跑几天后,我再使用另一个脚本,把文件合并起来分析,把每个进程在不同时间点的内存使用情况合并成一行,逐个进程输出

  3 比较每个进程第一次出现与最后一次出现时占用内存之差,按从小到大排序,即可得出可能存在内存泄漏的程序。

  效果如下:可以看出这个进程内存占用一直在增加,从第一次统计到最后一次统计之间内存使用增加了1460k

  知道问题后就好办了,使用valgrind+gdb很快就找出导致内存泄漏的代码,纠正即可。

 

  下面是分析过程中用到的脚本,希望对大家有帮助

 1 # 20190228 hch 辅助分析程序内存泄漏情况的脚本
 2 # 设计思路:首先用ps定期采集所有程序占用内存情况,生成多个文件。然后使用awk分析ps输出的文件,把相同进程占用的内存合并成一行输出
 3 # 计算进程第一次和最后一次出现的时间点占用内存之差,逆序输出即可获得疑似内存泄漏的程序
 4 
 5 # 首先使用以下脚本采集程序每一分钟内存占用信息,采集若干分钟
 6 # while [ 1 ]; do ps -eo 'pid,comm,rsz,vsz,user,comm,args,pcpu,pmem' --sort rsz > ps_info_$(date "+%Y%m%d%H%M%S").txt ; sleep 60; done
 7 
 8 # 使用awk脚本分析内存占用信息 把进程每一个时间点的内存占用情况合并成一行方便对比
 9 # 并且统计进程第一次出现和最后一次出现占用内存差,输出
10 awk '{
11     # 每次处理一个新文件时需要特殊处理一下 
12     if (FNR == 1) {
13         # 登记文件名称
14         v_all_file_name = v_all_file_name "," FILENAME;
15         v_prefix_str = v_prefix_str ",";
16         ++v_file_cnt;
17         
18         # 把上次文件没有出现的pid补上
19         if (NR != 1) { # FNR == 1 && NR == 1 代表第一个文件
20             for (v_pid_name in v_mp_pid_cnt) {
21                 if (v_mp_pid_cnt[v_pid_name] != v_file_cnt - 1) {
22                     v_mp_pid_rsz[v_pid_name] = v_mp_pid_rsz[v_pid_name] ","
23                     v_mp_pid_vsz[v_pid_name] = v_mp_pid_vsz[v_pid_name] ","
24                     v_mp_pid_cnt[v_pid_name] = v_file_cnt - 1;
25                 }
26             }
27         }
28     }
29     
30     v_pid_name = $2 "-" $1 "-" $5; #程序名-进程号-用户名
31     # 非第一个文件,第一次出现,需要补齐","
32     if (v_file_cnt != 1 && v_mp_pid_cnt[v_pid_name] == 0) {
33         v_mp_pid_rsz[v_pid_name] = v_mp_pid_vsz[v_pid_name] = substr(v_prefix_str, 1, v_file_cnt - 1);
34         v_mp_pid_cnt[v_pid_name] = v_file_cnt - 1;
35     }
36     
37     # rsz是物理内存 单位k
38     v_mp_pid_rsz[v_pid_name] = v_mp_pid_rsz[v_pid_name] "," $3
39     # 记录最后值和初始值 方便后面分析(有需要可以改成最大和最小值)
40     #if ($3 > v_mp_pid_rsz_max[v_pid_name]) v_mp_pid_rsz_max[v_pid_name] = $3;
41     v_mp_pid_rsz_max[v_pid_name] = $3;
42     if (v_mp_pid_rsz_min[v_pid_name] == 0 ) # || $3 < v_mp_pid_rsz_min[v_pid_name]
43         v_mp_pid_rsz_min[v_pid_name] = $3;
44     
45     # vsz是虚存 单位k
46     v_mp_pid_vsz[v_pid_name] = v_mp_pid_vsz[v_pid_name] "," $4
47     v_mp_pid_vsz_max[v_pid_name] = $4;
48     if (v_mp_pid_vsz_min[v_pid_name] == 0 ) # || $4 < v_mp_pid_rsz_min[v_pid_name]
49         v_mp_pid_vsz_min[v_pid_name] = $4;
50         
51     # 在本文件出现过就标记一下,后面文件处理完后才知道哪些进程没出现
52     v_mp_pid_cnt[v_pid_name] = v_file_cnt;
53 }
54 END {
55     print v_all_file_name
56     for (v_pid_name in v_mp_pid_rsz) {
57         print "rsz:"v_pid_name, v_mp_pid_rsz_max[v_pid_name] - v_mp_pid_rsz_min[v_pid_name], v_mp_pid_rsz[v_pid_name]
58         print "vsz:"v_pid_name, v_mp_pid_vsz_max[v_pid_name] - v_mp_pid_vsz_min[v_pid_name], v_mp_pid_vsz[v_pid_name];
59     }
60 }' $(ls -rt ps_inf*txt) > ps_trace.txt #按时间逆序分析
61 
62 # 将分析结果排序输出
63 # sh ps_trace.sh; sork -k2n ps_trace.txt | tail -100

 

转载于:https://www.cnblogs.com/kingstarer/p/10504841.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 微软procdump32是一款用于生成进程转储文件的实用工具。通过使用procdump32,用户可以捕获正常运行或崩溃的进程的内存快照,以便进一步调试和分析。以下是procdump32的一些重要特点: 1. 进程转储:procdump32可以将进程的完整内存转储保存到一个文件中。这个文件包含了进程的当前内存状态,包括堆栈、寄存器以及其他关键信息。这个文件可以在之后由开发人员用于分析和调试。 2. 异常转储:如果一个进程发生异常或崩溃,procdump32可以自动捕获崩溃信息并生成转储文件。这个转储文件可以被用于分析程序为什么崩溃的原因,并帮助开发人员修复错误。 3. 高度可配置:procdump32提供了丰富的配置选项,例如指定进程异常时自动触发转储的阈值、转储文件的位置和格式等。这使得开发人员可以根据特定的需要调整工具的行为。 4. 命令行界面:procdump32支持命令行使用,可以通过命令行参数指定要转储的进程PID或名称。这使得工具可以很容易地集成到自动化脚本或其他调试工具中。 总的来说,微软procdump32是一个功能强大的进程转储工具。它可以帮助开发人员捕获进程的内存状态,使得调试和分析变得更加方便有效,从而提高开发效率和软件质量。 ### 回答2: Procdump32是微软开发的一款用于抓取进程的崩溃转储信息的实用工具。该工具可以在Windows操作系统上运行,并且提供了命令行界面,易于使用。 Procdump32的主要作用是在指定的进程崩溃时生成转储文件,用于分析程序崩溃的原因。它可以捕获进程的崩溃堆栈、寄存器以及其他相关信息,并将其保存在转储文件中。这些转储文件可以被开发人员或调试人员用于故障排除和问题分析。 除了捕获进程崩溃时的转储信息外,Procdump32还支持针对特定的性能指标、异常条件或CPU利用率等情况生成转储文件。用户可以根据需要配置这些转储规则,并在指定的条件满足时生成转储文件,以便进一步分析和调试问题。 Procdump32可以用于分析各种类型的进程崩溃,包括应用程序、驱动程序等。它是一个非常强大和实用的工具,特别适用于开发人员和系统管理员在诊断和解决应用程序崩溃问题时使用。 总之,微软的Procdump32是一款功能强大的工具,可以帮助用户捕获和分析进程崩溃的转储信息。它是一个重要的故障排除工具,可以提高应用程序的稳定性和可靠性。 ### 回答3: 微软procdump32是一款用于Windows操作系统的实用工具,它主要用于生成进程转储文件(Dump File)。进程转储文件是指在程序崩溃或出现异常时,记录下进程的内存状态、栈信息及其他相关的调试信息,以便后续进行分析和调试。 使用procdump32可以方便地监视和生成指定进程的转储文件。它提供了多种配置选项,通过命令行参数可以定义转储文件生成的条件和规则。例如,可以设置转储文件生成的触发条件,如进程崩溃、CPU占用、内存占用等;还可以设置生成转储文件的路径、文件名及格式;另外,它还支持生成多个目标进程的转储文件。 生成的转储文件可以在后续调试过程中使用。也可以使用procdump32配合其他调试工具,如WinDbg进行分析和诊断。这样可以在程序出现问题时,更方便地进行故障排查和问题定位。 微软procdump32工具的使用非常灵活且功能丰富,是许多开发人员和系统管理员进行故障排查的重要辅助工具。无论是定位内存泄漏、处理崩溃问题还是进行性能优化,都可以借助procdump32生成的转储文件来帮助快速定位问题根源和进行深入分析。 总而言之,微软procdump32是一款强大的进程转储文件生成工具,它在故障排查和开发调试中具有重要作用,可以帮助开发人员更快速地定位和解决各种问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值