编程获取linuxservercpu、内存和磁盘使用
proc文件系統簡介
/proc文件系統是一個偽文件系統。它是唯一的,其中存儲器,如果不采取外部存儲空間。
它是文件系統提供了與內核進程進行通信的接口的方法。用程序能夠通過/proc得到系統的信息。并能夠改變內核的某些參數。
因為系統的信息。如進程。是動態改變的,所以用戶或應用程序讀取/proc文件夾中的文件時。proc文件系統是動態從系統內核讀出所需信息并提交的。
/proc文件夾中有一些以數字命名的文件夾。它們是進程文件夾。系統中當前執行的每個進程在/proc下都相應一個以進程號為文件夾名的文件夾/proc/pid,它們是讀取進程信息的接口。
此外,在Linux 2.6.0-test6以上的版本號中/proc/pid文件夾中有一個task文件夾,/proc/pid/task文件夾中也有一些以該進程所擁有的線程的線程號命名的文件夾/proc/pid/task/tid,它們是讀取線程信息的接口。
CPU使用率
要想計算CPU使用率,首先要了解文件/proc/stat中的內容,例如以下是本人所使用server中該文件里的內容:
CPU 以及CPU0、CPU1、CPU2、CPU3、CPU4中每行的每一個參數意思(以第一行為例)解釋:
user (28201) :從系統啟動開始累計到當前時刻。用戶態的CPU時間(單位:jiffies) ,不包括 nice值為負進程。1jiffies=0.01秒
nice (389) :從系統啟動開始累計到當前時刻,nice值為負的進程所占用的CPU時間(單位:jiffies)
system (10975) :從系統啟動開始累計到當前時刻,核心時間(單位:jiffies)
idle (6552431) :從系統啟動開始累計到當前時刻,除硬盤IO等待時間以外其他等待時間(單位:jiffies)
iowait (19704) :從系統啟動開始累計到當前時刻,硬盤IO等待時間(單位:jiffies) 。
irq (0) :從系統啟動開始累計到當前時刻。硬中斷時間(單位:jiffies)
softirq (208): 從系統啟動開始累計到當前時刻。軟中斷時間(單位:jiffies)
獲取cpu使用率的方法:
1、記錄某個時刻cpu的使用情況
2、等上一個時間段
3、再記錄此刻的cpu使用情況
4、計算總的時間片
把第一次的全部cpu使用情況求和。得到j1,把第二次的全部cpu使用情況求和,得到j2。則j2-j1得到這個時間段的全部時間片。即total=j2-j1=第二次的全部列的和-第一次的全部列的和
5、計算idle時間
idle相應第五列的數據,用第二次的減去第一次的就可以。idle=第二次的第五列-第一次的第五列
6、計算cpu使用率
ate=(total-idle)/total
在代碼里實現例如以下所看到的:
SysCPUInfo* _GetHostCPUInfo() {SysCPUInfo *cpuinfo = (SysCPUInfo *)malloc(sizeof(SysCPUInfo));if (cpuinfo == NULL)err_dump("_GetCPUInfo: malloc struct SysCPUInfo error");FILE *fd;char buff[256];memset(buff, '\0', 256);fd = fopen("/proc/stat", "r");fgets(buff, sizeof(buff), fd);sscanf(buff, "%s %lu %lu %lu %lu", cpuinfo->name, &cpuinfo->user, &cpuinfo->nic, &cpuinfo->system, &cpuinfo->idle);fclose(fd);return cpuinfo; }float _CalculateHostCPURate(SysCPUInfo *first, SysCPUInfo *second) {unsigned long old_CPU_Time, new_CPU_Time;unsigned long usr_Time_Diff, sys_Time_Diff, nic_Time_Diff;float cpu_use = 0.0;old_CPU_Time = (unsigned long)(first->user + first->nic + first->system + first->idle);new_CPU_Time = (unsigned long)(second->user + second->nic + second->system + second->idle);usr_Time_Diff = (unsigned long)(second->user - first->user);sys_Time_Diff = (unsigned long)(second->system - first->system);nic_Time_Diff = (unsigned long)(second->nic -first->nic);if ((new_CPU_Time - old_CPU_Time) != 0)cpu_use = (float)100*(usr_Time_Diff + sys_Time_Diff + nic_Time_Diff)/(new_CPU_Time - old_CPU_Time);elsecpu_use = 0.0;return cpu_use; }float GetHostCPURate() {float cpu_rate;SysCPUInfo *first, *second;first = _GetHostCPUInfo();sleep(10);second = _GetHostCPUInfo();cpu_rate = _CalculateHostCPURate(first, second);/* clean auxiliary memory */free(first);free(second);first = second = NULL;return cpu_rate; } 內存使用率內存使用率的計算比較方便。能夠直接調用Linux系統的一個庫函數sysinfo(),該函數返回例如以下的一個結構體:
struct sysinfo {long uptime; /* Seconds since boot */unsigned long loads[3]; /* 1, 5, and 15 minute load averages */unsigned long totalram; /* Total usable main memory size */unsigned long freeram; /* Available memory size */unsigned long sharedram; /* Amount of shared memory */unsigned long bufferram; /* Memory used by buffers */unsigned long totalswap; /* Total swap space size */unsigned long freeswap; /* swap space still available */unsigned short procs; /* Number of current processes */unsigned long totalhigh; /* Total high memory size */unsigned long freehigh; /* Available high memory size */unsigned int mem_unit; /* Memory unit size in bytes */char _f[20-2*sizeof(long)-sizeof(int)]; /* Padding for libc5 */}; 該結構體中freeram表示可用內存的大小,totalram表示總內存大小。所以通過這兩個值就能夠計算內存使用率了。代碼實現例如以下所看到的: SysMemInfo * GetHostMemInfo() {SysMemInfo *memInfo = (SysMemInfo *)malloc(sizeof(SysMemInfo));if (NULL == memInfo)err_dump("GetMemInfo: malloc SysMemInfo Struct error");struct sysinfo tmp;int ret = 0;ret = sysinfo(&tmp);if (ret == 0) {memInfo->MemFree = (unsigned long)tmp.freeram/(1024*1024);memInfo->MemTotal = (unsigned long)tmp.totalram/(1024*1024);} else {err_dump("GetMemInfo: sysinfo() error");}return memInfo; }磁盤利用率本來打算通過讀文件/proc/partitions來獲取磁盤分區的使用情況,只是這樣僅僅能夠獲取分區的大小。使用情況是無法獲取的。只是能夠通過讀取文件/etc/mtab來讀取系統中全部文件系統的信息。然后統計全部文件系統占用的磁盤總大小和能夠磁盤的總大小,這樣就能夠計算出系統中文件系統的總磁盤利用率。
代碼實現例如以下所看到的:
版權聲明:本文博客原創文章,博客,未經同意,不得轉載。
總結
以上是生活随笔為你收集整理的编程获取linuxservercpu、内存和磁盘使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: nodejs mongoose建模实践
- 下一篇: 如何删除JAVA集合中的元素