如何计算某个kswap进程cpu占用率高的占用率

下次自动登录
现在的位置:
& 综合 & 正文
查看某个进程和线程的cpu使用率
在实际开发中发现有时自己开发的程序使用率非常的高, 以致于影响到机器上其他程序的正常运行. 这时我们该怎么办呢?
首先应该想到的, 也是最佳解决方法是找到进程中使用cpu最多的那个线程( 怎样找到cpu使用最多的线程, 暂不在这里讨论 ), 然后进行优化它. 当然还有另外一种就是限制程序的cpu使用率的峰值. 当进程的使用率达到限定的峰值时, 就让他睡眠 sleep( 0 ), 或者WaitForSingleObject. 注意这里提到的进程的cpu使用率其实进程中所有线程的cpu使用率的总和. 从这个意义上来说的话,其实限制某个进程的cpu使用率就是限制进程中线程的cpu使用率.
那么我们怎么得到线程的cpu的使用率呢?
可以使用系统提供的下列两个函数:
GetThreadTimes 和 GetProcessTimes . 这2个函数的详细信息可以参看msdn. 函数的最后2个参数返回的是进程/线程在内核模式和用户态模式运行的时间. 我们可以一定的时间间隔获取此2值和之前的获取的此2值做差值, 就得到线程/进程在该时间间隔内的运行在cpu上的时间, 用这个时间除以时间间隔就得到对应的cpu的使用率, 如运行时间是10ms, 时间间隔为1000ms, 那么cpu使用率就是1%了.
如果我们只是查看线程/进程的cpu使用率, 上述时间间隔可以大一些, 如可以是1秒以上, 如果是要控制其使用率则要尽可能的小一些, 否则等你下次监测的时候已经超过很多时间或者超出设置的峰值太多了.但是这个值到底是多长合适, 这个需要写具体的测试程序去测试.
以上描述的是怎么样获取进程和线程的, 也许有时需要整个系统的cpu使用率, 这个时候可以采用GetSystemTimes, 有了这个函数, 剩下的工作就和上面描述的一样.
&&&&推荐文章:
【上篇】【下篇】随笔 - 67&
文章 - 0&评论 - 32&trackbacks - 0
Linux下没有直接可以调用系统函数知道CPU占用和内存占用。那么如何知道CPU和内存信息呢。只有通过proc伪文件系统来实现。
proc伪文件就不介绍了,只说其中4个文件。一个是/proc/stat,/proc/meminfo,/proc/&pid&/status,/proc/&pid&/stat
/proc/stat:存放系统的CPU时间信息
该文件包含了所有CPU活动的信息,该文件中的所有值都是从系统启动开始累计到当前时刻。不同内核版本中该文件的格式可能不大一致,以下通过实例来说明数据该文件中各字段的含义。
实例数据:2.6.24-24版本上的
fjzag@fjzag-desktop:~$ cat /proc/stat
cpu 594 56 581 895 0 0
cpu0 855 17 576 661 0 0
cpu1 739 9 4 234 0 0
1 0 5 0 3 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
ctxt 1434984
processes 8113
procs_running 1
procs_blocked 0
第一行的数值表示的是CPU总的使用情况,所以我们只要用第一行的数字计算就可以了。下表解析第一行各数值的含义:
参数 解析(单位:jiffies)
(jiffies是内核中的一个全局变量,用来记录自系统启动一来产生的节拍数,在linux中,一个节拍大致可理解为操作系统进程调度的最小时间片,不同linux内核可能值有不同,通常在1ms到10ms之间)
user (38082) 从系统启动开始累计到当前时刻,处于用户态的运行时间,不包含 nice值为负进程。
nice (627) 从系统启动开始累计到当前时刻,nice值为负的进程所占用的CPU时间
system (27594) 从系统启动开始累计到当前时刻,处于核心态的运行时间
idle (893908) 从系统启动开始累计到当前时刻,除IO等待时间以外的其它等待时间iowait (12256) 从系统启动开始累计到当前时刻,IO等待时间(since 2.5.41)
irq (581) 从系统启动开始累计到当前时刻,硬中断时间(since 2.6.0-test4)
softirq (895) 从系统启动开始累计到当前时刻,软中断时间(since 2.6.0-test4)stealstolen(0) which is the time spent in other operating systems when running in a virtualized environment(since 2.6.11)
guest(0) which is the time spent running a virtual CPU for guest operating systems under the control of the Linux kernel(since 2.6.24)
结论2:总的cpu时间totalCpuTime = user + nice + system + idle + iowait + irq + softirq + stealstolen + guest
可以利用scanf,sscanf,fscanf读取这些信息,具体可以查man proc.我的程序中只取了前4个。
/proc/meminfo:存放系统的内存信息
[ubuntu@root ~]#cat /proc/meminfo MemTotal:&&&&&&& 2061616 kB
MemFree:&&&&&&&& 1093608 kB
Buffers:&&&&&&&&& 151140 kB
Cached:&&&&&&&&&& 479372 kB
SwapCached:&&&&&&&&&&& 0 kB
Active:&&&&&&&&&& 516964 kB
Inactive:&&&&&&&& 374672 kB
Active(anon):&&&& 261412 kB
Inactive(anon):&&&& 5604 kB
Active(file):&&&& 255552 kB
Inactive(file):&& 369068 kB
别的就不说了,主要看第一个MemTotal,系统总的物理内存,它比真实的物理内存要小一点
/proc/&pid&/status:存放进程的CPU时间信息以及一些综合信息
[ubuntu@root ~]#cat /proc/889/status
Name:&&& Xorg
State:&&& S (sleeping)
Tgid:&&& 889
Pid:&&& 889
PPid:&&& 881
TracerPid:&&& 0
Uid:&&& 0&&& 0&&& 0&&& 0
Gid:&&& 0&&& 0&&& 0&&& 0
FDSize:&&& 256
Groups:&&& VmPeak:&&&&&& 99036 kB
VmSize:&&&&&& 52424 kB
VmLck:&&&&&&&&&& 0 kB
VmHWM:&&&&&& 57004 kB
VmRSS:&&&&&& 45508 kB
VmData:&&&&&& 35668 kB
VmStk:&&&&&&&& 136 kB
VmExe:&&&&&&& 1660 kB
VmLib:&&&&&&& 6848 kB
VmPTE:&&&&&&&& 120 kB
VmPeak是占用虚拟内存的峰值,也就是最高的一个值,而且是虚拟内存,所以有时候会比物理内存要大。PS和TOP指令都是利用VmPeak计算内存占用的。
VmRSS是进程所占用的实际物理内存。
/proc/&pid&/stat:保存着进程的CPU信息。
[ubuntu@root ~]#cat /proc/889/stat
889 (Xorg) S 881 889 889
0 0 20 0 1 0 6 40
0 17 0 0 0 0 0 0
pid=889 进程号
utime=34943 该任务在用户态运行的时间,单位为jiffies
stime=12605 该任务在核心态运行的时间,单位为jiffies
cutime=0 所有已死线程在用户态运行的时间,单位为jiffies
cstime=0 所有已死在核心态运行的时间,单位为jiffies
可以利用scanf,sscanf,fscanf读取这些信息,具体可以查man proc.
结论3:进程的总Cpu时间processCpuTime = utime + stime + cutime + cstime,该值包括其所有线程的cpu时间。
以上这些数据都可以通过文件读取的方式,可以按照一行一行的读取,然后采用scanf,sscanf,fscanf获取信息。
占用内存的计算方法:
pmem = VmRSS / MemTotal * 100;
计算CPU占用的方法:
取一次processCpuTime1和totalCpuTime1;
间隔一段时间;
再取一次processCpuTime2和totalCpuTime2;
pcpu = 100 * (processCpuTime2 & processCpuTime1)/(totalCpuTime2 - totalCpuTime1);
1 get_cpu.h
3 #ifdef __cplusplus
4 extern "C"{
7 #define VMRSS_LINE 15//VMRSS所在行
8 #define PROCESS_ITEM 14//进程CPU时间开始的项数
10 typedef struct
//声明一个occupy的结构体
unsigned int
//从系统启动开始累计到当前时刻,处于用户态的运行时间,不包含 nice值为负进程。
unsigned int
//从系统启动开始累计到当前时刻,nice值为负的进程所占用的CPU时间
unsigned int//从系统启动开始累计到当前时刻,处于核心态的运行时间
unsigned int
//从系统启动开始累计到当前时刻,除IO等待时间以外的其它等待时间iowait (12256) 从系统启动开始累计到当前时刻,IO等待时间(since 2.5.41)
16 }total_cpu_occupy_t;
18 typedef struct
pid_//pid号
unsigned int
//该任务在用户态运行的时间,单位为jiffies
unsigned int
//该任务在核心态运行的时间,单位为jiffies
unsigned int//所有已死线程在用户态运行的时间,单位为jiffies
unsigned int
//所有已死在核心态运行的时间,单位为jiffies
25 }process_cpu_occupy_t;
int get_phy_mem(const pid_t p);//获取占用物理内存
int get_total_mem();//获取系统总内存
unsigned int get_cpu_total_occupy();//获取总的CPU时间
unsigned int get_cpu_process_occupy(const pid_t p);//获取进程的CPU时间
const char* get_items(const char* buffer,int ie);//取得缓冲区指定项的起始地址
extern float get_pcpu(pid_t p);//获取进程CPU占用
extern float get_pmem(pid_t p);//获取进程内存占用
extern int get_rmem(pid_t p);//获取真实物理内存
38 #ifdef __cplusplus
1 get_cpu.c
3 #include &stdio.h&
4 #include &stdlib.h&
5 #include &unistd.h&
6 #include &assert.h&
7 #include "get_cpu.h"
9 int get_phy_mem(const pid_t p)
char file[64] = {0};//文件名
//定义文件指针fd
char line_buff[256] = {0};
//读取行的缓冲区
sprintf(file,"/proc/%d/status",p);//文件中第11行包含着
fprintf (stderr, "current pid:%d\n", p);
fd = fopen (file, "r"); //以R读的方式打开文件再赋给指针fd
//获取vmrss:实际物理内存占用
char name[32];//存放项目名称
int//存放内存峰值大小
for (i=0;i&VMRSS_LINE-1;i++)
fgets (line_buff, sizeof(line_buff), fd);
}//读到第15行
fgets (line_buff, sizeof(line_buff), fd);//读取VmRSS这一行的数据,VmRSS在第15行
sscanf (line_buff, "%s %d", name,&vmrss);
fprintf (stderr, "====%s:%d====\n", name,vmrss);
fclose(fd);
//关闭文件fd
35 int get_rmem(pid_t p)
return get_phy_mem(p);
41 int get_total_mem()
char* file = "/proc/meminfo";//文件名
//定义文件指针fd
char line_buff[256] = {0};
//读取行的缓冲区
fd = fopen (file, "r"); //以R读的方式打开文件再赋给指针fd
//获取memtotal:总内存占用大小
char name[32];//存放项目名称
int//存放内存峰值大小
fgets (line_buff, sizeof(line_buff), fd);//读取memtotal这一行的数据,memtotal在第1行
sscanf (line_buff, "%s %d", name,&memtotal);
fprintf (stderr, "====%s:%d====\n", name,memtotal);
fclose(fd);
//关闭文件fd
60 float get_pmem(pid_t p)
int phy = get_phy_mem(p);
int total = get_total_mem();
float occupy = (phy*1.0)/(total*1.0);
fprintf(stderr,"====process mem occupy:%.6f\n====",occupy);
69 unsigned int get_cpu_process_occupy(const pid_t p)
char file[64] = {0};//文件名
process_cpu_occupy_
//定义文件指针fd
char line_buff[1024] = {0};
//读取行的缓冲区
sprintf(file,"/proc/%d/stat",p);//文件中第11行包含着
fprintf (stderr, "current pid:%d\n", p);
fd = fopen (file, "r"); //以R读的方式打开文件再赋给指针fd
fgets (line_buff, sizeof(line_buff), fd); //从fd文件中读取长度为buff的字符串再存到起始地址为buff这个空间里
sscanf(line_buff,"%u",&t.pid);//取得第一项
char* q = get_items(line_buff,PROCESS_ITEM);//取得从第14项开始的起始指针
sscanf(q,"%u %u %u %u",&t.utime,&t.stime,&t.cutime,&t.cstime);//格式化第14,15,16,17项
fprintf (stderr, "====pid%u:%u %u %u %u====\n", t.pid, t.utime,t.stime,t.cutime,t.cstime);
fclose(fd);
//关闭文件fd
return (t.utime + t.stime + t.cutime + t.cstime);
92 unsigned int get_cpu_total_occupy()
//定义文件指针fd
char buff[1024] = {0};
//定义局部变量buff数组为char类型大小为1024
total_cpu_occupy_
fd = fopen ("/proc/stat", "r"); //以R读的方式打开stat文件再赋给指针fd
fgets (buff, sizeof(buff), fd); //从fd文件中读取长度为buff的字符串再存到起始地址为buff这个空间里
/*下面是将buff的字符串根据参数format后转换为数据的结果存入相应的结构体参数 */
char name[16];//暂时用来存放字符串
sscanf (buff, "%s %u %u %u %u", name, &t.user, &t.nice,&t.system, &t.idle);
fprintf (stderr, "====%s:%u %u %u %u====\n", name, t.user, t.nice,t.system, t.idle);
fclose(fd);
//关闭文件fd
return (t.user + t.nice + t.system + t.idle);
111 float get_pcpu(pid_t p)
unsigned int totalcputime1,totalcputime2;
unsigned int procputime1,procputime2;
totalcputime1 = get_cpu_total_occupy();
procputime1 = get_cpu_process_occupy(p);
usleep(500000);//延迟500毫秒
totalcputime2 = get_cpu_total_occupy();
procputime2 = get_cpu_process_occupy(p);
float pcpu = 100.0*(procputime2 - procputime1)/(totalcputime2 - totalcputime1);
fprintf(stderr,"====pcpu:%.6f\n====",pcpu);
125 const char* get_items(const char* buffer,int ie)
assert(buffer);
char* p =//指向缓冲区
int len = strlen(buffer);
int count = 0;//统计空格数
if (1 == ie || ie & 1)
for (i=0; i& i++)
if (' ' == *p)
if (count == ie-1)
阅读(...) 评论()windows中计算进程CPU占用率(一) - CSDN博客
windows中计算进程CPU占用率(一)
1、Windows下CPU使用率的定义
CPU使用率:在任务管理器的刷新周期内CPU忙的时间与整个刷新周期的比值。
任务管理器默认的刷新周期是1s。
2、CPU使用率计算公式
根据CPU使用率的定义我们可以得出在某一段时间内总的CPU使用率的计算公式:
sysTime:表示该时间段内总的CPU时间=CPU处于用户态和内核态CPU时间的总和,即sysTime =kerneTimel + userTime(注:这里并不包括idleTime,因为当CPU处于空闲状态时,实在内核模式下运行System Idle Process这个进程,所以kernelTime实际上已经包含了idleTime);
idleTime:表示在该时间段内CPU处于空闲状态的时间;
CPU% = 1 – idleTime / sysTime * 100& =&& ( sysTime - idleTime ) / sysTime *100。
3、有关Cpu时间信息的获取方式
基本思想:通过JNI(/docs/books/jni/html/jniTOC.html)将底层原生API获取的有关进程、线程、总的CPU时间等信息回传给Java,然后上层再根据采集到数据以及以上的公式计算相关的CPU使用率。
涉及到原生API
说明(有关这些操作系统的原生API可以通过查询MSDN来进一步了解)
/en-us/library/default.aspx
GetSystemInfo
根据该方法返回的结构体数据结构SystemInfo中的dwNumberOfProcessors可以获取系统中地CPU个数。
OpenProcess
通过该方法可以获取指定进程ID的进程的句柄。
GetProcessTimes
根据OpenProcess方法回带的进程句柄,可以获取该进程的userTime和kernelTime。
OpenThread
通过该方法可以获取指定线程ID的线程的句柄。
GetThreadTimes
根据OpenThread方法回带的进程句柄,可以获取该线程的userTime和kernelTime(注:这里的线程与Java里面的线程示一一对应的)。
GetSystemTimes
获取总CPU时间idleTime、kernelTime、userTime(注:在多核情况下得到的是所有CPU的总和)。
4、Windows平台下CPU使用率的测试
线程级别CPU使用率监控
说明:在一台双CPU的主机上监控一个包含一个空循环子线程的一个进程。其中每一组数据的格式为:
&&&&&&&&&&&&&&&&&&&&&&&&&&&& 进程:进程CPU使用率
线程ID:CPU使用率
测试数据:
第1组数据:
进程:50&!--[if !supportAnnotations]--&&!--[endif]--&
&& 3680:50&!--[if !supportAnnotations]--&&!--[endif]--&
第2组数据:
第3组数据:
第4组数据:
第5组数据:
&& 3680:50
第6组数据:
第7组数据:
&& 3680:48
第8组数据:
&& 3680:49
第9组数据:
&& 3680:50
第10组数据:
第11组数据:
&& 3680:49
第12组数据:
&& 3680:49
数据分析:
&!--[if !supportLists]--&1.& &!--[endif]--&监控时所取得采样周期为1s,因为这个值与任务管理器的刷新频率一致。
&!--[if !supportLists]--&2.& &!--[endif]--&根据测试用例的的特殊性,被监控进程的CPU使用率在双CPU环境下被监控进程的CPU使用率的理论值应该为50%。
&!--[if !supportLists]--&3.& &!--[endif]--&根据测试用例的的特殊性,被监控进程的理论上应该是包含一个CPU使用率接近50%,而其他线程的CPU使用率接近0。
&!--[if !supportLists]--&4.& &!--[endif]--&由以上实际的测试数据,可以知道被监控进程的实际CPU使用率与理论值基本一致;
&!--[if !supportLists]--&5.& &!--[endif]--&根据以上测试数据,可知进程中各线程CPU使用率以及进程的CPU用率也符合理论上的分析,都是一个线程的CPU使用率接近50%,而其他线程的CPU使用率接近0;
补充说明:
&!--[if !supportLists]--&1.& &!--[endif]--&有关总的CPU使用率监控,由于采集到的数据不具备可比性,所以只能人工的在测试的时候对比程序得到的总的CPU使用率和由任务管理器中得到的CPU使用率。对比的结论是:基本上与任务管理器中得到的数据一致的。
&!--[if !supportLists]--&2.& &!--[endif]--&同理有关进程CPU使用率的监控,也只能人工的通过对比程序得到的进程CPU使用率和任务管理器以及JConsole中的数据。对比的结论是:基本上与任务管理器和JConsole中得到的数据一致的。
&!--[if !supportLists]--&3.& &!--[endif]--&在运行Windows平台下有关CPU使用率的监控功能,得将Win32CpuTimeUtil.dll这个动态链接库放到java.library.path目录之下。其中Win32CpuTimeUtil.dll使用C语言实现的。
5、参考文献
本文已收录于以下专栏:
相关文章推荐
一.   有关Windows平台下CPU使用率的计算
1. Windows下CPU使用率的定义
a)        CPU使用率:在任务管理器的刷新周期内CPU忙的时间与整个刷新周...
图中的例子不是很典型,典型的情况是:多数的linux系统在free命令后会发现free(剩余)的内存很少,而自己又没有开过多的程序或服务。
对于上述的情况,正确的解释是:linux的内存管理机制...
1、获取cpu占用情况
[root@localhost utx86]# top -n 1 |grep Cpu
Cpu(s): 1.9%us, 1.3%sy, 0.0%ni, 95.9%id, ...
转自:/xwj-pandababy/articles/2567498.html
在进程的性能数据采集过程中,经常用到的一个性能指标就是进程的cpu...
http://www.blogjava.net/fjzag/articles/317774.html
一.   有关Windows平台下CPU使用率的计算
1. Windows下...
windows中计算进程CPU占用率(二)
C++获得特定进程的CPU使用率,windows api实现。使用GetProcessTimes()获取特定进程的CPU占用率,代码封装为C++类以实现同时监视多个进程。
top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器。但是这样虽然看的东西多,但是闲的比较乱,并且从如此多的内容中找到我们所需要的也较...
他的最新文章
讲师:吴岸城
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)如何像任务管理器一样获取每个进程的CPU占用率和内存占用呢?【c++吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:294,093贴子:
如何像任务管理器一样获取每个进程的CPU占用率和内存占用呢?收藏
c++培训课程,美国上市公司&达内&出品c++课程,15年教学经验,总监级c++讲师亲授!!达内首创&先就业后付款&模式.名企项目总监授课,成就&稀缺级&c/c++软件工程师
up.继续求.
POSIX里有查看程序占用的CPU时间的函数吗?
具体的哪个函数?谢谢
求具体哪个API?
Win7 Pcwum.dllPcwCreateQuery
PcwAddQueryItem PcwCollectData
XP的路过..
登录百度帐号推荐应用CPU使用率的计算方法_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
CPU使用率的计算方法
你可能喜欢

我要回帖

更多关于 java进程占用cpu高 的文章

 

随机推荐