编程获取linux的CPU使用的内存使用情况

Linux可用下top、ps命令检查当前的cpu、mem用法。下面简单的例子:

一、采用ps查看资源消耗的过程

ps -aux

当您查看进程信息,第三列是CPU入住。

[[email protected] utx86]# ps -aux | grep my_process

Warning: bad syntax, perhaps a bogus ‘-‘? See /usr/share/doc/procps-3.2.7/FAQ

root   14415  3.4  0.9   37436  20328  pts/12   SL+  14:18   0:05 ./my_process

root   14464  0.0   0.0   3852   572    pts/3    S+   14:20   0:00 grep my_process

每一列含义例如以下

USER   PID   %CPU %MEM  VSZ  RSS TTY  STAT   START  TIME   COMMAND

即my_process进程当前占用cpu 3.4%, 内存0.9%

二、top动态查看系统负荷

top -n 1

显示后退出

[[email protected] utx86]# top -n 1

top - 14:23:20 up  5:14, 14 users,  load average: 0.00, 0.04, 0.01

Tasks: 183 total,   1 running, 181 sleeping,   1 stopped,   0 zombie

Cpu(s):  1.8%us,  1.4%sy,  0.0%ni, 95.8%id,  0.7%wa,  0.1%hi,  0.2%si,  0.0%st

Mem:   2066240k total,  1507316k used,   558924k free,   190472k buffers

Swap:  2031608k total,       88k used,  2031520k free,  1087184k cached

1、获取cpu占用情况

[[email protected] utx86]# top -n 1 |grep Cpu

Cpu(s):  1.9%us,  1.3%sy,  0.0%ni, 95.9%id,  0.6%wa,  0.1%hi,  0.2%si,  0.0%st

解释:1.9%us是用户占用cpu情况

1.3%sy,是系统占用cpu情况

得到详细列的值:

[[email protected] utx86]# top -n 1 |grep Cpu | cut -d "," -f 1 | cut -d ":" -f 2

1.9%us

[[email protected] utx86]# top -n 1 |grep Cpu | cut -d "," -f 2

1.3%sy

2、获得内存占用情况

[[email protected] utx86]# top -n 1 |grep Mem

Mem:   2066240k total,  1515784k used,   550456k free,   195336k buffers

获得内存情况指定列

[[email protected] c++_zp]# top -n 1 |grep Mem | cut -d "," -f 1 | cut -d ":" -f 2

2066240k total

[[email protected] c++_zp]# top -n 1 |grep Mem | cut -d "," -f 2

1585676k used

三、编程实现

如今能够通过程序将cpu使用率、内存使用情况保存到文件里

// test.cpp

#include <stdio.h>

#include <unistd.h>

#include <stdlib.h>

int main()

{

system("top -n 1 |grep Cpu | cut -d \",\" -f 1 | cut -d \":\" -f 2 >cpu.txt");

system("top -n 1 |grep Cpu | cut -d \",\" -f 2 >>cpu.txt");

system("top -n 1 |grep Mem | cut -d \",\" -f 1 | cut -d \":\" -f 2 >>cpu.txt");

system("top -n 1 |grep Mem | cut -d \",\" -f 2 >>cpu.txt");

return 0;

}

编译、执行:

[[email protected] study]# g++ test.cpp

[[email protected] study]# ./a.out

[[email protected] study]# cat cpu.txt

2.1%us

1.5%sy

2066240k total

1619784k used

四、硬盘使用率编程实现

1.硬盘使用率 命令df -lh

2.程序实现。调用statfs

int statfs(const char *path, struct statfs *buf);

int fstatfs(int fd, struct statfs *buf);

struct statfs {

long    f_type;    /* type of filesystem (see below) */

long    f_bsize;    /* optimal transfer block size */

long    f_blocks;  /* total data blocks in file system */

long    f_bfree;    /* free blocks in fs */

long    f_bavail;  /* free blocks avail to non-superuser */

long    f_files;    /* total file nodes in file system */

long    f_ffree;    /* free file nodes in fs */

fsid_t  f_fsid;    /* file system id */

long    f_namelen;  /* maximum length of filenames */

};

int fstatvfs(int fildes, struct statvfs *buf);

int statvfs(const char *restrict path, struct statvfs *restrict buf);

struct statvfs {

unsigned long  f_bsize;    /* file system block size */

unsigned long  f_frsize;  /* fragment size */

fsblkcnt_t    f_blocks;  /* size of fs in f_frsize units */

fsblkcnt_t    f_bfree;    /* # free blocks */

fsblkcnt_t    f_bavail;  /* # free blocks for non-root */

fsfilcnt_t    f_files;    /* # inodes */

fsfilcnt_t    f_ffree;    /* # free inodes */

fsfilcnt_t    f_favail;  /* # free inodes for non-root */

unsigned long  f_fsid;    /* file system id */

unsigned long  f_flag;    /* mount flags */

unsigned long  f_namemax;  /* maximum filename length */

};

#include <sys/vfs.h>

#include <sys/statvfs.h>

#include <string.h>

#include <stdlib.h>

#include <stdio.h>

int gethd(char *path);

int main()

{

char buf[256],*ptr;

FILE *file;

while(1)

{

file=fopen("/etc/fstab","r");

if(!file)return;

memset(buf,0,sizeof(buf));

while(fgets(buf,sizeof(buf),file))

{

ptr=strtok(buf," ");

if(ptr&&((strncmp(ptr,"/dev",4)==0)))

{

ptr=strtok(NULL," ");

gethd(ptr);

}

}

fclose(file);

sleep(2);

}

}

int gethd(char *path)

{

struct statvfs stat1;

statvfs(path,&stat1);

if(stat1.f_flag)

printf("%s total=%dK free=%dK %0.1f%%

\n",path,stat1.f_bsize*stat1.f_blocks/1024,stat1.f_bsize*stat1.f_bfree/1024,

((float)stat1.f_blocks-(float)stat1.f_bfree)/(float)stat1.f_blocks*100);

}

shell

监视磁盘hda1

#!/bin/sh

# disk_mon

# monitor the disk space

# get percent column and strip off header row from df

LOOK_OUT=0

until [ "$LOOK_OUT" -gt "90" ]

do

LOOK_OUT=`df | grep /hda1 | awk ‘{print $5}‘ | sed ‘s/%//g‘`

echo $LOOK_OUT%

sleep 1

done

echo "Disk hda1 is nearly full!"

hdtest.sh

#!/bin/ksh

#检測硬盘剩余空间并警告的shell&nbspV050921

#简单说明: 可由root用户将此脚本增加crontab,启动时间一般最好设为每天营业前,当此脚本启动时如检測到已用硬盘空间超过指定范围,则将hdwarning.sh脚本复制到指定用户根文件夹下;否则将删除指定用户的文件夹下的hdwarning.sh脚本.

usedhd=80           #自己定义超限已用硬盘空间大小比例,默觉得80%

test "$1" &&&nbspuserdir=$1 ||&nbspuserdir=/usr/scabs  #前台用户的文件夹(默认设为统版用户),也可在调用此脚本时加上指定前台用户的文件夹參数

hdwarning=$(df&nbsp-v |sed 1d;s/.$//;s/\/dev\///|awk $6>‘"$usedhd"‘ {print $2," = ",$6"%"})

test "$hdwarning" && {&nbspcp /usr/bin/hdwarning.sh ${userdir}/hdwarning.sh  \

> ${userdir}/hdwarning.log &nbspchmod&nbsp777 ${userdir}/hdwarning.sh ${userdir}/hdwarning.log  } \

|| {&nbsprm ${userdir}/hdwarning.sh&nbsp2>/dev/null  \

mv ${userdir}/hdwarning.log ${userdir}/hdwarning.log.bak&nbsp2>/dev/null  }

hdwarning.sh

#!/bin/ksh

#检測硬盘剩余空间并警告的shell&nbspV050921

#添加当超标时,仅仅在预先指定的前N位预先的指定用户登录时才显示提示信息,

#即仅仅有这前面N位用户才有可能及时反馈,避免当超标时接到过多的前台反馈电话&nbspV050923

#请先编辑指定用户根下的&nbsp.profile ,在最后追加一行

# &nbsptest&nbsp-x&nbsphdwarning.sh && &nbsp./hdwarning.sh

#若.profile最后已增加了自启动专用程序命令行,则请在此行前面插入上述行

#简单说明: 当指定用户登录后,若当前文件夹中hdwarning.sh脚本存在(一般此

#时硬盘已用空间已经超标),则执行此脚本,并在屏幕显示警告信息,此时终端

#操作人员应该及时将此信息把馈给预先指定的部门或预先指定的管理人员,

#以便作对应的处理.若未超标或已清理磁盘文件并达标,则将删除脚本自身

#hdwarning.sh(取消登录时的检測和警告信息)

usedhd=80               #自己定义超限已用硬盘空间大小比例,默觉得80%

loginnum=10             #自己定义最初登录反馈的用户数,默觉得前&nbsp10 位

name="运维部"           #接受反馈的部门或管理人员

tel="2113714&nbsp2110394"   #接受反馈的部门或管理人员的联系方式或电话

test "$1" &&&nbspuserdir=$1 ||&nbspuserdir=/usr/scabs  #前台用户的文件夹(默认设为统版用户),也可在调用此

#脚本时加上指定前台用户的文件夹參数

hdwaring()

{&nbspttyname=$(tty)

echo ${ttyname##*

shell cpu====================================================================:

/proc目路下的内存文件系统映射了系统的执行时的一些信息。包含进程列表。

内存信息。CPU使用情况。还有网络等等

所以能够通过读/proc下的文件来实现统计信息的获取

可是。要注意的时不同的版本号,将/proc下的每个文件里的类容会有一些区别。每个项代表什么要自己分析,最好依据top的输出去分析

然后就能够通过shell教本或者C取得CPU使用率

比方:

我的机子是AS4(Kernel 2.6.9-5)

cat /proc/stat

cpu  1047871 11079 394341 1157538880 4909104 1945 61338

cpu0 352894 2950 157917 290318045 109839 0 49564

cpu1 234860 1978 115148 288108962 2522748 1028 6391

cpu2 106253 1674 52273 288601985 2225180 909 2839

cpu3 353863 4477 69001 290509888 51337 6 2543

intr 3021292348 2939335896 720 0 12 12 0 7 2 1 0 0 0 1951 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7217173 0 0 0 0 0 0 0 30 0 0 0 0 0 0 0 74736544 0 0 0 0 0 0 0 0
0 0 0 0 0

ctxt 379682110

btime 1158715143

processes 603543

procs_running 1

procs_blocked 0

然后就能够自己计算了

  1. #########GetCPU.sh
  2. ######Author:duanjigang
  3. #!/bin/sh
  4. while true
  5. do
  6. awk  ‘$1=="cpu"{Total=$2+$3+$4+$5+$6+$7;print "Free: " $5/Total*100"%
  7. " " Used: " (Total-$5)*100/Total"%"}‘ </proc/stat
  8. sleep 1
  9. done

复制代码

#./GetCPU.sh

Free: 99.4532% Used: 0.546814%

Free: 99.4532% Used: 0.546813%

Free: 99.4532% Used: 0.546813%

Free: 99.4532% Used: 0.546813%

这样应该能够的

shell cpu MEM====================================================================:

(1):取CPU使用率

机器:LinuxAS4 2.6.9-5.ELsmp (不通版本号的内核会有差异的)

  1. #cpu.sh-to get the utilization of every cpu
  2. #author:duanjigang<2006/12/28>
  3. #!/bin/sh
  4. awk ‘$0 ~/cpu[0-9]/‘ /proc/stat  | while read line
  5. do
  6. echo "$line" | awk ‘{total=$2+$3+$4+$5+$6+$7+$8;free=$5;\
  7. print$1" Free "free/total*100"%",\
  8. "Used " (total-free)/total*100"%"}‘
  9. done

复制代码

#chmod +x cpu.sh

#./cpu.sh

cpu0 Free 99.7804% Used 0.219622%

cpu1 Free 99.8515% Used 0.148521%

cpu2 Free 99.6632% Used 0.336765%

cpu3 Free 99.6241% Used 0.375855%

(2)网络流量情况

  1. #if.sh-to get the network flow of each interface
  2. #for my beloved ning
  3. #author:duanjigang<2006/12/28>
  4. #!/bin/sh
  5. echo "name    ByteRec   PackRec   ByteTran   PackTran"
  6. awk   ‘ NR>2‘ /proc/net/dev  | while read line
  7. do
  8. echo "$line" | awk -F ‘:‘ ‘{print "  "$1"  " $2}‘ |\
  9. awk ‘{print $1"   "$2 "    "$3"   "$10"  "$11}‘
  10. done

复制代码

#./if.sh

name    ByteRec   PackRec   ByteTran   PackTran

lo   2386061    17568   2386061  17568

eth0   1159936483    150753251   190980687  991835

eth1   0    0   0  0

sit0   0    0   0  0

(3):port情况

http://bbs.chinaunix.net/viewthread.php?tid=864757&highlight=duanjigang

(4)至于内存

cat /proc/meminfo | grep "MemTotal"

cat /rpco/meninfo  | grep "MemFree"

就能够了吧

计算内存利用率须要从/proc/meminfo文件里取对应数据。文件内容例如以下:

MemTotal:      1024008 kB

MemFree:         18448 kB

Buffers:         12664 kB

Cached:         282500 kB

SwapCached:        716 kB

Active:         816124 kB

Inactive:        52516 kB

HighTotal:      122500 kB

HighFree:          304 kB

… …

MemTotal数值表示内存总量。MemFree数值表示空余数量。

所以内存的即时利用率计算公式

(MemTotal - MemFree)/ MemTotal

安装上篇文章的原则,使用C语言写了一段程序来计算CPU和内存利用率:

/*************************************************************
le:        statusinfo.c
 *
 *    @brief:        从linux系统获取cpu及内存使用情况
 *
 *    @version    1.0
 *
 ***************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct PACKED         //定义一个cpu occupy的结构体
{
	char name[20];      //定义一个char类型的数组名name有20个元素
	unsigned int user; //定义一个无符号的int类型的user
	unsigned int nice; //定义一个无符号的int类型的nice
	unsigned int system;//定义一个无符号的int类型的system
	unsigned int idle; //定义一个无符号的int类型的idle
	unsigned int lowait;
	unsigned int irq;
	unsigned int softirq;
}CPU_OCCUPY;

typedef struct __MEM
{
//	unsigned char name[20];
	float total;
	float free;
	}MEM;

int get_meminfo()
{
	MEM meminfo;
	memset(&meminfo,0x00,sizeof(MEM));
	FILE* fp = fopen("/proc/meminfo","r");

	if(fp == NULL)
	{
		printf("Can not open file\r\n");
		return 0;
	}

	char buf[64];
	char name[32];
	memset(buf,0x00,sizeof(buf));
	fgets(buf,sizeof(buf),fp);
	sscanf(buf,"%s %f %s",name,&meminfo.total,name);
	memset(buf,0x00,sizeof(buf));
	fgets(buf,sizeof(buf),fp);
	sscanf(buf,"%s %f %s",name,&meminfo.free,name);
	printf("buf is %s  name is %s %f\r\n",buf,name,meminfo.free);
	float temp;

	sscanf(buf,"%s			%f %s",name,&temp,name);
	printf("temp is %f \r\n",temp);
	double rate = (meminfo.total - meminfo.free)/meminfo.total;
	printf("%f  %f	rate is %f\r\n",meminfo.total,meminfo.free,rate);
	fclose(fp);
	return 1;
}

int cal_cpuoccupy (CPU_OCCUPY *o, CPU_OCCUPY *n)
{
	unsigned long od, nd;
	unsigned long id, sd;
	double cpu_use = 0;   

	od = (unsigned long) (o->user + o->nice + o->system +o->idle + o->lowait + o->irq + o->softirq);//第一次(用户+优先级+系统+空暇)的时间再赋给od
	nd = (unsigned long) (n->user + n->nice + n->system +n->idle + n->lowait + n->irq + n->softirq);//第二次(用户+优先级+系统+空暇)的时间再赋给od

	double sum = nd - od;
	double idle = n->idle - o->idle;
	cpu_use = idle/sum;

	printf("%f\r\n",cpu_use);

	idle = n->user + n->system + n->nice -o->user - o->system- o->nice;
	cpu_use = idle/sum;

	printf("%f\r\n",cpu_use);
	return 0;
}

void get_cpuoccupy (CPU_OCCUPY *cpust) //对无类型get函数含有一个形參结构体类弄的指针O
{
	FILE *fd;
	int n;
	char buff[256];
	CPU_OCCUPY *cpu_occupy;
	cpu_occupy=cpust;

	fd = fopen ("/proc/stat", "r");
	fgets (buff, sizeof(buff), fd);
	printf("%s\r\n",buff);
	sscanf (buff, "%s %u %u %u %u %u %u %u", cpu_occupy->name, &cpu_occupy->user, &cpu_occupy->nice,&cpu_occupy->system, &cpu_occupy->idle,&cpu_occupy->lowait,&cpu_occupy->irq,&cpu_occupy->softirq);
	printf("%s %u %u %u %u %u %u %u\r\n", cpu_occupy->name,cpu_occupy->user, cpu_occupy->nice,cpu_occupy->system, cpu_occupy->idle,cpu_occupy->lowait,cpu_occupy->irq,cpu_occupy->softirq);
	printf("%s %u\r\n", cpu_occupy->name,cpu_occupy->user);
	fclose(fd);
}

int main()
{
	CPU_OCCUPY cpu_stat1;
	CPU_OCCUPY cpu_stat2;
	MEM_OCCUPY mem_stat;
	int cpu;
	//第一次获取cpu使用情况
	get_cpuoccupy((CPU_OCCUPY *)&cpu_stat1);
	sleep(10);

	//第二次获取cpu使用情况
	get_cpuoccupy((CPU_OCCUPY *)&cpu_stat2);

	//计算cpu使用率
	cpu = cal_cpuoccupy ((CPU_OCCUPY *)&cpu_stat1, (CPU_OCCUPY *)&cpu_stat2);
	printf("%d \r\n",cpu);
	//获取内存
	get_meminfo();
	return 0;
}
时间: 2024-11-05 15:49:57

编程获取linux的CPU使用的内存使用情况的相关文章

编程获取linux的CPU使用率内存占用率

Linux下提供top.ps命令查看当前cpu.mem使用情况,简要介绍如下: 一.使用ps查看进程的资源占用 ps -aux 查看进程信息时,第三列就是CPU占用. [[email protected] utx86]# ps -aux | grep my_process Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.7/FAQ root   14415  3.4  0.9   37436  203

编程实现获取linux服务器cpu、内存和磁盘使用率

proc文件系统介绍 /proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间.它以文件系统的方式为内核与进程提供通信的接口.用户和应用程序可以通过/proc得到系统的信息,并可以改变内核的某些参数.由于系统的信息,如进程,是动态改变的,所以用户或应用程序读取/proc目录中的文件时,proc文件系统是动态从系统内核读出所需信息并提交的. /proc目录中有一些以数字命名的目录,它们是进程目录.系统中当前运行的每一个进程在/proc下都对应一个以进程号为目录名的目录/proc/pi

Java获取Linux系统cpu使用率

原文:http://www.open-open.com/code/view/1426152165201 import java.io.BufferedReader; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.HashMap; import java.util.Li

获取本机CPU,硬盘等使用情况

早上的时候接到主管的一个任务,要获取服务器上的cpu,硬盘, 数据库等 的使用情况,并以邮件的方式发给boss, = =没办法,公司的服务器真是不敢恭维,顺便吐槽一下公司的网速,卡的时候30k左右徘徊,这不是在浪费我们的时间吗!!! 话不多说上代码,因为是实习,主管还是挺关照我的,一早就给我发了个类库(里面涉及到要查询本机信息的都有).这样我剩下了一大半的时间, 这个功能总的来说就两步:  一,先获取本机的信息    二,发送邮件. 获取本机信息用到的类库 SystemInfo.cs 和 Dis

linux下对进程按照内存使用情况进行排序

linux下对进程按照内存使用情况进行排序的命令为:ps aux --sort -rss 详细解说参见 http://alvinalexander.com/linux/unix-linux-process-memory-sort-ps-command-cpu

LINUX 查看当前系统的内存使用情况 vmstat

Linux vmstat 命令 Vmstat命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况. 相比top,我可以看到整个机器的CPU,内存,IO的使用情况,而不是单单看到各个进程的CPU使用率和内存使用率(使用场景不一样). > vmstat [[email protected] ~]$ vmstat procs -----------memory---------- ---swap-- ---

LINUX 查看当前系统的内存使用情况 free

每天学习一点点 编程PDF电子书.视频教程免费下载:http://www.shitanlife.com/code # free 显示结果如下: Mem:表示物理内存统计 total 内存总数 8057964KBused 已使用的内存 7852484KBfree 空闲的内存数 205480KBshared 当前已经废弃不用,总是0buffers Buffer 缓存内存数: 290432KBcached Page 缓存内存数:5735024KB(存在关系: total = used + free )

LINUX 查看当前系统的内存使用情况

# free 显示结果如下: Mem:表示物理内存统计 total 内存总数 8057964KB used 已使用的内存 7852484KB free 空闲的内存数 205480KB shared 当前已经废弃不用,总是0 buffers Buffer 缓存内存数: 290432KB cached Page 缓存内存数:5735024KB (存在关系: total = used + free ) -/+ buffers/cached:表示物理内存的缓存统计 (-buffers/cache) us

获取Windows操作系统的CPU使用率以及内存使用率

阅读目录 声明定义 引用lib文件 获取操作系统CPU使用率 获取操作系统内存大小 获取操作系统内存使用率 此功能参考了ProcessHacker项目的代码. 回到顶部 声明定义  Collapse typedef struct _UINT64_DELTA { ULONG64 Value; ULONG64 Delta; } UINT64_DELTA, *PUINT64_DELTA; typedef struct _UINTPTR_DELTA { ULONG_PTR Value; ULONG_PT