Ocaml:获取进程的CPU使用率 我想做什么

Ocaml:获取进程的CPU使用率 我想做什么,ocaml,cpu-usage,background-process,Ocaml,Cpu Usage,Background Process,我有一个计算密集型OCaml应用程序,我希望它在后台运行,而不会干扰正常的计算机使用。我想向用户提供两个选项: (1) 应用程序仅在CPU使用率几乎为0%时运行 (2) 该应用程序仅使用“免费”处理能力(例如,如果其他进程总计达到100%,则OCaml应用程序暂停;如果其他进程实际上为0%,则OCaml应用程序没有限制;如果其他进程总计达到50%,则OCaml将使用高达50%) 一些想法 我的想法是检查代码中各个检查点的CPU使用情况,必要时暂停执行 在(1)中,我们只需检查CPU是否低于2%,

我有一个计算密集型OCaml应用程序,我希望它在后台运行,而不会干扰正常的计算机使用。我想向用户提供两个选项:

(1) 应用程序仅在CPU使用率几乎为0%时运行

(2) 该应用程序仅使用“免费”处理能力(例如,如果其他进程总计达到100%,则OCaml应用程序暂停;如果其他进程实际上为0%,则OCaml应用程序没有限制;如果其他进程总计达到50%,则OCaml将使用高达50%)

一些想法 我的想法是检查代码中各个检查点的CPU使用情况,必要时暂停执行

在(1)中,我们只需检查CPU是否低于2%,如果不低于2%,则暂停,直到CPU再次低于2%

在第(2)条中,情况更加棘手。由于在没有限制的情况下,应用程序总是会消耗100%的CPU,而且检查点会非常频繁,为了将CPU使用率降低到(比如)一半,我只需在每个检查点将其延迟到两个检查点之间的时间。如果检查点频繁,我会说,这将类似于使用50%的CPU。对于其他百分比,我们可以通过暂停适当的时间来做类似的事情。然而,这看起来很做作,充满了开销,最重要的是,我不确定它是否真的能满足我的要求。更好的替代方法是在应用程序开始时使用适当的整数调用
Unix.nice n
。我认为设置
n=15
可能是正确的

我的问题 (Q1)如何从OCaml应用程序中知道应用程序进程的CPU使用情况?(我希望使用OCaml函数来实现这一点,而不是通过在命令行上调用“ps”或类似的东西…)

(问题2)你认为我的想法有问题吗。改变过程的精确性有哪些实际区别


(Q3)您对(2)还有其他建议吗?

获取您的PID,然后解析
/proc//stat
的内容以获取有关您的进程的信息,以及
/proc/stat
以获取全局CPU信息。他们都有一系列的统计数据,你可以用来决定什么时候工作,什么时候睡觉。执行
man proc
查看所有字段的文档(长)。相关问题与良好的信息:


设置准确,简单可靠。自己做事情需要更多的工作,但可能会给你更多的控制权。如果您的实际目标只是作为后台任务运行,我会选择nice并完成它。

使用Caml的
Unix
库定期捕获您的CPU时间和运行时间。您的CPU使用率就是这个比率。尝试
Unix.gettimeofday
Unix.times
。注意:您需要链接到
-lunix
选项


我也会在
nice
下运行这个过程,然后完成它。

我在Mac OS X上,所以我没有
/proc/stat
。但是我可以使用
ps-v-p[PID]| grep[PID]
并获得一行易于解析的代码。这种方法的问题是,当我运行
ps
时,系统将在执行此ps调用时,而不是在执行更密集的计算时,向我提供有关应用程序CPU使用情况的信息。这就是为什么我需要一些OCaml函数来为我做这件事。我认为使用CPU时间和运行时间(正如诺曼所建议的)应该是一个更好的选择。谢谢谢谢刚试过,似乎效果不错。同时运行虚拟“密集型”应用程序的三个实例,其中两个实例的nice=20,另一个实例的nice=0,测量值分别为30%、30%和45%。同时,这有点奇怪,因为它应该添加不到100%。。。MAC上的活动监视器告诉我50%、50%和80%(请注意,由于采用了双处理器,监视器的数字增加了一倍)。