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);
else
cpu_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来读取系统中全部文件系统的信息。然后统计全部文件系统占用的磁盘总大小和能够磁盘的总大小,这样就能够计算出系统中文件系统的总磁盘利用率。

代码实现例如以下所看到的:

SysDiskInfo *
GetHostDiskInfo()
{
SysDiskInfo *sys_disk_info = (SysDiskInfo *)malloc(sizeof(SysDiskInfo));
DiskInfo *disk_info;
struct statfs fs_info;
struct mntent *mnt_info;
FILE *fh;
float percent;
unsigned long sum_Total = 0, total_free = 0; if ((fh = setmntent("/etc/mtab", "r")) == NULL) {
printf("Cannot open /etc/mtab file!:%s\n",strerror(errno));
return NULL;
} while ((mnt_info = getmntent(fh)) != NULL) {
if (statfs(mnt_info->mnt_dir, &fs_info) < 0) {
continue;
} if ((disk_info = (DiskInfo *)malloc(sizeof(DiskInfo))) == NULL) {
continue;
} if (strcmp(mnt_info->mnt_type, "proc") &&
strcmp(mnt_info->mnt_type, "devfs") &&
strcmp(mnt_info->mnt_type, "usbfs") &&
strcmp(mnt_info->mnt_type, "sysfs") &&
strcmp(mnt_info->mnt_type, "tmpfs") &&
strcmp(mnt_info->mnt_type, "devpts") &&
strcmp(mnt_info->mnt_type, "fusectl") &&
strcmp(mnt_info->mnt_type, "debugfs") &&
strcmp(mnt_info->mnt_type, "binfmt_misc") &&
strcmp(mnt_info->mnt_type, "fuse.gvfs_fuse_daemon")&&
strcmp(mnt_info->mnt_type, "securityfs")) {
if (fs_info.f_blocks != 0) {
percent = ((float)fs_info.f_blocks - (float)fs_info.f_bfree * 100.0/
(float)fs_info.f_blocks);
} else {
percent = 0;
}
} else {
continue;
} strcpy(disk_info->type, mnt_info->mnt_type);
strcpy(disk_info->device, mnt_info->mnt_fsname);
strcpy(disk_info->mntpnt, mnt_info->mnt_dir); unsigned long block_size = fs_info.f_bsize/1024;
disk_info->blocks = fs_info.f_blocks * block_size / 1024;
disk_info->bfree = fs_info.f_bfree * block_size / 1024;
disk_info->availiable_disk = fs_info.f_bavail * block_size / 1024;
disk_info->bused = (fs_info.f_blocks - fs_info.f_bfree) * block_size / 1024;
disk_info->bused_percent = percent; sum_Total += disk_info->blocks;
total_free += disk_info->availiable_disk; /* clean auxiliary memory */
free(disk_info);
disk_info = NULL;
}
sys_disk_info->Disk_Total = sum_Total/1024;
sys_disk_info->Disk_Free = total_free/1024;
return sys_disk_info;
}

版权声明:本文博客原创文章,博客,未经同意,不得转载。

编程获取linuxservercpu、内存和磁盘使用的更多相关文章

  1. windows下C语言编程获取磁盘(分区)使用情况

    windows下编程获取磁盘(分区)使用情况 windows下编程获取磁盘(分区)使用情况 GetLogicalDriveStrings函数 使用示例 获取需要的缓冲区长度示例 获取所有驱动器号示例 ...

  2. 用C++和shell获取本机CPU、网卡IO、内存、磁盘等的基本信息

    用C++和shell获取本机CPU.网卡.内存.磁盘等的基本信息: 由于对C++相关的函数没多少了解,但是觉得用shell反而相对简单一些: 一.shell脚本,用来辅助C++获取主机的资源使用信息 ...

  3. 使用.NET FrameWork获取CPU,内存使用率以及磁盘空间

    在以前,我们想获取CPU,内存等信息就不得不借助win32 API来实现.但现在,.NET FrameWork已经把这些API封装到.NET类库中了,所以我们可以借助.NET类库很轻松的获取这些信息. ...

  4. 方法:Linux 下用JAVA获取CPU、内存、磁盘的系统资源信息

    CPU使用率: InputStream is = null; InputStreamReader isr = null; BufferedReader brStat = null; StringTok ...

  5. python之psutil模块(获取系统性能信息(CPU,内存,磁盘,网络)

    一.psutil模块 1. psutil是一个跨平台库(http://code.google.com/p/psutil/),能够轻松实现获取系统运行的进程和系统利用率(包括CPU.内存.磁盘.网络等) ...

  6. 一键获取linux内存、cpu、磁盘IO等信息脚本编写,及其原理详解

    更多linux知识,请关注公众号:一口Linux 一.脚本 今天主要分享一个shell脚本,用来获取linux系统CPU.内存.磁盘IO等信息. #!/bin/bash # 获取要监控的本地服务器IP ...

  7. 在 JNI 编程中避免内存泄漏

    JAVA 中的内存泄漏 JAVA 编程中的内存泄漏,从泄漏的内存位置角度可以分为两种:JVM 中 Java Heap 的内存泄漏:JVM 内存中 native memory 的内存泄漏. Java H ...

  8. linux编程获取本机网络相关参数

    getifaddrs()和struct ifaddrs的使用,获取本机IP 博客分类: Linux C编程   ifaddrs结构体定义如下: struct ifaddrs { struct ifad ...

  9. linux编程之共享内存

    linux 进程间通信(IPC)包括3种机制:消息队列.信号量.共享内存.消息队列和信号量均是内核空间的系统对象,经由它们 的数据需要在内核和用户空间进行额外的数据拷贝:而共享内存和访问它的所有应用程 ...

随机推荐

  1. 判断DAG图

    拓扑排序O(E), bellman O(VE)   , 使用邻接表的dfs O(V+E) ,floyd O(N*N*N) bellman算法只能判断是否存在负环. 所以可以先把权值全部设为-1 #in ...

  2. C语言cgi(1)

    1Columbia Universitycs3157 – Advanced ProgrammingSummer 2014, Lab #2, 60ish pointsJune 9, 2014Follow ...

  3. 【原创】leetCodeOj --- Candy 解题报告

    题目地址: https://leetcode.com/problems/candy/ 题目内容: Candy Total Accepted: 43150 Total Submissions: 2038 ...

  4. Android规范发展

    一.Android 编码规范 1.java 代码中不出现中文.最多凝视中能够出现中文 2.局部变量命名.静态成员变量命名 仅仅能包括字母,单词首字母出第一个外,都为大写,其它字母都为小写 3.常量命名 ...

  5. 冒泡排序算法(Java)

     冒泡排序即每次遍历.相邻数字间进行比較,前者大于后者进行交换,不断将最大值后移,直至沉至最后位置:算法关键要点在于确定每次循环的边界. 后面两种算法则是对冒泡排序一定程度上的改良,但相对于其它排 ...

  6. python 凸包(经纬度) + 面积[近似]

    def cross(A,B): return A[0] * B[1] - A[1] * B[0] def vectorMinus( a , b): return ( (a[0] - b[0] )*10 ...

  7. hdu 2049 别easy列(4)——测试新郎

    问题: 使用double定义的数量和long数定义19-20出现分歧,原因不明.求大公社. 这个问题需要用long,否则,只是通过,这应该纠结了很久. 问题是乘以一个交错的思想相结合. 不easy系列 ...

  8. Shrio登陆验证实例详细解读(转)

    摘要:本文采用了Spring+SpringMVC+Mybatis+Shiro+Msql来写了一个登陆验证的实例,下面来看看过程吧!整个工程基于Mavevn来创建,运行环境为JDK1.6+WIN7+to ...

  9. 警告: [SetPropertiesRule]{Server/Service/Engine/Host/Context}

    警告: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to'org.eclipse ...

  10. Android Widget 小部件(一) 简单实现

    在屏幕上加入Widget:或长按屏幕空白处,或找到WidgetPreview App选择. 原生系统4.0下面使用长按方式,4.0及以上 打开WIDGETS 创建Widget的一般步骤: 在menif ...