zoukankan      html  css  js  c++  java
  • 编程获取linux的CPU使用的内存使用情况

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

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

    ps -aux

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



    [root@localhost 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

    显示后退出

    [root@localhost 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占用情况

    [root@localhost 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情况

    得到详细列的值:

    [root@localhost utx86]# top -n 1 |grep Cpu | cut -d "," -f 1 | cut -d ":" -f 2
    1.9%us
    [root@localhost utx86]# top -n 1 |grep Cpu | cut -d "," -f 2
    1.3%sy

    2、获得内存占用情况

    [root@localhost utx86]# top -n 1 |grep Mem
    Mem:   2066240k total,  1515784k used,   550456k free,   195336k buffers

    获得内存情况指定列

    [root@localhost c++_zp]# top -n 1 |grep Mem | cut -d "," -f 1 | cut -d ":" -f 2
    2066240k total
    [root@localhost 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;
    }

    编译、执行:

    [root@localhost study]# g++ test.cpp
    [root@localhost study]# ./a.out
    [root@localhost 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%%

    ",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
    ");
    		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
    ",buf,name,meminfo.free);
    	float temp;
    
    	sscanf(buf,"%s			%f %s",name,&temp,name);
    	printf("temp is %f 
    ",temp);
    	double rate = (meminfo.total - meminfo.free)/meminfo.total;
    	printf("%f  %f	rate is %f
    ",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
    ",cpu_use);
    
    	idle = n->user + n->system + n->nice -o->user - o->system- o->nice;
    	cpu_use = idle/sum;
    
    	printf("%f
    ",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
    ",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
    ", 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
    ", 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 
    ",cpu);	 
    	//获取内存
    	get_meminfo();
    	return 0;
    } 
    



  • 相关阅读:
    一些问题
    为什么Python在列表,元组和字典的末尾允许使用逗号?
    #!/bin/bash
    gitbook 入门教程之小白都能看懂的 Gitbook 插件开发全流程
    go 学习笔记之10 分钟简要理解 go 语言闭包技术
    gitbook 入门教程之还在搞公众号互推涨粉?gitbook 集成导流工具,轻轻松松躺增粉丝!
    go 学习笔记之仅仅需要一个示例就能讲清楚什么闭包
    go 学习笔记之学习函数式编程前不要忘了函数基础
    go 学习笔记之无心插柳柳成荫的接口和无为而治的空接口
    go 学习笔记之万万没想到宠物店竟然催生出面向接口编程?
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/4843884.html
Copyright © 2011-2022 走看看