想用 C++获取 CPU 、内存的使用率,要求跨平台( Windows 、Linux )。查到的解决办法如下:
请教各位大佬,有没有更好的解决办法?
1
ysc3839 2020-05-06 11:13:57 +08:00
首先目前来看 C++ 标准库中是没有相关功能的,所以最终只能调用系统 API 来获取。
接下来就是看有没有现成的第三方库了,我没调查过不好说,如果没有的话,就只能自己实现了。 根据你程序运行的平台来写,应该不会太难吧?只需要支持 Windows 和 Linux 的话不太难。 Windows 的话内存使用率可以使用 GlobalMemoryStatusEx https://docs.microsoft.com/en-us/windows/win32/api/sysinfoapi/nf-sysinfoapi-globalmemorystatusex 不过没有任务管理器那里那么详细。CPU 使用率 (准确说是一段时间内非空闲时间百分比) 可以用 GetSystemTimes 读了自己算出来。 |
2
3dwelcome 2020-05-06 11:20:25 +08:00
linux 下统计内存使用率好像意义不大,因为基本都是被占满的状态。
|
3
wtof 2020-05-06 11:26:18 +08:00
这些功能本来就是平台相关的,其他库也无非就是第三种方法封装了一层实现
个人倾向于第三种然后自己封一层接口 |
4
Nitroethane 2020-05-06 11:35:02 +08:00 via iPhone
@3dwelcome 不了解就不要乱说,Linux 下空闲内存都被用作 file cache,在内存不足触发 watermark 的情况下,被用作 file cache 的大部分是能够被内核重新收回的
Linux 下要获取各种数据的话需要自己去解析 /proc 下的各种文件,然后再通过阅读 /proc 的 manual 了解文件中每个字段的含义,比如内存信息的话 /proc/meminfo 。 Windows 的话不清楚 |
5
3dwelcome 2020-05-06 11:39:43 +08:00
@Nitroethane 我怎么就乱说了?真喵的奇怪了,都知道 linux 空闲内存会被用来加速,一般情况下服务器长期运行,所以很难统计真正空余内存有多少。
这点和 windows 不一样,我就提一下,你还真是会喷人啊。 |
6
Nitroethane 2020-05-06 11:47:10 +08:00
@3dwelcome #5 ?一脸懵逼,这年头 “不了解就不要乱说” 也算是喷人了么?既然你觉得我是在喷你,那我向你道歉好吧。话说回来, 建议了解一下 /proc/meminfo 里面所有字段的含义么和 Linux 的内存回收机制
|
7
systemcall 2020-05-06 11:47:19 +08:00 via Android
@3dwelcome 并不是没意义吧。有时候内存泄漏了,不好修就趁没爆内存把那个进程杀了重开,这样起码还可以用,要求不太高的地方就可以这么搞
|
8
wslzy007 2020-05-06 11:51:44 +08:00
windows 下使用 winapi,cpu 线程数使用 GetSystemInfo ; linux 系使用 /proc/xxx 大法,自己计算。
|
9
zhuangzhuang1988 2020-05-06 12:00:41 +08:00 1
osquery 这个项目里
找找. |
10
3dwelcome 2020-05-06 12:00:48 +08:00 6
@Nitroethane 说者无心,听者有意。楼上有人支持你,我也向你道歉。可能我确实表述太过敷衍,也没描述清楚。
同一个物体,在不同角度去看,是不一样的。太简单的回复写出来是一个意思,被人看又是另外一个意思了。 |
11
Nitroethane 2020-05-06 12:07:35 +08:00 5
@3dwelcome #10 抱歉,其实我说话的方式也有点问题,不过就不用纠结这种小事了
|
12
songjiaxin2008 2020-05-06 12:27:17 +08:00 1
可以参考 prometheus node_exporter
https://github.com/prometheus/node_exporter |
13
evilic 2020-05-06 12:27:59 +08:00
我觉得 @3dwelcome 说的没啥不对的……因为在我看来,那样的内存使用率确实意义不大。
至少我读取虚拟机内存的信息的时候,就是这样的情况。 读 /proc/ 目录?我在虚拟机外不会去读这些文件的。 我只是把两个情况统一成一个问题看待了。 |
14
tigerstudent 2020-05-06 12:34:17 +08:00 via Android 3
给 10 楼 11 楼两个乖宝宝都发了个感谢铜币。
|
15
Chenamy2017 2020-05-06 12:40:35 +08:00
也不难,自己封装吧,用别人库的代价大于自己实现的代价。
|
16
UnknownR 2020-05-06 13:08:18 +08:00 1
这个不复杂,自己封装下即可,windows 下 CPU 的话可以实例一个 performancecounter, 内存可以 query wmi,有内置属性,Win32_OperatingSystem 下的 FreePhysicalMemory 和 Win32_ComputerSystem 下的 TotalPhysicalMemory
|
17
xdeng 2020-05-06 13:58:05 +08:00
#ifdef WIN32
#else Mac #endif |
18
misaka19000 2020-05-06 14:06:09 +08:00 1
@3dwelcome #9 这就是文字的坑爹之处,同样一段文字有时候在不同的人看来会有不同的感受,甚至于包含了正反两种截然不同的情绪,这大概也是互联网上面“杠精”越来越多的原因。因为在进行文字交流的时候总会伴随着大量的误解,但是由于文字这种交流渠道其自存在的及时性以及准确性方面的问题,有时候反而会使得这种误解进一步的加深。同时通过文字来进行解释或者说澄清本身也是一件非常麻烦的事情,因为在大部分时候我们都不太愿意花费精力去和一个陌生人去对某件事情进行解释(除非是在某种及其封闭的小圈子中),所以这大概也是互联网上戾气越来越重的原因~~~
|
19
paoqi2048 2020-05-06 14:06:09 +08:00
自己实现吧,不用多少代码
|
20
VYSE 2020-05-06 14:51:43 +08:00
参考 Python 跨平台实现 psutil.virtual_memory().available
|
21
Dlad 2020-05-06 15:47:38 +08:00
有参考 cacti 吗?
snmp 协议能实现吗? |
22
gamexg 2020-05-06 15:53:04 +08:00 1
c 的不知道,go 我用的是 https://github.com/shirou/gopsutil,windows 、linux 等系统都支持,可以参考下。
|
23
wzzzx 2020-05-06 19:47:42 +08:00
我之前用 Qt 也有这个需求,查资料时说是这些东西太平台相关性了,所以即便是 Qt 也没提供。自己写也不麻烦
|
24
xcstream 2020-05-06 22:47:52 +08:00
选 3
|
25
tianshiyeben 2020-05-07 09:29:14 +08:00
sigar 用着没有问题啊。这个监控工具就用 sigar 来采集系统信息的,这就是我写的监控系统。
https://github.com/tianshiyeben/wgcloud |
26
paoqi2048 2020-05-07 11:14:29 +08:00
@tianshiyeben sigar 在 GitHub 上的最后一次更新是 Jan 4, 2016
|