2009-05-27 92 views
8

我有一个应用程序,它拥有一组cpus的许可证,我希望能够在检查完成之前将java运行的cpus数量设置为1。我正在运行Solaris并查看了pbind,但认为如果我启动了应用程序,然后使用了pbind,它将在设置java可以使用的CPU数量之前检查许可证。将java设置为使用一个cpu

有谁知道在Solaris上使用一定数量的CPU启动应用程序的方法吗?

回答

3

这是一个解决办法,但使用Solaris 10,你可以设置可用单个CPU的区域,然后运行区间内的应用程序。

如果你想要做的测试,而无需运行完整的应用程序,此Java位最有可能是他们使用获得CPU的数量是什么:

Runtime runtime = Runtime.getRuntime(); 
int nrOfProcessors = runtime.availableProcessors(); 

完整的例子here

+0

我会很有兴趣知道如果使用pbind更改availableProcessors()的结果。 – 2009-05-27 13:12:06

1

这不是一个完整的解决方案,但可能足以发展成一个。确实存在java进程存在的点(因此可以由pbind控制),并且此时尚未运行代码来执行处理器检查。如果你可以暂停启动应用程序本身,直到pbind完成它的工作,这应该是好的(假设pbind的想法将从CPU检查的角度来看)。

要做到这一点的一种方法,应该在适当的地方将JVM暂停一下,就是远程调试器的套接字连接,并以暂停模式启动。如果您通过以下参数到java调用:

-Xdebug -Xrunjdwp:交通= dt_socket,地址= 8000,暂停= Y,服务器= Y

那么JVM就会启动后暂停java进程,但在执行主类之前,直到调试器/代理连接到端口8000.

因此,也许可以使用包装脚本在后台启动程序,并使用这些参数,第二个左右,使用pbind为java进程设置处理器的数量为1,然后a并将一些代理分离到端口8000(这足以让Java继续执行)。

这个想法中的缺陷或潜在的问题是,在调试模式下运行是否会显着影响应用程序的性能(它看起来总体上没有太大影响),无论您是否可以控制某种无操作命令行中的JDWP代理以及您是否能够在机器上打开端口。这不是我以前试图自动化的东西(尽管我在手动方式中使用了大致相似的东西来增加Java过程的松散度),所以可能会有其他问题被忽略。

1

我认为你的问题最直接的答案是使用pbind绑定正在运行的shell进程,然后从该shell启动Java。根据手册页,pbind的效果由从绑定进程创建的进程继承。试试这个:

% pbind -b 0 $$ 
% java ... 
相关问题