linux获取内存与cpu使用率(附有C语言源码与shell脚本)

这篇具有很好参考价值的文章主要介绍了linux获取内存与cpu使用率(附有C语言源码与shell脚本)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、获取内存信息的方法

linux内核提供了一种通过/proc文件系统来在运行时访问内核内部数据结构,改变内核设置的机制,各种硬件平台上的linux系统的/proc文件系统的基本概念都是相同的。
/proc文件系统是一种内核和内核模块用来向进程发送信息的机制。这个伪文件系统可以和内核内部的数据结构进行交互,获取实时的进程信息。注意,/proc文件系统是存储与内存而不是硬盘,/proc虚拟文件系统实质是以文件系统的形式访问内核数据的接口。

/proc/meminfo
linux系统中/proc/meminfo这个文件用来记录了系统内存使用的详细情况。其中top,free命令中的数据是通过这个文件中的信息计算并按照特定的格式进行显示。

linux获取内存与cpu使用率(附有C语言源码与shell脚本)

命令解析

MemTotal: 所有内存(RAM)大小,减去一些预留空间和内核的大小。
MemFree: 完全没有用到的物理内存,lowFree+highFree
MemAvailable: 在不使用交换空间的情况下,启动一个新的应用最大可用内存的大小,计算方式:MemFree+Active(file)+Inactive(file)-(watermark+min(watermark,Active(file)+Inactive(file)/2))
Buffers: 块设备所占用的缓存页,包括:直接读写块设备以及文件系统元数据(metadata),比如superblock使用的缓存页。
Cached: 表示普通文件数据所占用的缓存页。
SwapCached: swap cache中包含的是被确定要swapping换页,但是尚未写入物理交换区的匿名内存页。那些匿名内存页,比如用户进程malloc申请的内存页是没有关联任何文件的,如果发生swapping换页,这类内存会被写入到交换区。
Active: active包含active anon和active file
Inactive: inactive包含inactive anon和inactive file
Active(anon): anonymous pages(匿名页),用户进程的内存页分为两种:与文件关联的内存页(比如程序文件,数据文件对应的内存页)和与内存无关的内存页(比如进程的堆栈,用malloc申请的内存),前者称为file pages或mapped pages,后者称为匿名页。
Inactive(anon): 见上
Active(file): 见上
Inactive(file): 见上
SwapTotal: 可用的swap空间的总的大小(swap分区在物理内存不够的情况下,把硬盘空间的一部分释放出来,以供当前程序使用)
SwapFree: 当前剩余的swap的大小
Dirty: 需要写入磁盘的内存去的大小
Writeback: 正在被写回的内存区的大小
AnonPages: 未映射页的内存的大小
Mapped: 设备和文件等映射的大小
Slab: 内核数据结构slab的大小
SReclaimable: 可回收的slab的大小
SUnreclaim: 不可回收的slab的大小
PageTables: 管理内存页页面的大小
NFS_Unstable: 不稳定页表的大小
VmallocTotal: Vmalloc内存区的大小
VmallocUsed: 已用Vmalloc内存区的大小
VmallocChunk: vmalloc区可用的连续最大快的大小

内存的使用率的计算方法
linux获取内存与cpu使用率(附有C语言源码与shell脚本)

二. proc/stat

proc/stat节点记录的是系统进程整体的统计信息

wyy$  cat /proc/stat
//CPU指标:user,nice, system, idle, iowait, irq, softirq
cpu  130216 19944 162525 1491240 3784 24749 17773 0 0 0
cpu0 40321 11452 49784 403099 2615 6076 6748 0 0 0
cpu1 26585 2425 36639 151166 404 2533 3541 0 0 0
cpu2 22555 2957 31482 152460 330 2236 2473 0 0 0
cpu3 15232 1243 20945 153740 303 1985 3432 0 0 0
cpu4 5903 595 6017 157410 30 10959 605 0 0 0
cpu5 4716 380 3794 157909 23 118 181 0 0 0
cpu6 8001 515 8995 157571 48 571 180 0 0 0
cpu7 6903 377 4869 157885 31 271 613 0 0 0
 
intr ...
ctxt 22523049
btime 1500827856
processes 23231
procs_running 1
procs_blocked 0
softirq 3552900 843593 733695 19691 93143 468832 12783 257382 610426 0 513355

有以上信息能够得出 cpu是4核的,cpu这项相应信息例如以下
cpu user nice system idle iowait irq softirq steal guest guest_nice
user:用户态的CPU时间
nice:低优先级程序所占用的用户态的cpu时间。
system:系统态的CPU时间
idle:CPU空暇的时间(不包括IO等待)
iowait:等待IO响应的时间
irq:处理硬件中断的时间
softirq:处理软中断的时间
steal:其它系统所花的时间(个人理解是针对虚拟机)
guest:执行时间为客户操作系统下的虚拟CPU控制(个人理解是访客控制CPU的时间)
guest_nice:低优先级程序所占用的用户态的cpu时间。

三、c语言程序测试内存与CPU使用率

#include<unistd.h>
#include<stdio.h>
#include<stdlib.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

}CPU_OCCUPY;

typedef struct PACKED1         //定义一个mem occupy的结构体
{

char name[20];               //定义一个char类型的数组名name有20个元素

unsigned long total;

char name2[20];

unsigned long free;

}MEM_OCCUPY;

/*获取内存使用率*/ 
int get_memoccupy (MEM_OCCUPY *mem) //对无类型get函数含有一个形参结构体类弄的指针O

{

    FILE *fd;

    int n;

    char buff[256];

    char buff1[256];

    char buff2[256];

    char buff3[256];

    char buff4[256];

    MEM_OCCUPY *m;

    m=mem;

    float mem_use;

    fd = fopen ("/proc/meminfo", "r");

    fgets (buff1, sizeof(buff1), fd);

    printf("%s\n",buff1);

    int num1 = atoi(buff1+15);

    printf("%d\n",num1);

    fgets (buff2, sizeof(buff2), fd);

    printf("%s\n",buff2);

    int num2 = atoi(buff2+15);

    fgets (buff3, sizeof(buff3), fd);

    printf("%s\n",buff3);

    int num3 = atoi(buff3+15);

    fgets (buff4, sizeof(buff4), fd);

    // sscanf (buff, "%s %u %s", m->name, &m->total, m->name2);

    printf("%s\n",buff4);

    int num4 = atoi(buff4+15);

    fgets (buff, sizeof(buff), fd); //从fd文件中读取长度为buff的字符串再存到起始地址为buff这个空间里

    printf("%s\n",buff);
    int num5 = atoi(buff+15);
    // 内存使用率(MEMUsedPerc)=100*(MemTotal-MemFree-Buffers-Cached)/MemTotal

    mem_use = (float)100*(num1-num2-num5-num4)/num1;

    printf("内存使用率为:%.2f%%\n",mem_use);

    fclose(fd);     //关闭文件fd

}

/*获取cpu使用率*/
 float cal_cpuoccupy (CPU_OCCUPY *o, CPU_OCCUPY *n)  
{      
    unsigned long od, nd;       
    unsigned long id, sd;     
    float cpu_use = 0;           
    od = (unsigned long) (o->user + o->nice + o->system +o->idle);//第一次(用户+优先级+系统+空闲)的时间再赋给od    
    nd = (unsigned long) (n->user + n->nice + n->system +n->idle);//第二次(用户+优先级+系统+空闲)的时间再赋给nd      
    id = (unsigned long) (n->user - o->user);    //用户第一次和第二次的时间之差再赋给id    
    sd = (unsigned long) (n->system - o->system);//系统第一次和第二次的时间之差再赋给sd  
    if((nd-od) != 0)
    {
         cpu_use = (float)((sd+id)*100)/(nd-od); //((用户+系统)乖100)除(第一次和第二次的时间差)再赋给g_cpu_used   
    }     
    else
    {   cpu_use = 0;          
       
    }   
    printf("cpu使用率为:%1.2f%%\n",cpu_use);     
    return cpu_use; 
}
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);          
        sscanf (buff, "%s %u %u %u %u", cpu_occupy->name, &cpu_occupy->user, &cpu_occupy->nice,&cpu_occupy->system, &cpu_occupy->idle);   
        fclose(fd);     
 }   
            
 int main() 
 {     
    CPU_OCCUPY cpu_stat1;    
    CPU_OCCUPY cpu_stat2;    
    MEM_OCCUPY mem_stat;   
    float cpu;         
      //获取内存     
    get_memoccupy ((MEM_OCCUPY *)&mem_stat);         
      //第一次获取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);        
     return 0;  
}

测试结果:
linux获取内存与cpu使用率(附有C语言源码与shell脚本)

四、shell脚本

#!/bin/bash
##############################################
#Filename: hellome.sh
#Description: 监控cpu、磁盘、内存使用率
##############################################

logFile=/tmp/jiankong.log
#获取报警时间
now_time=`date '+%F %T'`

#获取cpu使用率
#cpuUsage=`top -b -n5 | fgrep "Cpu(s)" | tail -1 | awk -F'id,' '{split($1, vs, ","); v=vs[length(vs)]; sub(/\s+/, "", v);sub(/\s+/, "", v); printf "%d", 100-v;}'`
cpuUsage=`top -b -n1 | fgrep "Cpu" | awk '{print 100-$8,"%"}'`
#统计内存使用率
#mem_used_persent=`free -m | awk -F '[ :]+' 'NR==2{printf "%d", ($3)/$2*100}'`
mem_used_persent=`free -m | fgrep "Mem" | awk '{printf "%d", ($3)/$2*100}'`
#获取磁盘使用率
#data_name="/dev/vda1"
#diskUsage=`df -h | grep $data_name | awk -F '[ %]+' '{print $5}'`
diskUsage=`df -h | fgrep "/dev/vda1" | awk '{print $5}'`

function check(){
    echo "当前时间:"${now_time}
    echo -e "CPU使用率:${cpuUsage}%\n磁盘使用率:${diskUsage}%\n内存使用率:${mem_used_persent}%"
#    if [[ "$cpuUsage" > 80 ]] || [[ "$diskUsage" > 80 ]] || [[ "$mem_used_persent" > 80 ]];then
#        echo "报警时间:${now_time}" > $logFile
#    	echo -e "CPU使用率:${cpuUsage}% --> 磁盘使用率:${diskUsage}% --> 内存使用率:${mem_used_persent}%" >> $logFile
#    fi
}
function main(){
    check
}
main

脚本结果如下:
linux获取内存与cpu使用率(附有C语言源码与shell脚本)

脚本是利用top:

top命令:
linux获取内存与cpu使用率(附有C语言源码与shell脚本)
根据上图所显示的结果可以看出,CPU占用数据在第三行,所以我现在只需要第三行的数据。第三行的数据里有关键字“Cpu(s)”,使用fgrep命令可以根据关键字按行查找信息。所以此时我的命令变成了“top -n1 | fgrep “Cpu(s)””,运行结果如下图所示:
linux获取内存与cpu使用率(附有C语言源码与shell脚本)
上图显示的是CPU的各类占用率:

us:用户空间占用CPU百分比
sy:内核空间占用CPU百分比
ni:用户进程空间内改变过优先级的进程占用CPU百分比
id:空闲CPU百分比
wa:等待输入输出的CPU时间百分比
hi:硬件中断
si:软件中断
st:虚拟机占用物理机的百分比

我想要获得CPU当前占用率,只需要使用100减去空闲CPU即可。
使用awk命令获取空闲CPU。awk默认按空格切割字符串,根据下图显示可以确认id的数值在第8个,使用100减去该值即可获取当前CPU占用率,所以使用命令“top -n1 | fgrep “Cpu(s)” | awk ‘{print 100-$8}’”,显示如下图所示:
linux获取内存与cpu使用率(附有C语言源码与shell脚本)
注意:命令使用英文,中文报错文章来源地址https://www.toymoban.com/news/detail-460457.html

到了这里,关于linux获取内存与cpu使用率(附有C语言源码与shell脚本)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • python-在系统托盘显示CPU使用率和内存使用率

    一、添加轮子 1.添加托盘区图标库  infi.systray 2.添加图像处理库  Pillow 3.添加  psutil  来获取CPU、内存信息 二、完整代码 三、实际效果展示

    2024年02月05日
    浏览(67)
  • qt使用QCustomplot绘制cpu和内存使用率图

                QCustomPlot是一个开源的Qt C++图表库,用于可视化数据。该库提供了多种类型的可定制的图表,包括散点图、线图、柱状图和等高线图等。它还支持自定义绘制,可以创建任意形状和大小的元素,并使其与其他元素交互。QCustomPlot易于集成到现有的Qt应用程序中

    2024年02月09日
    浏览(50)
  • Java CPU或内存使用率过高问题定位教程

    Spring cloud微服务广泛应用后,服务的监控和运维压力也与日俱增,经常有服务出现CPU或者内存使用率过高的告警,那么遇到这样的问题我们该如何排查呢?我们可以借助哪些工具来定位问题呢?本文将介绍一下遇到此类问题的解决思路和方法。 1.通过应用日志定位思路 对于业

    2024年03月28日
    浏览(58)
  • STM32 CubeMX (第四步Freertos内存管理和CPU使用率)

    学习使用Freertos第四步 在 FreeRTOS 中,中断管理和软件定时: · taskENTER_CRITICAL() ·; 是一个函数在 FreeRTOS 中使用的,用于进入临界区(critical section)。在临界区内,中断会被禁用,这样可以确保在多任务环境下共享资源的安全性。你可以在需要保护共享资源的代码段中使用 ·

    2024年02月12日
    浏览(46)
  • 【Visio 2019 移动、缩放卡死,高内存 CPU 和磁盘使用率,亲测有效】

    正在使用Microsoft Visio 2019,里面有较多的插图连线,当缩放、移动时回变得很卡,内存占用率特标高。机器:联想拯救者2021r7000p。 我在另一个线程中找到了解决方案 您需要关闭Visio,然后删除注册表项:HKEY_CURRENT_USER SOFTWARE Microsoft Office 16.0 Common ExperimentConfigs Ecs

    2024年02月13日
    浏览(102)
  • 【linux】查看CPU的使用率

    命令1:top 总体系统信息 uptime:系统的运行时间和平均负载。 tasks:当前运行的进程和线程数目。 CPU:总体 CPU 使用率和各个核心的使用情况。 内存(Memory):总体内存使用情况、可用内存和缓存。 查看 CPU 使用率 以下是一些常用的CPU使用率相关字段: %Cpu(s):显示整个系统

    2024年04月23日
    浏览(58)
  • linux top命令中 cpu 利用率/mem 使用率与load average平均负载计算方式

    top 命令是 Linux 上一个常用的系统监控工具,它经常用来监控 Linux 的系统状态,是常用的性能分析工具,能够显示较全的系统资源信息,包括系统负载,CPU 利用分布情况,内存使用,进程资源占用情况等。 如下示例: 这里主要看进程的 CPU%, MEM% 和 load averge 字段。 该字段指

    2024年02月03日
    浏览(53)
  • Linux服务器CPU使用率过高排查与解决思路

    日常工作中有时候会遇到Linux服务器上出现CPU负载过高的情况,影响程序的运行,一般的排除思路如下: 然后按shift+p按照CPU排序,找到占用CPU过高的进程的pid 找到进程中消耗资源最高的线程的id 将需要的线程ID转换为16进制格式 bc是linux的计算器命令 查看线程状态信息 grep

    2024年01月21日
    浏览(49)
  • 测试:虚拟机查看CPU使用率

    Windows虚拟机 任务管理器 : 在虚拟机中,您可以打开任务管理器(Ctrl + Shift + Esc),然后在“进程”标签下查看CPU使用率。 PowerShell : 使用PowerShell命令 Get-VM | Select-Object Name, CPUUsage 可以查询虚拟机的CPU使用率。 VMware vSphere Client : 如果您的虚拟机运行在VMware环境中,可以使用

    2024年02月01日
    浏览(74)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包