【问题标题】:Ocaml: Getting CPU usage of processOcaml:获取进程的 CPU 使用率
【发布时间】:2011-10-04 21:53:31
【问题描述】:

我想做什么

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

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

(2) 应用程序仅使用“空闲”处理能力(例如,如果其他进程加起来达到 100%,则 OCaml 应用程序暂停;如果其他进程几乎为 0%,则 OCaml 应用程序没有限制;如果其他进程加起来是 50%,然后 OCaml 将使用高达 50%)。

一些想法

我的想法是在代码中的各个检查点检查 CPU 使用率,并在必要时暂停执行。

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

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

我的问题

(Q1) 我如何从我的 OCaml 应用程序中知道应用程序进程的 CPU 使用率是多少? (我想用 OCaml 函数而不是通过在命令行上调用“ps”或类似的东西来做到这一点......)

(Q2) 你认为我实现 (2) 的想法有问题吗?改变流程的好坏有哪些实际区别?

(Q3)您对(2)还有什么建议吗?

【问题讨论】:

    标签: ocaml cpu-usage background-process


    【解决方案1】:

    使用 Caml 的 Unix 库定期捕获您的 CPU 时间和经过的时间。你的 CPU 使用率就是这个比率。试试Unix.gettimeofdayUnix.times。注:您需要使用 -lunix 选项链接。

    我也会在nice 下运行该进程并完成它。

    【讨论】:

    • 谢谢!刚试了一下,似乎效果很好。同时运行三个虚拟“密集型”应用程序实例,两个 nice=20,另一个 nice=0,分别测量了 30%、30% 和 45%。同时它有点奇怪,因为它应该添加不到 100%...MAC 上的活动监视器告诉我 50%、50% 和 80%(请注意,由于双处理器,监视器数字加倍)。
    【解决方案2】:

    获取您的 PID,然后解析 /proc/<PID>/stat 的内容以获取有关您的进程的信息,并解析 /proc/stat 以获取全局 CPU 信息。他们都有一堆统计数据,你可以用它们来决定什么时候工作和什么时候睡觉。执行man proc 以查看所有字段(长)的文档。相关问题有很好的信息:stackoverflow.com/questions/1420426

    设置 niceness 既简单又可靠。自己做事需要更多的工作,但可能会给你更多的控制权。如果您的实际目标只是作为后台任务运行,我会很好地完成它。

    【讨论】:

    • 我在 Mac OS X 上,所以我没有/proc/stat。但我可以使用ps -v -p [PID] | grep [PID] 并得到一个简单的解析行。这种方法的问题在于,当我运行ps 时,系统将在执行此 ps 调用时而不是在执行我的计算时向我提供有关我的应用程序 CPU 使用率的信息。更密集。这就是为什么我想要一些 OCaml 函数来为我做这件事。我想使用 CPU 时间和运行时间(正如诺曼建议的那样)应该是一个更好的选择。谢谢!
    猜你喜欢
    • 2012-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-27
    • 1970-01-01
    • 2010-09-06
    • 1970-01-01
    相关资源
    最近更新 更多