我有一个计算密集型的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)还有其他建议吗?
答案 0 :(得分:4)
获取PID然后解析/proc/<PID>/stat
的内容以获取有关您的进程的信息,并/proc/stat
获取全局CPU信息。他们都有一堆统计数据可供您决定何时开始工作以及何时入睡。请man proc
查看所有字段的文档(长)。有良好信息的相关问题:stackoverflow.com/questions/1420426
设定好感很容易,也很可靠。自己做事工作要多得多,但可能会给你更多的控制权。如果你的实际目标只是作为一个后台任务运行,我会很高兴并完成它。
答案 1 :(得分:4)
使用Caml的Unix
库定期捕获您的CPU时间和经过的时间。您的CPU使用率是该比率。试试Unix.gettimeofday
和Unix.times
。注:您需要使用-lunix
选项进行关联。
我也会在nice
下运行该过程并完成它。