我在 Amazon EC2 微实例上的 JVM 中运行 Play Framework Scala 应用程序。该应用程序有时会索引大量文本。但是,如果虚拟机的 CPU 一直处于高负载状态,则管理程序会通过从虚拟机中窃取时间并将其提供给由该管理程序管理的其他虚拟机来惩罚虚拟机。
我正在考虑测量当前被盗的时间量,如果它太高(例如超过 5%),那么我将暂停索引一段时间。东西问题:
这是个好主意吗?(是疯了吗?还是有更好的方法?)
我如何测量从 Scala / Java 窃取的时间?
目前我正在考虑进行外部流程调用(例如
Seq("bash", "-c", "echo
日期")!!
vmstat
或/proc/stat
解析输出,并找到被盗的时间。但这可能容易出错?如果例如新版本的vmstat
输出数据以另一种格式怎么办。我猜,但是, 的输出/proc/stat
永远不会以非向后兼容的方式改变。(?)
所有这些都不需要在 Windows 上运行。仅限 Linux 版本,例如 Ubuntu 和 CentOS。如果外部进程调用失败,我会简单地返回 Scala 的None
而不是Some(percentage)
.
更新:我找到了一个名为 Sigar 的库,它的功能getStolen
可能合适。它返回一个double
表示“总系统 cpu 非自愿等待时间”的值——但是以什么单位?我想知道它是否不幸的是自应用程序启动以来的总和。无论如何,这里有人实际使用它来打印被盗时间:https ://forums.oracle.com/thread/1301532