Linux中sysinfo的用法

article/2025/9/26 16:40:15

sysinfo结构体

Linux中,可以用sysinfo来获取系统相关信息。

Linux中,sysinfo是用来获取系统相关信息的结构体。
函数声明和原型:

#include <sys/sysinfo.h>

int sysinfo(struct sysinfo *info);

在Linux中不同对版本结构体不一样

在Linux 2.3.16中,结构体的信息是(单位是字节):

  1. struct sysinfo {                      
  2. long uptime;                
  3. /* 启动到现在经过的时间 */                      
  4. unsigned long loads[3];      
  5. /* 1, 5, and 15 minute load averages */                      
  6. unsigned long totalram;  /* 总的可用的内存大小 */    
  7. unsigned long freeram;   /* 还未被使用的内存大小 */    
  8. unsigned long sharedram; /* 共享的存储器的大小 */    
  9. unsigned long bufferram; /* 缓冲区大小 */                      
  10. unsigned long totalswap; /* 交换区大小 */                      
  11. unsigned long freeswap;  /* 还可用的交换区大小 */    
  12. unsigned short procs;    /* 当前进程数目 */    
  13. char _f[22];         /* 64字节的补丁结构 */    
struct sysinfo {                  
long uptime;            
/* 启动到现在经过的时间 */                  
unsigned long loads[3];  
/* 1, 5, and 15 minute load averages */                  
unsigned long totalram;  /* 总的可用的内存大小 */
unsigned long freeram;   /* 还未被使用的内存大小 */
unsigned long sharedram; /* 共享的存储器的大小 */
unsigned long bufferram; /* 缓冲区大小 */                  
unsigned long totalswap; /* 交换区大小 */                  
unsigned long freeswap;  /* 还可用的交换区大小 */
unsigned short procs;    /* 当前进程数目 */
char _f[22];         /* 64字节的补丁结构 */


在Linux 2.3.23(i386), 2.3.48 (all architectures)中,结构体的信息是(单位是mem_unit字节):

  1. struct sysinfo {  
  2.       long uptime;          /* 启动到现在经过的时间 */  
  3.       unsigned long loads[3];    
  4.       /* 1, 5, and 15 minute load averages */  
  5.       unsigned long totalram;  /* 总的可用的内存大小 */  
  6.       unsigned long freeram;   /* 还未被使用的内存大小 */  
  7.       unsigned long sharedram; /* 共享的存储器的大小*/  
  8.       unsigned long bufferram; /* 共享的存储器的大小 */  
  9.       unsigned long totalswap; /* 交换区大小 */  
  10.       unsigned long freeswap;  /* 还可用的交换区大小 */  
  11.       unsigned short procs;    /* 当前进程数目 */  
  12.       unsigned long totalhigh; /* 总的高内存大小 */  
  13.       unsigned long freehigh;  /* 可用的高内存大小 */  
  14.       unsigned int mem_unit;   /* 以字节为单位的内存大小 */  
  15.       char _f[20-2*sizeof(long)-sizeof(int)];   
  16.       /* libc5的补丁  
  17. };  


成功返回0,错误返回-1
例子:
#include <stdio.h>
#include <sys/sysinfo.h>
int main(void)
{
 struct sysinfo info;
 int iRetVal = -1;/*用于获取函数的返回值,默认为-1*/
iRetVal = sysinfo(&info);
 printf("return val         : %d\n",iRetVal);//打印函数返回值,成功为0,失败为-1  
 printf("uptime          : %ld\n",info.uptime);//打印从设备开启到现在的时间,单位为秒    
 printf("1 min load average : %lu\n",info.loads[0]);    
 printf("5 min load average : %lu\n",info.loads[1]);    
 printf("15 min load average: %lu\n",info.loads[2]);//平均负载    
 printf("totalram           : %lu\n",info.totalram);//总可用内存大小  
 printf("freeram            : %lu\n",info.freeram); //剩余内存   
 printf("procs              : %u\n",info.procs);    //进程数
return 0;
}
结果
return val     : 0
uptime         : 7595
1 min load ave : 7424
5 min laod ave : 17024
15 min load ave: 20032
totalarm       : 1713119232
freeram        : 1489481728
procs          : 148

补充知识:load average

average load?表示系统在一段时间内的平均进程个数,也就是表示系统的繁忙程度。average load和CPU利用率不一样,更加能够表示系统的繁忙程度,下面将就系统的average load的计算和相关进行简单介绍。

查看方法

在Linux系统下使用uptime命令,或者查看/proc/loadavg都可以看到系统负载average load。使用uptime命令会显示系统分别在过去的1分钟,5分钟和10分钟里的平均负载。

[root@localhost ~]# uptime
19:32:09 up 5 days, 8:53, 5 users, load average: 0.05, 0.04, 0.05
[root@localhost ~]# cat /proc/loadavg
0.04 0.04 0.05 1/394 23203

那么uptime命令计算load average的工作原理是什么呢?

计算方法

对于单cpu和多cpu情况,系统的average load情况稍有不同。单cpu是最简单的情形,比如过去的平均一分钟里面,判断系统处于运行或者等待状态的进程数则表示系统的平均负载,但是在linux系统下稍有不同,那些处于io等待状态的进程也会被纳入去计算。这样就导致CPU利用率可能和平均负载很不同,在大部分进程都在做IO的时候,即使平均负载很大,也会没有很大的CPU利用率。另外,有些系统对于进程和线程的处理也很不一样,有的对于每一个线程都会进行计算,有的只关注进程,对于超线程技术的线程来说,可能又是别的处理方式。对于多CPU的平均负载的计算,是在单CPU的情况下再除以CPU的个数。

文件: kernel/timer.c:


unsigned long avenrun[3];static inline void calc_load(unsigned long ticks)
{
unsigned long active_tasks; /* fixed-point */
static int count = LOAD_FREQ;count -= ticks;
if (count < 0) {
count += LOAD_FREQ;
active_tasks = count_active_tasks();
CALC_LOAD(avenrun[0], EXP_1, active_tasks);
CALC_LOAD(avenrun[1], EXP_5, active_tasks);
CALC_LOAD(avenrun[2], EXP_15, active_tasks);
}
}

内核中的函数sched.h

/** These are the constant used to fake the fixed-point load-average* counting. Some notes:*  - 11 bit fractions expand to 22 bits by the multiplies: this gives*    a load-average precision of 10 bits integer + 11 bits fractional*  - if you want to count load-averages more often, you need more*    precision, or rounding will get you. With 2-second counting freq,*    the EXP_n values would be 1981, 2034 and 2043 if still using only*    11 bit fractions.*/
extern unsigned long avenrun[];         /* Load averages */
extern void get_avenrun(unsigned long *loads, unsigned long offset, int shift);#define FSHIFT          11              /* nr of bits of precision */
#define FIXED_1         (1<<FSHIFT)     /* 1.0 as fixed-point */
#define LOAD_FREQ       (5*HZ+1)        /* 5 sec intervals */
#define EXP_1           1884            /* 1/exp(5sec/1min) as fixed-point */
#define EXP_5           2014            /* 1/exp(5sec/5min) */
#define EXP_15          2037            /* 1/exp(5sec/15min) */#define CALC_LOAD(load,exp,n) \load *= exp; \load += n*(FIXED_1-exp); \load >>= FSHIFT;extern unsigned long total_forks;
extern int nr_threads;
DECLARE_PER_CPU(unsigned long, process_counts);
extern int nr_processes(void);
extern unsigned long nr_running(void);
extern unsigned long nr_uninterruptible(void);
extern unsigned long nr_iowait(void);
extern unsigned long nr_iowait_cpu(int cpu);
extern unsigned long this_cpu_load(void);

ewma算法

linux系统在很多方面都使用了这个算法,比如除了这个还有TC系统的CBQ算法,这是统计学的一个算法,具体请参考http://en.wikipedia.org/wiki/EWMA_chart和http://en.wikipedia.org/wiki/Moving_average

参考文献

http://man.he.net/man8/tc-cbq-details
linux内核代码
http://en.wikipedia.org/wiki/EWMA_chart
http://en.wikipedia.org/wiki/Moving_average 



struct sysinfo {long uptime;          /* 启动到现在经过的时间 */unsigned long loads[3];  /* 1, 5, and 15 minute load averages */unsigned long totalram;  /* 总的可用的内存大小 */unsigned long freeram;   /* 还未被使用的内存大小 */unsigned long sharedram; /* 共享的存储器的大小*/unsigned long bufferram; /* 共享的存储器的大小 */unsigned long totalswap; /* 交换区大小 */unsigned long freeswap;  /* 还可用的交换区大小 */unsigned short procs;    /* 当前进程数目 */unsigned long totalhigh; /* 总的高内存大小 */unsigned long freehigh;  /* 可用的高内存大小 */unsigned int mem_unit;   /* 以字节为单位的内存大小 */char _f[20-2*sizeof(long)-sizeof(int)]; /* libc5的补丁
};


http://chatgpt.dhexx.cn/article/TBqInwqa.shtml

相关文章

sysinfo 函数

在linux系统中&#xff0c;我们可以使用sysinfo()获取一些系统统计信息。我们在终端命令行中输入“man 2 sysinfo”即可获取sysinfo()的详细信息&#xff0c;如下图所示。 从上图可以知道&#xff0c;使用uname需要包含头文件"#include <sys/sysinfo.h>" sysi…

natapp

简介 natapp是一个内网穿透工具&#xff0c;内网穿透也叫做内网映射&#xff0c;也叫“NAT穿透”&#xff0c;所谓内网穿透简单来说就是让外网能够访问内网&#xff0c;即把自己的电脑当服务器&#xff0c;让别人能够访问自己的电脑。 使用 1、注册一个账号&#xff0c;并且进…

WAP PUSH

PUSH &#xff08;WAP-PUSH&#xff09;又叫做服务信息或推入信息&#xff0c;是一种特殊格式的短信。 目录 基本简介 特点优势 系统框架 推送协议 推送服务方式 短消息网关简介 基于短信网关发送WAP PUSH wapPDU 模式 分析 良好前景 基本简介 特点优势 系统框架 推送协议 推送…

睡眠 应该用 a加权 c加权_时间加权平均价格算法(TWAP)和成交量平均算法(VWAP)在量化回测的应用...

本应用实践平台为BigQuant人工智能量化平台 为什么要引入TWAP和 VWAP&#xff1f; 为了评估策略的资金容量&#xff0c;我们对M.trade模块里买入点和卖出点这两个参数进行了更丰富的扩展&#xff0c;支持了策略能够按更丰富的算法交易价格&#xff08;WAP&#xff09;进行撮合。…

【Java使用pushy(com.eatthepath)对接APns消息推送(基于HTTP/2协议)】

Java使用pushy(com.eatthepath)对接APns消息推送(基于HTTP/2协议) 需要IOS开发提供的信息 1.推送证书,.p8格式的文件 2.bundleId 3.keyId 4.teamId MAVEN依赖 <dependency><groupId>com.eatthepath</groupId><artifactId>pushy</artifactId>…

HTAP 简介

2019独角兽企业重金招聘Python工程师标准>>> HTAP的定义 数据库系统一般可以按照负载类型分成操作型数据库(Operational Support System)和决策型数据库(Decision Support System)。操作型数据库主要用于应对日常流水类业务,主要是面向消费者类的业务;决策型数…

爬取twitter数据--使用twint

最近因为实验验证的需要&#xff0c;想要爬取推特的数据&#xff0c;首先想到的是通过推特官方的开发者计划拿到key然后直接爬取&#xff0c;连接如下&#xff1a; twitter myapp 但是问题就在于&#xff0c;这玩意我用两个号申请都被拒绝了&#xff0c;据说是86的号码被拒就是…

tweepy抓取Twitter数据

Tweepy是Twitter官方提供的Python第三方开发库&#xff0c;简单好用易学高效&#xff01; 安装的流程很简单&#xff0c;如果你和我一样的win10_64bit用户&#xff0c;如果你配置了pip管理器&#xff0c;在你的终端里输入 >> pip install tweepy 就会自动安装好了 我们先…

【PWA学习】4. 使用 Push API 实现消息推送

引言 在接下来的内容里&#xff0c;我们会探究 PWA 中的另一个重要功能——消息推送与提醒(Push & Notification)。这个能力让我们可以从服务端向用户推送各类消息并引导用户触发相应交互 Web Push 效果 Push API 和 Notification API 其实是两个独立的技术&#xff0c;完全…

TWAMP 协议

使用标准协议测量IP网络性能始终是一项挑战。IP发明者曾作为TCP/IP协议套件的一部分提供了一些工具,如Internet控制消息协议(ICMP)Ping、Traceroute和用户数据报协议(UDP)Echo。但是,这些工具并不是为执行总体性能测试而准备的,而是设计用于简单排查IP网络故障。因此,企…

HTAP技术

传统业务采取隔天隔天将数据抽取到OLAP的方式&#xff0c;带来了两个问题 1&#xff0c; 报表往往需要隔天才能出来&#xff0c;无法满足业务需要&#xff1b; 2&#xff0c;带来了多副本的问题&#xff1b; OLTP里面至少三个副本&#xff1b; OLAP里面又至少3个副本&#xf…

【区块链 | Uniswap】3.剖析DeFi交易产品之Uniswap:V2下篇

前言 上篇我们主要讲了 UniswapV2 整体分为了哪些项目&#xff0c;并重点讲解了 uniswap-v2-core 的核心代码实现&#xff1b;中篇主要对 uniswap-v2-periphery 的路由合约实现进行了剖析&#xff1b;现在剩下 V2 系列的最后一篇&#xff0c;我会介绍剩下的一些内容&#xff0…

量化交易中VWAP/TWAP算法的基本原理和简单源码实现(C++和python)

参考文献&#xff1a; https://en.wikipedia.org/wiki/Time-weighted_average_price https://en.wikipedia.org/wiki/Volume-weighted_average_price http://blog.sina.com.cn/s/blog_163a2b9700102wdy0.html https://www.douban.com/note/214362575 算法交易其实主要是用在…

用高频交易的方式对TWAP算法优化(TWAP算法、算法实现、高频交易、冰山算法)

用高频交易的方式对TWAP算法进行优化。 以下内容主要基于执行算法的讨论。 什么是TWAP算法&#xff08;时间加权平均价格&#xff09;&#xff1f; TWAP交易时间加权平均价格Time Weighted Average Price 模型是把一个母单的数量平均地分配到一个交易时段上。该模型将交易时…

算法交易简介以及TWAP、VWAP算法原理

算法交易视频&#xff1a;算法交易视频 1&#xff0c;交易成本&#xff1a; 交易成本分成两类&#xff0c;一类是显性成本&#xff0c;包括佣金&#xff08;包括券商佣金&#xff08;券商收取&#xff09;&#xff0c;交易经手费&#xff08;交易所收取&#xff0c;千分之0.0…

时间加权平均价格算法(TWAP)和成交量平均算法(VWAP)在量化回测的应用

为什么要引入TWAP和 VWAP&#xff1f; 为了评估策略的资金容量&#xff0c;我们对M.trade模块里买入点和卖出点这两个参数进行了更丰富的扩展&#xff0c;支持了策略能够按更丰富的算法交易价格&#xff08;WAP&#xff09;进行撮合。 如果资金是10万的话&#xff0c;那么在开…

平均价格算法:TWAP vs. VWAP

时间加权平均价格 (TWAP) 和成交量加权平均价格 (VWAP) 算法应用不同的方法来计算资产价格&#xff0c;这是所有去中心化金融 (DeFi) 原语的组成部分。 在本文中&#xff0c;我们介绍了 TWAP 和 VWAP 算法之间的差异&#xff0c;解释了它们如何在区块链环境中为资产定价&#…

json对象中的数组怎么转化为json字符串

注意&#xff1a;去掉数组下标&#xff0c;才有效&#xff1f; JSON是一种数据交换格式&#xff0c;与XML数据格式相比更加方便使用&#xff0c;互联网中的URL请求接口大部分都是已JSON数据格式进行交互&#xff0c;对接数据解析也是非常方便容易&#xff0c;在字符串与JSON对…

json对象转对象数组

对象的两种取值方式 let obj {name: wan}; console.log(obj.name); //wan这是最普通的一种方式&#xff0c;还有一种方式我们用的不太多&#xff0c;就是使用[]包住属性名取值 let obj {name: wan}; console.log(obj[name]); //wan将对象转化为数组 let obj {未完成:5, 已…

JSON对象/数组与JSON字符串之间的相互转换

文章目录 前言JSON介绍如何判断JS数据类型JSON数组转化为JSON字符串JSON对象转化为JSON字符串JSON字符串转化为JSON数组/对象注意点 前言 这里先介绍一个个人觉得很好用的谷歌浏览器的功能&#xff1a;snippet 就是类似收藏夹&#xff0c;平常你可能会用到的调试有关的东西都可…