由于我在树莓派4B上跑了各种服务,仅有的1GB内存已经所剩无几。为了能监控树莓派的各项信息,同时又要考虑到SD卡的寿命(我的树莓派的系统盘是一张已经十几岁“高龄”的SD卡)。所以只能自己实现一个资源占用低,写入少的系统信息监视器。
用到的接口
由于Linux万物皆文件。所以传感器信息等都能从某个文件中读取。
CPU温度
树莓派只有这个温度传感器。
读取/sys/class/thermal/thermal_zone0/temp
这个文件即可。将读出来的数值除以1000就是摄氏度了。
CPU使用率
读取/proc/stat
。
各列分别为name user nice system idle iowait irrq softirq steal guest guest_nice
。
cpu指标 | 含义 | 时间单位 | 备注 |
---|---|---|---|
user | 用户态时间 | jiffies | 一般/高优先级,仅统计nice<=0 |
nice | nice用户态时间 | jiffies | 低优先级,仅统计nice>0 |
system | 内核态时间 | jiffies | |
idle | 空闲时间 | jiffies | 不包含IO等待时间 |
iowait | I/O等待时间 | jiffies | 硬盘IO等待时间 |
irq | 硬中断时间 | jiffies | |
softirq | 软中断时间 | jiffies | |
steal | 被盗时间 | jiffies | 虚拟化环境中运行其他操作系统上花费的时间(since Linux 2.6.11) |
guest | 来宾时间 | jiffies | 操作系统运行虚拟CPU花费的时间(since Linux 2.6.24) |
guest_nice | nice来宾时间 | jiffies | 运行一个带nice值的guest花费的时间(since Linux 2.6.33) |
说明:
1、1 jiffies = 0.01s = 10ms
2、常用计算等式:CPU时间 = user + system + nice + idle + iowait + irq + softirq
3、man手册中iowait有单独说明,iowait时间是不可靠值,具体原因如下:
1)CPU不会等待I/O执行完成,而iowait是等待I/O完成的时间。
当CPU进入idle状态,很可能会调度另一个task执行,所以iowait计算时间偏小;
2)多核CPU中,iowait的计算并非某一个核,因此计算每一个cpu的iowait非常困难
3)这个值在某些情况下会减少
我采用100.0 - (100.0 * idle) / (user + nice + system + idle + iowait + irq + softirq + steal + guest + guest_nice)
计算CPU当前的使用率。
内存使用率
读取/proc/meminfo
。
我采用100.0 * (memTotal - memAvailable) / memTotal
计算内存使用率。
实现方式
其实就是一个 while(ture) ,然后每次 sleep 1秒再获取数据并保存到内存中。每隔一段时间将数据写入SD卡。虽然写入次数还是很多,但是由于集中写入的缘故,碎片化会大幅减少,而由于碎片导致的寿命损耗也会减少(具体参见闪存对一块只存了部分数据的block是如何新添数据的)。为了降低内存使用率,我采用C++编写这个程序。