程式設計獲取linux的CPU使用率記憶體佔用率
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow
也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!
Linux下提供top、ps命令檢視當前cpu、mem使用情況,簡要介紹如下:一、使用ps檢視程序的資源佔用
ps -aux
檢視程序資訊時,第三列就是CPU佔用。
[
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
顯示後退出
[
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佔用情況
[
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 V050921
#簡單說明: 可由root使用者將此指令碼加入crontab,啟動時間一般最好設為每天營業前,當此指令碼啟動時如檢測到已用硬碟空間超過指定範圍,則將hdwarning.sh指令碼拷貝到指定使用者根目錄下;否則將刪除指定使用者的目錄下的hdwarning.sh指令碼.
usedhd=80 #自定義超限已用硬碟空間大小比例,預設為80%
test "$1" && userdir=$1 || userdir=/usr/scabs #前臺使用者的目錄(預設設為統版使用者),也可在呼叫此指令碼時加上指定前臺使用者的目錄引數
hdwarning=$(df -v |sed '1d;s/.$//;s/\/dev\///'|awk '$6>'"$usedhd"' {print $2," = ",$6"%"}')
test "$hdwarning" && { cp /usr/bin/hdwarning.sh ${userdir}/hdwarning.sh \
> ${userdir}/hdwarning.log  chmod 777 ${userdir}/hdwarning.sh ${userdir}/hdwarning.log } \
|| { rm ${userdir}/hdwarning.sh 2>/dev/null \
mv ${userdir}/hdwarning.log ${userdir}/hdwarning.log.bak 2>/dev/null }
hdwarning.sh
#!/bin/ksh
#檢測硬碟剩餘空間並警告的shell V050921
#增加當超標時,只在預先指定的前N位預先的指定使用者登入時才顯示提示資訊,
#即只有這前面N位使用者才有可能及時反饋,避免當超標時接到過多的前臺反饋電話 V050923
#請先編輯指定使用者根下的 .profile ,在最後追加一行
#  test -x hdwarning.sh &&  ./hdwarning.sh
#若.profile最後已加入了自啟動專用程式命令列,則請在此行前面插入上述行
#簡單說明: 當指定使用者登入後,若當前目錄中hdwarning.sh指令碼存在(一般此
#時硬碟已用空間已經超標),則執行此指令碼,並在螢幕顯示警告資訊,此時終端
#操作人員應該及時將此資訊把饋給預先指定的部門或預先指定的管理人員,
#以便作相應的處理.若未超標或已清理磁碟檔案並達標,則將刪除指令碼自身
#hdwarning.sh(取消登入時的檢測和警告資訊)
usedhd=80 #自定義超限已用硬碟空間大小比例,預設為80%
loginnum=10 #自定義最初登入反饋的使用者數,預設為前 10 位
name="運維部" #接受反饋的部門或管理人員
tel="2113714 2110394" #接受反饋的部門或管理人員的聯絡方式或電話
test "$1" && userdir=$1 || userdir=/usr/scabs #前臺使用者的目錄(預設設為統版使用者),也可在呼叫此
#指令碼時加上指定前臺使用者的目錄引數
hdwaring()
{ ttyname=$(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
然後就可以自己計算了
- #########GetCPU.sh
- ######Author:duanjigang
- #!/bin/sh
- while true
- do
- awk '$1=="cpu"{Total=$2+$3+$4+$5+$6+$7;print "Free: " $5/Total*100"%
- " " Used: " (Total-$5)*100/Total"%"}' </proc/stat
- sleep 1
- 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 (不通版本的核心會有差異的)
- #cpu.sh-to get the utilization of every cpu
- #author:duanjigang<2006/12/28>
- #!/bin/sh
- awk '$0 ~/cpu[0-9]/' /proc/stat | while read line
- do
- echo "$line" | awk '{total=$2+$3+$4+$5+$6+$7+$8;free=$5;\
- print$1" Free "free/total*100"%",\
- "Used " (total-free)/total*100"%"}'
- 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)網路流量情況
- #if.sh-to get the network flow of each interface
- #for my beloved ning
- #author:duanjigang<2006/12/28>
- #!/bin/sh
- echo "name ByteRec PackRec ByteTran PackTran"
- awk ' NR>2' /proc/net/dev | while read line
- do
- echo "$line" | awk -F ':' '{print " "$1" " $2}' |\
- awk '{print $1" "$2 " "$3" "$10" "$11}'
- 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):埠情況
http://bbs.chinaunix.net/viewthread.php?tid=864757&highlight=duanjigang
(4)至於記憶體
cat /proc/meminfo | grep "MemTotal"
cat /rpco/meninfo | grep "MemFree"
就可以了吧
安裝上篇文章的原則,使用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;}