当前位置: 技术问答>linux和unix
如何得到每个进程的CPU和内存占有量?进来看看proc/pid 下的cpu 和 status 中内容的意义,谢谢!
来源: 互联网 发布时间:2015-06-29
本文导语: 问题: 想得到linux下每个进程的CPU和内存占有量,因此在/proc下的每个进程目录中找信息,mem文件中经常为空,最后找到两个地方:cpu 和 status两个文件,但对其内容的意义不了解,请高手指点: cpu: 87 45 ...
问题:
想得到linux下每个进程的CPU和内存占有量,因此在/proc下的每个进程目录中找信息,mem文件中经常为空,最后找到两个地方:cpu 和 status两个文件,但对其内容的意义不了解,请高手指点:
cpu: 87 45 这是什么意思?应该取哪个?
status: 内容如下;
[root@node150 1]# more status
Name: init
State: S (sleeping)
Tgid: 1
Pid: 1
PPid: 0
TracerPid: 0
Uid: 0 0 0 0
Gid: 0 0 0 0
FDSize: 32
Groups:
VmSize: 1372 kB
VmLck: 0 kB
VmRSS: 480 kB
VmData: 36 kB
VmStk: 8 kB
VmExe: 24 kB
VmLib: 1276 kB
SigPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: ffffffffd7f0d8fc
SigCgt: 00000000280b2603
CapInh: 0000000000000000
CapPrm: 00000000ffffffff
CapEff: 00000000fffffeff
1、到底哪一项才是进程真正的内存占有量?
2、很多进程目录下的status文件中下面几项没有,是否意味着该进程内存占有为0?
VmSize: 1372 kB
VmLck: 0 kB
VmRSS: 480 kB
VmData: 36 kB
VmStk: 8 kB
VmExe: 24 kB
VmLib: 1276 kB
想得到linux下每个进程的CPU和内存占有量,因此在/proc下的每个进程目录中找信息,mem文件中经常为空,最后找到两个地方:cpu 和 status两个文件,但对其内容的意义不了解,请高手指点:
cpu: 87 45 这是什么意思?应该取哪个?
status: 内容如下;
[root@node150 1]# more status
Name: init
State: S (sleeping)
Tgid: 1
Pid: 1
PPid: 0
TracerPid: 0
Uid: 0 0 0 0
Gid: 0 0 0 0
FDSize: 32
Groups:
VmSize: 1372 kB
VmLck: 0 kB
VmRSS: 480 kB
VmData: 36 kB
VmStk: 8 kB
VmExe: 24 kB
VmLib: 1276 kB
SigPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: ffffffffd7f0d8fc
SigCgt: 00000000280b2603
CapInh: 0000000000000000
CapPrm: 00000000ffffffff
CapEff: 00000000fffffeff
1、到底哪一项才是进程真正的内存占有量?
2、很多进程目录下的status文件中下面几项没有,是否意味着该进程内存占有为0?
VmSize: 1372 kB
VmLck: 0 kB
VmRSS: 480 kB
VmData: 36 kB
VmStk: 8 kB
VmExe: 24 kB
VmLib: 1276 kB
|
int GetAppCrate(double* pdEffi, const char* szCmd)
{
FILE* fp;
char effi[12];
char line[128];
char cmdstring[64];
sprintf(cmdstring, "ps -C %s -o pcpu,cmd | grep %s", szCmd, szCmd);
if ( (fp = popen(cmdstring, "r")) == NULL ) /* fail to invoke popen() */
return -1;
*pdEffi = 0;
/* read first line */
while ( fgets(line, 128, fp) != NULL ) {
/* get first string in line */
if ( GetLineArg(line, effi, 0) == 0 ) {
*pdEffi += atof(effi);
}
}
pclose(fp);
return 0;
}
{
FILE* fp;
char effi[12];
char line[128];
char cmdstring[64];
sprintf(cmdstring, "ps -C %s -o pcpu,cmd | grep %s", szCmd, szCmd);
if ( (fp = popen(cmdstring, "r")) == NULL ) /* fail to invoke popen() */
return -1;
*pdEffi = 0;
/* read first line */
while ( fgets(line, 128, fp) != NULL ) {
/* get first string in line */
if ( GetLineArg(line, effi, 0) == 0 ) {
*pdEffi += atof(effi);
}
}
pclose(fp);
return 0;
}
|
87是user space运行时间,45是system space运行时间。应该取哪个要看你怎么算。
VmRSS: 480 kB是进程真正的内存占有量。
VmRSS: 480 kB是进程真正的内存占有量。
|
/* define process status */
#define PID_STATUS_D 0 /* uninterruptible sleep */
#define PID_STATUS_R 1 /* runing */
#define PID_STATUS_S 2 /* sleeping */
#define PID_STATUS_T 3 /* stoped */
#define PID_STATUS_Z 4 /* zombie */
static int IsDigitStr(const char* str)
{
int i;
for (i = 0; i
#define PID_STATUS_D 0 /* uninterruptible sleep */
#define PID_STATUS_R 1 /* runing */
#define PID_STATUS_S 2 /* sleeping */
#define PID_STATUS_T 3 /* stoped */
#define PID_STATUS_Z 4 /* zombie */
static int IsDigitStr(const char* str)
{
int i;
for (i = 0; i