动态限制VirtualBox的CPU使用

vbox_cpulimit夏天,除了蚊子产生的嗡嗡声,可能就是本本风扇产生的噪声最令人反感了。

我习惯于在Linux下面运行一个用VirtualBox虚拟的Windows,VirtualBox会占用很多很多CPU资源,把本本双核的一个核占满是经常的事情,弄得风扇非常可怜 :-| 虽然VirtualBox有暂停功能,不过暂停之后在虚拟机下面运行的程序也被暂停了,并不方便。终于,我决定要只分给VirutalBox可怜的CPU资源 :evil:

Linux下有一个叫做cpulimit(Link)的工具,可以很方便地限制指定进程的CPU使用率,效果很好。不过,简单地用它限制VirtualBox的CPU使用率之后,虚拟机会工作会很迟钝,甚至播放一段音乐都会断断续续。

Windows下面有一个选项,可以选择把系统资源优先分配给前台程序或者是后台服务,默认是前台程序。这个设置效果明显,比如同时运行两个7-Zip的Benchmark的话,处于前台的程序会有更好的结果:

7-Zip Benchmarks

7-Zip Benchmarks

在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)就可以对指定进程动态进行限制了 :-P
这段脚本考虑到了被重复执行以及待监视进程中途退出的情况,都可以正确地处理:

#!/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启动声 :-P 。经过这样处理后效果比较明显,风扇转得再也不如以前那样疯狂了 :-)

5 thoughts on “动态限制VirtualBox的CPU使用

  1. 我使用cpulimit对VirtualBox进程限制CPU后,VirtualBox里面的虚拟机的时间都变慢了。。。

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>