设置java使用一个cpu

时间:2009-05-27 08:29:10

标签: java solaris cpu-usage

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

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

4 个答案:

答案 0 :(得分:3)

这是一种解决方法,但是使用Solaris 10,您可以设置一个可用单个CPU的区域,然后在该区域内运行该应用程序。

如果你想在不运行完整应用程序的情况下进行测试,那么这一点Java很可能是他们用来获取CPU数量的:

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

完整示例here

答案 1 :(得分:1)

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

这样做的一种方法是将JVM暂停在适当的位置,即远程调试器的套接字附加,并以挂起模式启动。如果将以下参数传递给java调用:

  

-Xdebug -Xrunjdwp:transport = dt_socket,address = 8000,suspend = y,server = y

然后JVM将在启动java进程之后但在执行主类之前暂停,直到调试器/代理连接到端口8000。

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

这个想法中的缺陷或潜在的打嗝将是在调试模式下运行是否会显着影响应用程序的性能(它通常不会产生很大影响),是否可以控制某种无操作JDWP来自命令行的代理,以及您是否能够在计算机上打开端口。这不是我之前尝试过自动化的东西(尽管我在手动方式中使用了大致类似的东西来增加Java进程的nice之前),所以我可能还有其他问题。被忽视了。

答案 2 :(得分:1)

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

% pbind -b 0 $$
% java ...

答案 3 :(得分:-1)

谷歌搜索,我发现你是对的, pbind 将进程绑定到处理器。

更多信息和示例:http://docs.sun.com/app/docs/doc/816-5166/pbind-1m?a=view