c++ 对特定进程的内存监控

在工具实现的过程中,遇到了内存爆了的问题,部分模型的规模可以达到10的100次方方甚至1000次方。
(工具的主要算法涉及到了递归,递归深度会很深,所以也用到了ulimit修改栈空间来缓解爆栈的问题,治标不治本。)
有一个循环,这个循环迭代16次,但是可能程序在某一次迭代过程中,已经耗光了内存,再申请空间的时候,出现异常,导致将整个进程杀死。而我的想法是,当某一个迭代过程中,出现无法再申请内存的情况,就输出内存申请失败的提示信息,并跳过它,进行下一次的迭代,而不是将整个进程kill。

解决方法:
创建一个子线程,让它每隔1秒去检查 当前进程的内存占用,如果超过一定的比例,则跳过此次的迭代。
检查当前进程的内存占用,是用shell脚本实现的,使用shell脚本进行对内存的查询只需要两三行即可。
当执行shell脚本的时候,要获取其输出结果,也就是该进程的内存占用。
具体代码如下

 1 void detect_memory()
 2 {
 3
 4     for(;;)
 5     {
 6         FILE *pf;
 7         char buffer[20];
 8
 9         //执行内存检测脚本
10         pf = popen("sh detect_memory.sh", "r");
11
12         if(pf!=NULL){
13
14             //buffer:enPAC进程占用的内存(KB)
15             //fread 将pf指向的内容,读sizeof(buffer)个字节,读一次,读到buffer中
16             fread(buffer, sizeof(buffer), 1, pf);
17
18             //used:将buffer转成整型,单位为MB
19             short int used = atoi(buffer)/1024;
20             pclose(pf);
21
22             //判断enPAC占用的内存,超过一定比例,则将memory_flag=false
23             //同时break,让dfs()进行return,结束此公式的search
24             if(100*used/total_mem > 70)
25             {
26                 memory_flag = false;
27                 cout<<"detect memory over the size  given"<<endl;
28                 break;
29             }
30         }else{
31             cout<<"未能检测到enPAC进程所占内存"<<endl;
32             pclose(pf);
33         }
34
35         //每隔5秒,对enPAC占用内存进行查询
36         sleep(1);
37     }
38
39
40 }
41
42 detect_mem_thread = thread(&Product_Automata::detect_memory,this);  //创建一个子线程进行内存监控

注:popen总是和pclose一起出现被使用的。popen() 创建一个管道,通过fork或者invoke一个子进程,然后执行command。popen返回该FIFO数据流的指针。fread(buffer, sizeof(buffer), 1, pf),fread 将pf指向的内容,读sizeof(buffer)个字节,读一次,读到buffer中。

shell脚本如下:
#!/bin/bash
process="enPAC"        #进程名字
PID=$(ps x | grep $process | grep -v grep | awk ‘{print $1}‘)
size=` cat /proc/${PID}/status | grep RSS | tr -cd "[0-9]"`
echo $size

原文地址:https://www.cnblogs.com/tvtaqa/p/enPAC_note.html

时间: 2024-08-29 20:27:44

c++ 对特定进程的内存监控的相关文章

Linux下实现脚本监测特定进程占用内存情况

Linux系统下,我们可以利用以下命令来获取特定进程的运行情况: cat /proc/$PID/status 其中PID是具体的进程号,这个命令打印出/proc/特定进程/status文件的内容,信息比较多,包含了物理内存/虚拟内存的使用状况,监控进程是否有内存泄露的问题,一般查看进程占用物理内存的情况: VmRSS: xxxkB 可以采用grep命令过滤出我们需要的信息: cat /proc/$PID/status | grep RSS >> "$LOG" #过滤包含RS

如何分析进程的内存占用问题

一共推荐三种分析内存占用的方式 1.vmmap.exe 属于SysinternalsSuite中的工具,很强大,可以方便的查看特定进程的内存总大小(Size).内存的提交大小(Committed).内存专用工作集等(Private WS)等,也可以启动一个进程定时生成快照. 具体各名词介绍可以参考工具的help,或者参考如下文章: vmmap介绍与下载地址:https://technet.microsoft.com/en-us/sysinternals/vmmap vmmap用法介绍:http:

zabbix 监控特定进程

由于一些服务器上跑着一些重要程序,需要对它们进行监控,公司用的是zabbix监控,之前都是在zabbix中添加自定义脚本对特定程序进行监控,最近看了zabbix的官方文档,发现原来强大的zabbix居然能监控程序是否运行,并能监控其使用的内存大小,以下是我的实践记录: 1. 在特定机器或模板上创建新的监控项,点击Key 后面的Select 按钮,选择如下两项,一项是用来监控特定进程的数量,另一项是用来监控进程使用内存的大小. 2.以下是对squid进程的监控配置,key中的参数说明,第一个参数是

zabbix监控特定进程

由于一些服务器上跑着一些重要程序,需要对它们进行监控,公司用的是zabbix监控,之前都是在zabbix中添加自定义脚本对特定程序进行监控,最近看了zabbix的官方文档,发现原来强大的zabbix居然能监控程序是否运行,并能监控其使用的内存大小,以下是我的实践记录: 1.在特定机器或模板上创建新的监控项,点击Key 后面的Select 按钮,选择如下两项,一项是用来监控特定进程的数量,另一项是用来监控进程使用内存的大小. 2.以下是对squid进程的监控配置,key中的参数说明,第一个参数是进

zabbix监控windows服务器上进程的内存使用情况

zabbix监控windows服务器上进程的内存使用情况 由于在windows服务器上不能像linux上一样使用top,或者类似于/pro目录下的数据信息,所以在在windows服务器上获得一个进程的内存或者CPU的使用情况不是很容易. 这里通过在windows服务器上使用python脚本获得进程的内存使用值,通过key传递给zabbix客户端,也就是本机上安装的zabbix客户端. windows上安装zabbix客户端网上的文章很多,这里不再记录. 1,首先安装python环境: 点击这里下

进程内存监控

使用脚本监控指定进程内存占用,当进程占用内存超过设置阈值时,生成对应的coredump文件以及使用gdb命令输出进程的全部线程信息,从而保存进程在系统kill前进程信息,方便后续对内存急剧上涨的调试. #!/bin/bash #usage: nohup ./memcheck.sh > /dev/null 2>&1 & #set -x PROC_NAME="memchk_test" #进程名称 OUTPUT_PATH="/home/zhoulee/&

crond守护进程实现定时监控某进程占有内存的大小

1)添加计划任务 crontab -e会使用某个编辑器打开某个文件,然后在内输入需要执行的计划任务,保存后在/var/spool/cron/crontabs/下会出现以用户名命名的文件 2)计划任务如何添加 该文件中每行都包括六个域,其中前五个域是指定命令被执行的时间,最后一个域是要被执行的命令.    每个域之间使用空格或者制表符分隔.格式如下:  minute hour day-of-month month-of-year day-of-week commands 除了数字还有几个个特殊的符

使用Shell脚本对Linux系统和进程资源进行监控

ShellLinux脚本 摘要:Shell语言对于接触Linux的人来说都比较熟悉,它是系统的用户界面,提供了用户与内核进行交互操作的一种接口.本文我们以Bash做为实例总结了使用Shell对系统和进程资源进行监控的一些内容,希望对您能有帮助. Shell语言对于接触Linux的人来说都比较熟悉,它是系统的用户界面,提供了用户与内核进行交互操作的一种接口.它接收用户输入的命 令并把它送入内核去执行.实际上Shell是一个命令解释器,它解释由用户输入的命令并且把它们送到内核.它没有一般编程语言的“

使用 shell 脚本对 Linux 系统和进程资源进行监控

Shell 简介 Shell 语言对于接触 LINUX 的人来说都比较熟悉,它是系统的用户界面,提供了用户与内核进行交互操作的一种接口.它接收用户输入的命令并把它送入内核去执行.实际上 Shell 是一个命令解释器,它解释由用户输入的命令并且把它们送到内核.它没有一般编程语言的“编译 - 链接 - 运行”过程.不仅如此,Shell 有自己的编程语言用于对命令的编辑,它允许用户编写由 shell 命令组成的程序.Shell 编程语言具有普通编程语言的很多特点,比如它也有循环结构和分支控制结构等,用