我曾经有过从正在运行的应用程序中确定以下性能参数的任务:
-
可用的虚拟内存总量
-
当前使用的虚拟内存
-
我的进程当前使用的虚拟内存
-
总RAM可用
-
目前使用的RAM
-
我的进程当前使用的RAM
-
%CPU当前使用
-
%我的进程当前使用的CPU
代码必须在Windows和Linux上运行 . 即使这似乎是一项标准任务,但在手册(WIN32 API,GNU文档)以及Internet上查找必要信息花了我好几天,因为关于这个主题的信息太多不完整/不正确/过时了发现了那里 .
为了避免其他人遇到同样的麻烦,我认为收集所有分散的信息以及我在一个地方通过反复试验找到的信息是个好主意 .
9 回答
对于Linux您还可以使用/ proc / self / statm来获取包含关键进程内存信息的单行数字,这比处理来自proc / self / status的一长串报告信息要快得多 .
见http://man7.org/linux/man-pages/man5/proc.5.html
QNX
由于这就像是“代码的代码”,我想从QNX知识库中添加一些代码(注意:这不是我的工作,但我检查了它,它在我的系统上工作正常):
如何在%中获得CPU使用率:http://www.qnx.com/support/knowledgebase.html?id=50130000000P9b5
如何获得免费(!)内存:http://www.qnx.com/support/knowledgebase.html?id=50130000000mlbx
Mac OS X - CPU
总CPU使用率:
来自Retrieve system information on MacOS X?:
Mac OS X.
我希望也能为Mac OS X找到类似的信息 . 因为它不在这里,所以我自己出去挖了它 . 以下是我发现的一些事情 . 如果有人有任何其他建议,我很乐意听到他们 .
虚拟内存总量
这个在Mac OS X上很棘手,因为它不使用预设的交换分区或像Linux这样的文件 . 这是Apple的文档中的条目:
因此,如果您想知道仍有多少虚拟内存可用,则需要获取根分区的大小 . 你可以这样做:
当前使用的虚拟总数
使用“vm.swapusage”键调用systcl可提供有关交换使用情况的有趣信息:
并非如果需要更多交换,此处显示的总交换使用量可能会发生变化,如上一节所述 . 所以总数实际上是当前的掉期总额 . 在C中,可以通过以下方式查询此数据:
请注意,在sysctl.h中声明的“xsw_usage”似乎没有记录,我怀疑有更便携的方式来访问这些值 .
我的进程当前使用的虚拟内存
您可以使用
task_info
函数获取有关当前进程的统计信息 . 这包括进程的当前驻留大小和当前虚拟大小 .可用的总RAM
使用
sysctl
系统函数可以获得系统中可用的物理RAM量,如下所示:目前使用的RAM
您可以从
host_statistics
系统函数获取常规内存统计信息 .这里需要注意的一点是Mac OS X中有五种类型的内存页面 . 它们如下:
Wired 已锁定到位且无法换出的页面
Active 页面正在加载到物理内存中并且相对难以换出
Inactive 页面已加载到内存中,但最近未使用过,甚至可能根本不需要 . 这些是交换的潜在候选人 . 这个内存可能需要刷新 .
Cached 页面已经过一些可能很容易被重用的缓存 . 缓存内存可能不需要刷新 . 仍然可以重新激活缓存页面
Free 页面完全免费且可以使用 .
值得注意的是,仅仅因为Mac OS X有时可能显示的实际空闲内存非常少,因此可能无法很好地指示在短时间内可以使用多少内存 .
我的进程当前使用的RAM
请参阅上面的“我的进程当前使用的虚拟内存” . 相同的代码适用 .
Linux
在Linux中,此信息在/ proc文件系统中可用 . 我不是所用文本文件格式的忠实粉丝,因为每个Linux发行版似乎都自定义了至少一个重要文件 . 快速浏览“ps”的来源可以揭示混乱局面 .
但是,这里可以找到您寻找的信息:
/proc/meminfo 包含您寻求的大多数系统范围的信息 . 在我的系统上看起来像;我想你对 MemTotal , MemFree , SwapTotal 和 SwapFree 感兴趣:
对于CPU利用率,您必须做一些工作 . Linux自系统启动以来提供整体CPU利用率;这可能不是你感兴趣的 . 如果你想知道最后一秒或10秒的CPU利用率是多少,那么你需要查询信息并自己计算 .
这些信息可在 /proc/stat 中获得,该文件在http://www.linuxhowtos.org/System/procstat.htm上有很好的记录;这是我的4核盒子上的样子:
首先,您需要确定系统中有多少CPU(或处理器或处理核心)可用 . 为此,请计算'cpuN'条目的数量,其中N从0开始并递增 . 不要计算'cpu'行,它是cpuN行的组合 . 在我的示例中,您可以看到cpu0到cpu3,总共4个处理器 . 从现在开始,您可以忽略cpu0..cpu3,并只关注'cpu'行 .
接下来,您需要知道这些行中的第四个数字是空闲时间的度量,因此“cpu”行上的第四个数字是自启动时间以来所有处理器的总空闲时间 . 这个时间是在Linux“jiffies”中测量的,每个是1/100秒 .
但你不关心总的空闲时间;你关心给定时期内的空闲时间,例如最后一秒 . 计算一下,你需要读取这个文件两次,相隔1秒 . 然后你可以做一行该行的第四个值 . 例如,如果您采样并获得:
然后一秒钟后你得到这个样本:
减去这两个数字,得到396的差值,这意味着你的CPU在过去的1.00秒内空闲了3.96秒 . 当然,诀窍是你需要除以处理器的数量 . 3.96 / 4 = 0.99,你的空闲百分比; 99%空闲,1%忙 .
在我的代码中,我有一个360条目的环形缓冲区,我每秒都读取这个文件 . 这让我可以快速计算CPU利用率1秒,10秒等,一直到1小时 .
对于特定于流程的信息,您必须查看 /proc/pid ;如果你不关心你的pid,你可以查看/ proc / self .
您的流程使用的CPU在 /proc/self/stat 中可用 . 这是一个奇怪的文件,由一行组成;例如:
这里的重要数据是第13和第14个令牌(这里是0和770) . 第13个标记是进程在用户模式下执行的jiffies数,第14个标记是进程在内核模式下执行的jiffies数 . 将两者一起添加,即可获得总CPU利用率 .
同样,您必须定期对此文件进行采样,并计算差异,以便确定进程随时间的CPU使用情况 .
Edit: 请记住,在计算进程的CPU利用率时,必须考虑1)进程中的线程数,以及2)系统中的处理器数 . 例如,如果您的单线程进程仅使用25%的CPU,那可能是好的也可能是坏的 . 单处理器系统很好,但4处理器系统不好;这意味着您的进程不断运行,并使用100%的可用CPU周期 .
对于特定于进程的内存信息,您需要查看/ proc / self / status,如下所示:
以'Vm'开头的条目是有趣的:
VmPeak 是进程使用的最大虚拟内存空间,单位为kB(1024字节) .
VmSize 是进程使用的当前虚拟内存空间,单位为kB . 在我的例子中,它非常大:651,352 kB,或大约636兆字节 .
VmRss 是已映射到进程的地址空间或其驻留集大小的内存量 . 这要小得多(420,296 kB,或大约410兆字节) . 区别:我的程序通过mmap()映射了636 MB,但只访问了410 MB,因此只分配了410 MB的页面 .
我不确定的唯一项目是 Swapspace currently used by my process . 我不知道这是否可用 .
Windows
上面的一些值可以从相应的WIN32 API轻松获得,我只是在这里列出它们的完整性 . 然而,其他人需要从性能数据助手库(PDH)获得,这有点“不直观”并且需要大量痛苦的试验和错误才能开始工作 . (至少它花了我一段时间,也许我只是有点愚蠢......)
注意:为清楚起见,以下代码中省略了所有错误检查 . 检查返回代码......!
注意:名称“TotalPageFile”在这里有点误导 . 实际上,此参数提供“虚拟内存大小”,即交换文件的大小加上已安装的RAM .
与“Total Virtual Memory”中的代码相同,然后
与“Total Virtual Memory”中的代码相同,然后
与“当前进程当前使用的虚拟内存”中的代码相同
Linux
在Linux上,最初看起来很明显的选择是使用POSIX API,如getrusage()等 . 我花了一些时间试图让它工作,但从来没有得到有意义的值 . 当我最终检查内核源代码时,我发现显然这些API尚未完全实现,因为Linux内核2.6!
最后,我通过读取伪文件系统/ proc和内核调用的组合获得了所有值 .
与“Total Virtual Memory”中的代码相同,然后
与“Total Virtual Memory”中的代码相同,然后
与“Total Virtual Memory”中的代码相同,然后
在“当前进程当前使用的虚拟内存”中更改getValue(),如下所示:
TODO:其他平台
我认为,除了读取/ proc伪文件系统的部分之外,一些Linux代码也适用于Unix . 也许在Unix上这些部分可以用getrusage()和类似的函数代替?如果有Unix技术人员可以编辑这个答案并填写详细信息?!
in windows you can get cpu usage by code bellow:
Linux
读取内存和加载数字的便携方式是sysinfo call
用法
说明
我在我的C项目中使用了以下代码,它运行良好: