如何计算某个进程cpu占用率监控的占用率

新手园地& & & 硬件问题Linux系统管理Linux网络问题Linux环境编程Linux桌面系统国产LinuxBSD& & & BSD文档中心AIX& & & 新手入门& & & AIX文档中心& & & 资源下载& & & Power高级应用& & & IBM存储AS400Solaris& & & Solaris文档中心HP-UX& & & HP文档中心SCO UNIX& & & SCO文档中心互操作专区IRIXTru64 UNIXMac OS X门户网站运维集群和高可用服务器应用监控和防护虚拟化技术架构设计行业应用和管理服务器及硬件技术& & & 服务器资源下载云计算& & & 云计算文档中心& & & 云计算业界& & & 云计算资源下载存储备份& & & 存储文档中心& & & 存储业界& & & 存储资源下载& & & Symantec技术交流区安全技术网络技术& & & 网络技术文档中心C/C++& & & GUI编程& & & Functional编程内核源码& & & 内核问题移动开发& & & 移动开发技术资料ShellPerlJava& & & Java文档中心PHP& & & php文档中心Python& & & Python文档中心RubyCPU与编译器嵌入式开发驱动开发Web开发VoIP开发技术MySQL& & & MySQL文档中心SybaseOraclePostgreSQLDB2Informix数据仓库与数据挖掘NoSQL技术IT业界新闻与评论IT职业生涯& & & 猎头招聘IT图书与评论& & & CU技术图书大系& & & Linux书友会二手交易下载共享Linux文档专区IT培训与认证& & & 培训交流& & & 认证培训清茶斋投资理财运动地带快乐数码摄影& & & 摄影器材& & & 摄影比赛专区IT爱车族旅游天下站务交流版主会议室博客SNS站务交流区CU活动专区& & & Power活动专区& & & 拍卖交流区频道交流区
稍有积蓄, 积分 360, 距离下一级还需 140 积分
论坛徽章:2
本帖最后由 hitcser01 于
11:47 编辑
大家好,请教一个问题:top命令是怎样计算进程cpu占用率(%CPU)的?
看了下top的源码,发现实在看不懂 毕竟智商是硬伤。
自己google搜了一把,再参考stackoverflow上的方法:
从 /proc/stat & /proc/[pid]/stat 获取数据,一段时间内 进程的%cpu = (usertime + systime) / (total_usertime + total_systime)。
不过这个方法和top给出的结果相差很明显(偏低,top显示99.9%时,此方法才50%左右),怎么提高精度?
======================
用gdb跟踪调试,发现了计算方法。
top 3.3.9 (我的Linux发行版上,top属于procps-3.3.9包)
可以参考 top/top.c : 2186 Line procs_hlp(), 4598 Line task_show() case 'P_CPU' 处。
&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp
小富即安, 积分 3625, 距离下一级还需 1375 积分
论坛徽章:78
能差这么多,说明这个公式可能有问题hitcser01 发表于
大家好,请教一个问题:top命令是怎样计算进程cpu占用率(%CPU)的?
看了下top的源码,发现实在看不懂 ...
白手起家, 积分 2, 距离下一级还需 198 积分
论坛徽章:0
真心看不懂!&&好好学习!
稍有积蓄, 积分 360, 距离下一级还需 140 积分
论坛徽章:2
zsszss0000
网上那个方法是对的,错误在于我理解不对(没认真看)。
单个进程占用的时间的确可以用 user_time + sys_time,
但总时间除了 用户态、内核态 以外,还有其它消耗,具体参见 /proc/stat
谢谢提醒。
稍有积蓄, 积分 271, 距离下一级还需 229 积分
论坛徽章:4
楼主搞懂了?可以分享一下吗~详细讲讲,毕竟智商是我硬伤 回复
稍有积蓄, 积分 360, 距离下一级还需 140 积分
论坛徽章:2
对不起,才看到。
cpu占用率没有瞬间的概念,取一段时间作为样本,
从 /proc/stat & /proc/[pid]/stat 获取数据,这段时间内 进程的%cpu = 进程(usertime + systime) / 总时间。
进程的usertime + systime可以从&&/proc/[pid]/stat 获取;
系统的总时间有2种方法,
1. /proc/stat : 注意,系统的时间除了 用户态、内核态 以外,还有其它如nice时间,具体可以看 手册 man proc,这块我也记不清楚了,需要的话看看手册吧,或者查一查资料
2.采样开始、结束时直接调用 gettimeofday() ,再作差取总时间
PS:注意多核的情形,类似与top命令的irix mode off,系统的总时间还需要乘上核数。
北京皓辰网域网络信息技术有限公司. 版权所有 京ICP证:060528号 北京市公安局海淀分局网监中心备案编号:
广播电视节目制作经营许可证(京) 字第1234号
中国互联网协会会员&&联系我们:
感谢所有关心和支持过ChinaUnix的朋友们
转载本站内容请注明原作者名及出处帐号:密码:下次自动登录{url:/nForum/slist.json?uid=guest&root=list-section}{url:/nForum/nlist.json?uid=guest&root=list-section}
贴数:2&分页:hhh发信人: kingjerry (hhh), 信区: Python
标&&题: 请问在windows下如何使用python获取某个进程的cpu占用率
发信站: 水木社区 (Wed Nov 23 22:30:53 2011), 转信 && rt,不知道windows有没有类似ps的命令,或者提供一些python可以调用的系统接口,烦请
大家指教。
-- && ※ 来源:·水木社区 ·[FROM: 220.181.118.*]
qunshan发信人: qunshan (qunshan), 信区: Python
标&&题: Re: 请问在windows下如何使用python获取某个进程的cpu占用率
发信站: 水木社区 (Wed Nov 23 22:35:47 2011), 转信 &&
【 在 kingjerry (hhh) 的大作中提到: 】
: rt,不知道windows有没有类似ps的命令,或者提供一些python可以调用的系统接口,烦
: 大家指教。
&& -- && ※ 来源:·水木社区 ·[FROM: 222.94.113.*]
文章数:2&分页:/questions/527401/high-cpu-usage-by-the-system-process
在工作中,查看哪个进程占用过多CPU或内存不是那么简单的事,可能很多进程都依附于SYSTEM或是SVCHOST.EXE。
在工作中,查看哪个进程占用过多CPU或内存不是那么简单的事,可能很多进程都依附于SYSTEM或是SVCHOST.EXE。
那么,如何进一步查看呢?
被微软收购的 .就派上用场了。
Download and run it, then select the System process, right-click and select Properties:
Switch to the Threads tab (ignore the dialog box that mentions symbols):
This will show which file is using the excessive CPU usage, from which you can then attempt to diagnose it.
用云栖社区APP,舒服~
【云栖快讯】首届阿里巴巴中间件技术峰会,揭秘阿里10年分布式技术沉淀!阿里高可用体系核心缔造者、全链路压测创始人,DRDS与TDDL负责人等大咖出场,干货分享,不可错过!&&
为您提供简单高效、处理能力可弹性伸缩的计算服务,帮助您快速构建更稳定、安全的应用,提升运维效率,降低 IT 成本...
RDS是一种稳定可靠、可弹性伸缩的在线数据库服务。支持MySQL、SQL Server、PostgreSQL、高...
2017杭州云栖大会火热抢票
Loading...linux下如何监控一个进程的cpu使用率
我的图书馆
linux下如何监控一个进程的cpu使用率
一、问题的提出:前一阵子由于工作的需要正在学习关于系统资源监控方面的一些知识!由于本人的水平比较的有限,所以也是翻阅了比较多的书籍,包括查阅了top命令的源代码,大致上知道我们要获取的监控数据,完全可以从proc中读取出来,现为了简单的描述一下解决问题的过程,在这里我们假设有这样一个问题:如何监控firefox这个应用程序的cpu使用率?二、问题的分析:问题提出来了,我们应该如何着手呢?首先,我们通过查阅相关的资料知道了可以从proc中获取我们的数据。所以我就先去proc下面去看看我们要找的东西在哪里? 点击(此处)折叠或打开cd /procls我们会看到如下的一些东西: 点击(此处)折叠或打开1 62
cpuinfo modules10 16 19 39 75 crypto mounts01
76 devices mtrr19 3 768 diskstats net1 9 77 dma pagetypeinfo22
8 dri partitions26 21
driver sched_debug32
82 execdomains schedstat36
840 fb scsi39
885 filesystems self52
886 fs slabinfo56
889 interrupts softirqs60 0 890 iomem stat62
928 ioports swaps77
940 irq sys79
941 kallsyms sysrq-trigger81 22
kcore sysvipc88 7 967 key-users timer_list12 08 31 52 973 kmsg timer_stats90
977 kpagecount tty13 4 3249 54 acpi kpageflags uptime
asound latency_stats version140
buddyinfo loadavg version_signature33
bus locks vmallocinfo54
cgroups mdstat vmstat58 5 cmdline meminfo zoneinfo15 25
consoles misc这些都是一些什么玩意呢?看得有点晕,仔细看一下,这个有编号的就是我们系统中正在运行的进程的pid呀?我们们随便打开一个看看这编号的文件夹下面都是什么东西呢? 点击(此处)折叠或打开cd 1121我们会看到如下东西: 点击(此处)折叠或打开attr clear_refs cpuset fd limits mountinfo ns pagemap schedstat stat taskautogroup cmdline cwd fdinfo loginuid mounts oom_adj personality sessionid statm wchanauxv comm environ io maps mountstats oom_score root smaps statuscgroup coredump_filter exe latency mem net oom_score_adj sched stack syscall在里面我们可以看到一个叫做“stat”的文件,上网搜索一下这个文件内容,我们知道stat中记录了我们cpu的使用情况!这个真是大快人心呀,这么简单就把这个关键给找到了,下一步我们只需要找到firefox的进程id然后进入到目录下读取stat文件中的内容,然后按照之前有一篇文章(http://blog.chinaunix.net/uid--id-3255096.html)中记录的计算cpu使用率的方法,把它计算出来!我们不禁要问一下是不是这样问题就解决了呢?我们更一步的想一下,有两点值得我们注意:1、该进程pid目录下的stat文件记录的是该进程的cpu使用情况不假,但是假如该进程有子进程怎么办呢?2、就是上一篇文章的计算方法存在缺陷:就是他计算的是一个从开机都现在平均使用率,而我们更多是需要关注的是一个进程的实时的资源使用情况,如何获取一个实时的统计?显然到了这里我们要实现一个应用程序的资源使用情况的监控,必须要解决这两个问题:对于第一个问题,既然/proc下记录了所有进程的资源使用情况,我们是不是可以把一个进程的所有子进程的资源使用情况做和,就能够得到该进程的总的资源使用情况呢?答案是肯定的!但是如何来获取一个进程的子进程呢?更进一步来说如何通过一个进程的pid来获取它的所有子进程的pid呢?这显然是一个递归的问题,因为一个进程的子进程下还有可能会有子进程,我们通过什么样的方法才能把这些子进程都给他找出来呢?这里就用到了我们的shell命令: 点击(此处)折叠或打开ps h --ppid 2325 -o pid我们通过这个命令就可以得到进程2325的子进程,要得到一个进程的所有子进程我们只需要递归的执行这条命令就可以了,如何来递归的实现呢,其实并不是很困难,我们只需要写一个递归的函数,然后在里面循环的调用这条shell命令就行了: 点击(此处)折叠或打开void child(const pid_t pid, vector&pid_t& &pvec){&&&&FILE *file;&&&&char buf[MAXLINE];&&&&pid_t cpid;&&&&stringstream ss;&&&&stringstream shell;&&&&pvec.push_back(pid);&&&&shell.str("");&&&&shell.clear();&&&&shell && "ps h --ppid ";&&&&shell && pid;&&&&shell && " -o pid";&&&&file = popen(shell.str().c_str(),"r");&&&&if(file != NULL)&&&&{&&&&&&&&while(fgets(buf,MAXLINE,file) != NULL)&&&&&&&&{&&&&&&&&&&&&ss && buf;&&&&&&&&}&&&&&&&&while(ss && cpid)&&&&&&&&{&&&&&&&&&&&&child(cpid,pvec);&&&&&&&&}&&&&}}通过上述的执行之后我们就可以得到一个进程的所有子进程,这样就解决了第一个问题!下面来考虑第二个问题!既然我们要尽可能的得到一个实时的资源监控,我们就需要在一定的时间间隔之内不断的读取cpu的使用情况来计算cpu的使用率,既然stat中记录的是该进程启动开始到提取时刻的cpu使用情况,我们就需要记录上次监控的数据,然后两次做差!三、问题的实现:有了上面的分析我们来实现这个程序,就不算困难了:定义一个通用的资源监控对象: 点击(此处)折叠或打开/*&*当前版本:2.0&*作 者:ddx&*完成日期:日&*/#ifndef&&&&JSFPROBER_H#define JSFPROBER_H#include&string&using namespace std;class JsfProber{&&&&public:&&&&virtual double probe(){return 0.0;}&&&&virtual double probe(const pid_t pid){return 0.0;}&&&&string name;};JsfProber* getProber();#endif具体实现: 点击(此处)折叠或打开/*************************************************************************&&&&& File Name: jobcpuprober.cpp&&&&& Author: dongdaoxiang&&&&& Mail: dongdaoxiang@ncic.ac.cn &&&&& Created Time: 日 星期二 14时10分54秒&************************************************************************/#include &stdio.h&#include "jsfprober.h"#include &iostream&#include &vector&#include &sstream&#include &string&#include &cstring&using namespace std;#define MAXLINE 1024void child(const pid_t pid, vector&pid_t& &pvec){&&&&FILE *file;&&&&char buf[MAXLINE];&&&&pid_t cpid;&&&&stringstream ss;&&&&stringstream shell;&&&&pvec.push_back(pid);&&&&shell.str("");&&&&shell.clear();&&&&shell && "ps h --ppid ";&&&&shell && pid;&&&&shell && " -o pid";&&&&file = popen(shell.str().c_str(),"r");&&&&if(file != NULL)&&&&{&&&&&&&&while(fgets(buf,MAXLINE,file) != NULL)&&&&&&&&{&&&&&&&&&&&&ss && buf;&&&&&&&&}&&&&&&&&while(ss && cpid)&&&&&&&&{&&&&&&&&&&&&child(cpid,pvec);&&&&&&&&}&&&&}}class JobCpuProber:public JsfProber{&&&&public:&&&&&&&&JobCpuProber();&&&&&&&&double probe(const pid_t pid);&&&&private:&&&&&&&&string jobname;&&&&&&&&double ljobtotal;&&&&&&&&double ltotal;};JobCpuProber::JobCpuProber(){&&&&jobname = "jobname";&&&&ljobtotal = 0;&&&&ltotal = 0;}double JobCpuProber::probe(const pid_t pid){&&&&stringstream ss,shell;&&&&double cutime;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //current time job spending in user mode&&&&double cstime;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //current time job spending in sys mode&&&&double starttime; //the start time of the job&&&&double total = 0.0;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //the total cpu time&&&&double temp = 0.0;&&&&double cjobtotal = 0.0;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //the total job time&&&&double result = 0.0;&&&&FILE *file;&&&&vector&pid_t& pvec;&&&&char buf[MAXLINE];&&&&child(pid,pvec);&&&&for(vector&pid_t&::iterator it = pvec.begin(); it != pvec.end(); it++)&&&&{&&&&&&&&shell.str("");&&&&&&&&shell.clear();&&&&&&&&shell && "cat /proc/";&&&&&&&&shell && *it;&&&&&&&&shell && "/stat | cut -d ' ' -f14,15";&&&&&&&&file = popen(shell.str().c_str(),"r"); //get the process children's cutime cstime&&&&&&&&if(file == NULL)&&&&&&&&{&&&&&&&&&&&&cout && "popen err please check 83th row" && endl;&&&&&&&&&&&&return -1;&&&&&&&&}&&&&&&&&memset(buf,0,sizeof(char)*MAXLINE);&&&&&&&&ss.str("");&&&&&&&&ss.clear();&&&&&&&&if(fgets(buf,MAXLINE,file) != NULL)&&&&&&&&{&&&&&&&&&&&&ss && buf;&&&&&&&&}&&&&&&&&pclose(file);&&&&&&&&ss && cutime;&&&&&&&&ss && cstime;&&&&&&&&cjobtotal += cutime + cstime; //get the cjobtotal&&&&}&&&&shell.str("");&&&&shell.clear();&&&&shell && "grep -w cpu /proc/stat | cut -d ' ' -f3,4,5,6,7,8,9";&&&&file = popen(shell.str().c_str(),"r"); //get the total cpu time&&&&if(file == NULL)&&&&{&&&&&&&&cout && "popen err please check the 104th row!!" && endl;&&&&&&&&return -1;&&&&}&&&&memset(buf,0,sizeof(char)*MAXLINE);&&&&ss.str("");&&&&ss.clear();&&&&if(fgets(buf,MAXLINE,file) != NULL)&&&&{&&&&&&&&ss && buf;&&&&}&&&&while(ss && temp)&&&&{&&&&&&&&total += temp;&&&&}&&&&cout && "total: " && total && endl;&&&&cout && "cjobtotal: " && cjobtotal && endl;&&&&result = ((cjobtotal - ljobtotal)/(total - ltotal))*100; //calc the job cpurate &&&&ljobtotal = cjobtotal;&&&&ltotal = total;&&&&return result;}JsfProber* getProber(){&&&&JsfProber* p = new JobCpuProber();&&&&return p;}这样我们就实现了我们的监控,希望可以对大家有些启发!!!
TA的最新馆藏[转]&
喜欢该文的人也喜欢求大神帮助,怎么遍历进程CPU占用率?【易语言吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:139,387贴子:
求大神帮助,怎么遍历进程CPU占用率?收藏
1.设置一个"检查周期"(可修改设置),每隔一段时间(比如30秒)遍历进程,获取CPU占用率最高的进程信息2.如果某个进程最大CPU占用率大于65%,就监控该进程,有监控周期,可设置(比如监控15秒);如果没有一个进程CPU占用率大于65%,就等待下一次进程遍历“抽查”3.监控某进程CPU占用率一段时间(比如监控15秒),求其平均CPU占用率,如果平均值大于85%,就弹出对话框&"是否杀掉此进程?"&10秒等待选择,如果没有选择,默认杀掉此进程。并把进程信息名称、CPU占有率、路径位置、当前时间写到TXT文件保存下来;如果CPU占用率平均值小于85%,就停止监控它,并等待下一次进程遍历“抽查”Blue(Da Ba Dee) - eiffel 65
出多少钱?
不会,帮顶    ✎这是一个小尾巴,小尾巴,的尾巴叫小尾巴
我也不会,帮顶
开价。。。
登录百度帐号推荐应用

我要回帖

更多关于 linux查看进程占用cpu 的文章

 

随机推荐