夏天,除了蚊子产生的嗡嗡声,可能就是本本风扇产生的噪声最令人反感了。
我习惯于在Linux下面运行一个用VirtualBox虚拟的Windows,VirtualBox会占用很多很多CPU资源,把本本双核的一个核占满是经常的事情,弄得风扇非常可怜 虽然VirtualBox有暂停功能,不过暂停之后在虚拟机下面运行的程序也被暂停了,并不方便。终于,我决定要只分给VirutalBox可怜的CPU资源
Linux下有一个叫做cpulimit(Link)的工具,可以很方便地限制指定进程的CPU使用率,效果很好。不过,简单地用它限制VirtualBox的CPU使用率之后,虚拟机会工作会很迟钝,甚至播放一段音乐都会断断续续。
Windows下面有一个选项,可以选择把系统资源优先分配给前台程序或者是后台服务,默认是前台程序。这个设置效果明显,比如同时运行两个7-Zip的Benchmark的话,处于前台的程序会有更好的结果:
在Linux下就不一样了,并没有这样根据前台和后台而做的动态调整,尤其在图形界面下。不过既然Linux rocks,没有什么不可以 ;-) 。我决定设置成使用VirtualBox的时候不限制它的CPU使用率,只在我不使用VirtualBox的时候加以限制。
做到这些首先要解决的问题是,在Linux图形界面下如何知道我是不是正在使用VirtualBox。这个问题又涉及到如何得知目前处于前台的窗口是什么。对于后者,比较好的做法是:
xprop -root _NET_ACTIVE_WINDOW |
这条命令会返回当前处于前台的窗口的Window ID,接着可以使用xprop -id <id>查询该窗口的详细信息,通过检查Window Class或者标题就可以知道这个窗口是不是VirtualBox了。
知道这些其实已经可以很容易做出来一个针对VirtualBox的动态CPU限制脚本了,可是我还想把它扩展到其他程序。对于一个运行的程序,有唯一的一个Process ID,如果可以知道一个窗口是属于哪一个进程的就比较好办了,幸运的是这也是很容易的:
xprop -id ${window_id} _NET_WM_PID |
会返回指定Windows ID窗口所属的Process ID。
剩下的工作就很容易了~
下面是我正在使用的脚本,传入Process ID和一个CPU使用率数值(0到100)就可以对指定进程动态进行限制了
这段脚本考虑到了被重复执行以及待监视进程中途退出的情况,都可以正确地处理:
#!/bin/sh if [ $# -lt 2 ]; then echo "Usage: ${0} process_id cpu_limit_value" else if [ $(ps -o args -C `basename ${0}` | fgrep ${1} | wc -l) -gt 2 ] &> /dev/null; then echo "Process "${1}" is already under control." false else # limit = 1 when cpulimit is running, otherwise 0 limit=0 # only perform checking when target process is running while [ -d /proc/${1} ]; do wid=`xprop -root _NET_ACTIVE_WINDOW | sed 's/.* # //'` pid=`xprop -id ${wid} _NET_WM_PID | sed 's/.* = //'` if [ "${pid}" = "${1}" ]; then if [ $limit -eq 1 ]; then # target process window is actived, stop cpulimit kill `jobs -p` limit=0 fi elif [ $limit -eq 0 ]; then # target process window is unactived, start cpulimit cpulimit -p ${1} -l ${2} -z &> /dev/null & limit=1 fi sleep 5 done fi fi |
被这个脚本监视VirtualBox运行之后,我很高兴地听到了断断续续的Windows启动声 。经过这样处理后效果比较明显,风扇转得再也不如以前那样疯狂了 :-)
VirtualBox 这么占 CPU 的?
ps: 你的代码被 escape 了~
@pluskid: 确实很占CPU,一个java.exe就可以占完了。
代码被escape问题已经fixed
ym…
我现在嫌vb里面的cpu资源不够用。。。>_<
我使用cpulimit对VirtualBox进程限制CPU后,VirtualBox里面的虚拟机的时间都变慢了。。。
@Brick : VirtualBox 会时不时地和 Host 同步一下时间,所以这也不是特别严重的问题