Linux基础 -- 获取CPU负载信息

Linux Kernel 获取当前负载情况

本文档介绍了如何在 Linux 内核中获取系统的负载情况。我们将从用户态程序、内核模块开发等角度展示相关方法。

1. 通过 /proc/loadavg 文件获取负载

/proc/loadavg 文件包含了系统的负载信息,通常包括过去 1 分钟、5 分钟和 15 分钟的负载平均值。可以通过读取该文件来获取当前负载信息。

示例代码如下:

c 复制代码
#include <stdio.h>
#include <stdlib.h>

int main() {
    FILE *fp;
    double loadavg[3];

    fp = fopen("/proc/loadavg", "r");
    if (fp == NULL) {
        perror("fopen");
        return 1;
    }

    fscanf(fp, "%lf %lf %lf", &loadavg[0], &loadavg[1], &loadavg[2]);
    fclose(fp);

    printf("Load average: 1 min: %lf, 5 min: %lf, 15 min: %lf\n", loadavg[0], loadavg[1], loadavg[2]);

    return 0;
}

2. 使用 getloadavg 函数

getloadavg 是一个标准的 C 函数,可以直接在用户态程序中调用,用于获取系统的负载平均值。示例代码如下:

c 复制代码
#include <stdio.h>
#include <stdlib.h>

int main() {
    double loadavg[3];

    if (getloadavg(loadavg, 3) == -1) {
        perror("getloadavg");
        return 1;
    }

    printf("Load average: 1 min: %lf, 5 min: %lf, 15 min: %lf\n", loadavg[0], loadavg[1], loadavg[2]);

    return 0;
}

3. 在内核模块中获取系统负载

如果你正在开发内核模块,可以通过内核内部的数据结构来获取负载信息。Linux 内核中有一个 avenrun 数组,它存储了系统的负载平均值。

以下代码展示了如何在内核模块中通过 /proc 文件系统读取负载平均值:

c 复制代码
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/proc_fs.h>
#include <linux/seq_file.h>
#include <linux/sched.h>

static int my_loadavg_show(struct seq_file *m, void *v) {
    seq_printf(m, "Load average: 1 min: %lu, 5 min: %lu, 15 min: %lu\n",
               avenrun[0] / FIXED_1,
               avenrun[1] / FIXED_1,
               avenrun[2] / FIXED_1);
    return 0;
}

static int my_loadavg_open(struct inode *inode, struct file *file) {
    return single_open(file, my_loadavg_show, NULL);
}

static const struct file_operations my_loadavg_fops = {
    .owner = THIS_MODULE,
    .open = my_loadavg_open,
    .read = seq_read,
    .llseek = seq_lseek,
    .release = single_release,
};

static int __init my_module_init(void) {
    proc_create("my_loadavg", 0, NULL, &my_loadavg_fops);
    return 0;
}

static void __exit my_module_exit(void) {
    remove_proc_entry("my_loadavg", NULL);
}

module_init(my_module_init);
module_exit(my_module_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Your Name");
MODULE_DESCRIPTION("A simple module to show load average");

该内核模块会在 /proc 文件系统中创建一个名为 my_loadavg 的文件,可以通过读取该文件来获取系统的负载平均值。

4. 直接访问 avenrun 数组

如果只需要在内核模块内部获取负载平均值,可以直接访问 avenrun 数组,代码如下:

c 复制代码
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>

static int __init my_module_init(void) {
    printk(KERN_INFO "Load average: 1 min: %lu, 5 min: %lu, 15 min: %lu\n",
           avenrun[0] / FIXED_1,
           avenrun[1] / FIXED_1,
           avenrun[2] / FIXED_1);
    return 0;
}

static void __exit my_module_exit(void) {
    printk(KERN_INFO "Module exiting\n");
}

module_init(my_module_init);
module_exit(my_module_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Your Name");
MODULE_DESCRIPTION("A simple module to print load average");

该内核模块会在加载时打印当前的负载平均值。

总结

上述方法提供了获取 Linux 系统负载信息的多种方式,选择合适的方法可以满足不同开发场景的需求。

相关推荐
爱和冰阔落29 分钟前
【Linux网络】TCP 半包粘包怎么解决?从长度报头、JSON 拆包到网络计算器完整实战
linux·运维·网络·tcp/ip
say_fall2 小时前
【Linux网络编程】UDP套接字编程:系统编程组件、基础回显服务、InetAddr与地址转换、翻译服务与线程池聊天室
linux·服务器·网络·udp·vr
ö Constancy3 小时前
一台电脑的硬件组成与作用:按功能分类详解(Windows 与 Linux 视角)
linux·windows·电脑
江湖有缘3 小时前
基于Ubuntu部署SoduWork:企业级 AI 原生协同平台实战全流程
linux·人工智能·ubuntu·ai·soduwork
无奈笑天下12 小时前
银河麒麟上nproc命令教程详解
linux·运维·服务器
Rabitebla15 小时前
【Linux】进程控制(十二) 自定义 Shell(二):内建命令与进程工作目录管理
linux·c++·笔记·学习·bash
坤坤子吖19 小时前
Linux网络编程:TCP 粘包与半包问题,如何正确处理 TCP 流式数据?
linux·服务器·网络·笔记·网络协议·学习
AI_Gump19 小时前
Harness篇|DeepSeek Harness 上手机:五条安卓移植路线与 App 内 Linux 拆解
android·linux·人工智能·智能手机·deepseek
星恒随风21 小时前
MySQL 从零入门(六):复合查询详解——多表查询、自连接、子查询与 UNION
linux·服务器·数据库·mysql
少司府21 小时前
嵌入式入门篇(二):初识STM32F103ZET6
linux·python·stm32·单片机·嵌入式硬件·mcu·嵌入式软件