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 38082 627 27594 893908 12256 581 895 0 0

cpu0 22880 472 16855 430287 10617 576 661 0 0

cpu1 15202 154 10739 463620 1639 4 234 0 0

intr 120053 222 2686 0 1 1 0 5 0 3 0 0 0 47302 0 0 34194 29775 0 5019 845 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

btime 1252028243

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 1031 889 4202752 5307477 0 0 0 34943 12605 0 0
20 0 1 0 8146 89399296 11377 4294967295 134512640 136211844 3221201472
3221200460 5456930 0 0 3149824 1367369423 3223423286 0 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时间。

下面粘贴一下本人写的调用接口

//get_cpu.h

#ifndef __GET_CPU__
#define __GET_CPU__ #include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <unistd.h>
#include <assert.h>
#include <algorithm>
#include <vector>
#define PROCESS_ITEM 14 typedef struct
{
pid_t pid;
unsigned int utime; //live thread at user status (jiffies)
unsigned int stime; //live thread at kernel status
unsigned int cutime; //killed thread at user status
unsigned int cstime; //killed thread at kernel status
}process_cpu_occupy; vector<unsigned int>total_cpu_time; unsigned int get_cpu_process_occupy(const pid_t p);
const char* get_items(const char* buffer,int ie); extern float get_cpu(pid_t p);
extern unsigned int get_total_cpu(); #endif
//get_cpu.cc

#include "get_cpu.h"
const char* get_items(const char* buffer,int ie)
{
assert(buffer);
char* p = buffer;
int len = strlen(buffer);
int count = ;
int i; if ( == ie || ie < )
{
return p;
} for (i=; i<len; i++)
{
if (' ' == *p)
{
count++;
if (count == ie-)
{
p++;
break;
}
}
p++;
} return p;
}
unsigned int get_cpu_process_occupy(const pid_t p)
{
char file[] = {};
process_cpu_occupy t;
FILE *fd;
char line_buff[] = {}; sprintf(file,"/proc/%d/stat",p); fd = fopen (file, "r");
fgets (line_buff, sizeof(line_buff), fd);
sscanf(line_buff,"%u",&t.pid);
char* q = get_items(line_buff,PROCESS_ITEM);
sscanf(q,"%u %u %u %u",&t.utime,&t.stime,&t.cutime,&t.cstime); fclose(fd);
return (t.utime + t.stime + t.cutime + t.cstime);
}
unsigned int get_cpu(pid_t p,int index)
{
unsigned int procputime; procputime = get_cpu_process_occupy(p);
std::cout<<"procputime :"<<procputime<<endl; switch(index){
case :
total_cpu_time.clear();
total_cpu_time.push_back(procputime);
break;
case :
total_cpu_time.push_back(procputime);
break;
case :
total_cpu_time.push_back(procputime);
break;
default:
DSTREAM_WARN("index is errno");
break;
}
return procputime;
}
unsigned int get_total_cpu(){
int length=total_cpu_time.size();
unsigned int total_time=;
if(length != ){
DSTREAM_WARN("get total cpu failed");
return -;
}
for(int i=;i<length;i++){
total_time+=total_cpu_time[i];
}
return total_time;
}
#ifndef __GET_MEM__
#define __GET_MEM__ #include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <unistd.h>
#include <assert.h>
#include <algorithm>
#include <vector>
#define VMRSS_LINE 15 //VMRSS line vector<int>total_memory; int get_phy_mem(const pid_t p); extern int get_mem(pid_t p);
extern int get_total_memory();
extern int get_total_mem(); #endif
//get_mem.cc
#include "get_mem.h"
int get_phy_mem(const pid_t p)
{
char file[] = {}; FILE *fd;
char line_buff[] = {};
sprintf(file,"/proc/%d/status",p); fd = fopen (file, "r");
int i;
char name[];
int vmrss;
for (i=;i<VMRSS_LINE-;i++)
{
fgets (line_buff, sizeof(line_buff), fd);
}
fgets (line_buff, sizeof(line_buff), fd);
sscanf (line_buff, "%s %d", name,&vmrss);
fclose(fd);
return vmrss;
} int get_mem(pid_t p,int index)
{
int procmemory;
promemory=get_phy_mem(p);
switch(index){
case :
total_memory.clear();
total_memory.push_back(promemory);
break;
case :
total_memory.push_back(promemory);
break; case :
total_memory.push_back(promemory);
break;
default:
DSTREAM_WARN("index is errno");
break;
}
return promemory;
} //importer+aggregater+exporter
int get_total_memory(){
int length=total_memory.size(); int total_mem=;
if(length != ){
DSTREAM_WARN("get total cpu failed");
return -;
} for(int i=;i<length;i++){
total_mem+=total_memory[i];
}
return total_mem;
} //total memory
int get_all_mem()
{
char* file = "/proc/meminfo"; FILE *fd;
char line_buff[] = {};
fd = fopen (file, "r");
int i;
char name[];
int memtotal;
fgets (line_buff, sizeof(line_buff), fd);
sscanf (line_buff, "%s %d", name,&memtotal);
fclose(fd);
return memtotal;
}

计算进程消费cpu和内存的更多相关文章

  1. .NET/C# 如何获取当前进程的 CPU 和内存占用?如何获取全局 CPU 和内存占用?

    原文:.NET/C# 如何获取当前进程的 CPU 和内存占用?如何获取全局 CPU 和内存占用? 都知道可以在任务管理器中查看进程的 CPU 和内存占用,那么如何通过 .NET 编写代码的方式来获取到 ...

  2. 如何按名称或PID查找一个进程?如何按端口号查找一个进程?如何查看一个进程的CPU和内存、文件句柄使用情况?如何查看CPU利用率高的TOP10进程清单?如何根据PID强制终止进程?

    如何按名称或PID查找一个进程?如何按端口号查找一个进程?如何查看一个进程的CPU和内存.文件句柄使用情况?如何查看CPU利用率高的TOP10进程清单? 目录 如何按名称或PID查找一个进程?如何按端 ...

  3. Linux下计算进程的CPU占用和内存占用的编程方法[转]

    from:https://www.cnblogs.com/cxjchen/archive/2013/03/30/2990548.html Linux下没有直接可以调用系统函数知道CPU占用和内存占用. ...

  4. 查看进程在CPU和内存占用的命令

    1.使用top命令 输入M表示按内存排序,也就是RES这一列从大到小排序了 它占用了3.3%的内存,用134568除以4030416结果就是3.3左右 也就是说 总物理内存是3.84GB RES这一列 ...

  5. Python测试进阶——(5)Python程序监控指定进程的CPU和内存利用率

    用Python写了个简单的监控进程的脚本monitor190620.py,记录进程的CPU利用率和内存利用率到文件pid.csv中,分析进程运行数据用图表展示. 脚本的工作原理是这样的:脚本读取配置文 ...

  6. 监控单个进程占用cpu与内存的使用情况

    #!/bin/bashinterval=1if [ "$1" != "" ]then interval=$1fiecho "检查时间间隔(单位秒):& ...

  7. zabbix监控进程的CPU和内存占用量,进程数量

    由于需要对公司特定服务进行监控,于是,通过编写脚本获取各个进程占用系统资源的信息,从而使用zabbix采集到这些数据进行特定进程的基础监控. 我这主要需要监控的程序如下: nginx redis my ...

  8. C#获取特定进程CPU和内存使用率

    首先是获取特定进程对象,可以使用Process.GetProcesses()方法来获取系统中运行的所有进程,或者使用Process.GetCurrentProcess()方法来获取当前程序所对应的进程 ...

  9. linux下统计某个进程的CPU占用和内存使用

    为了测试是否有内存泄露,写了一个监控脚本,统计这个进程的cpu和内存 主要用了 ps aux命令, 很简单,不多解释了,上脚本 #!/bin/bash # while loop CpuMemStat= ...

随机推荐

  1. 内网转发ngrok的使用

    1.下载解压ngrok:https://ngrok.com/download 2.执行ngrok会打开控制台 3.输入命令,开始映射本地的8080端口 ngork http 8080 控制台会返回一个 ...

  2. javaScript绑定事件委托 demo

    事件绑定通常发生在 onload 或 DOMContentReady , 事件绑定占用 处理时间 占用内存, 而且不是每个事件都会被 点击执行. 由此 事件委托 可以优化事件绑定行为.. 事件逐层冒泡 ...

  3. Repaints and Reflows 重绘和重排版

    当浏览器下载完所有页面HTML标记,JavaScript,CSS,图片之后,它解析文件并创建两个内部数据 一棵DOM树 表示页面结构 Normal 0 7.8 磅 0 2 false false fa ...

  4. 【子非鱼】冒泡排序过程呈现之java内置GUI表示

    自己玩玩写写,排序的过程多么有趣,特别是把看着电脑吧一堆乱七八糟的数据排成有序组合的时候,看起来贼舒服,特别是强迫症患者.好了,话不多说上代码,也算是自己记录一下吧,没有什么技术含量但个人感觉比较有趣 ...

  5. (转)Uploadify 3.2 参数属性、事件、方法函数详解

    转自http://blog.sina.com.cn/s/blog_5079086b0101fkmh.html Hallelujah博客 一.属性 属性名称 默认值 说明 auto true 设置为tr ...

  6. RMQ问题(线段树算法,ST算法优化)

    RMQ (Range Minimum/Maximum Query)问题是指: 对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在[i,j]里的最小(大)值 ...

  7. [SinGuLaRiTy] 最短路计算代码库

    [SinGuLaRiTy-1002] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved. Dijkstra: 题目描述 有向图的单源点最短路问题( ...

  8. js数组的几个练习题

    第一次在博客园写文章,之前一直自己做记录.现在前端工作两年了,对前端整体技术有较清晰的了解.项目用了vue,react之类的写,如今打算从基础开始,慢慢深入了解原生的JS.这几天清明节,玩的嗨皮,最后 ...

  9. python_原始_web框架

    创:10_4_2017 修: 什么是web框架? -- 本质上是socket,用户请求来,业务逻辑处理,返回处理结果 -- 包含socket或者不包含socket的框架 什么是wsgi? -- web ...

  10. linux sed命令就是这么简单

    概述 sed命令是一个面向字符流的非交互式编辑器,也就是说sed不允许用户与它进行交互操作.sed是按行来处理文本内容的.在shell中,使用sed来批量修改文本内容是非常方便的. sed命令的选项 ...