我有一个应用程序具有一定数量的 cpus 的许可证,并且我希望能够在检查完成之前将 java 运行的 cpus 数量设置为 1。我正在运行 Solaris 并查看过pbind
但认为如果我启动应用程序然后使用 pbind 它会在设置 java 可以使用的 CPU 数量之前检查许可证。
有谁知道在 Solaris 上使用一定数量的 CPU 启动应用程序的方法?
这是一种解决方法,但使用 Solaris 10,您可以设置一个具有单个 CPU 可用的区域,然后在该区域内运行应用程序。
如果您想在不运行完整应用程序的情况下进行测试,那么这部分 Java 很可能是他们用来获取 CPU 数量的:
Runtime runtime = Runtime.getRuntime();
int nrOfProcessors = runtime.availableProcessors();
一个完整的例子在这里。
这不是一个完整的解决方案,但可能足以发展成一个。肯定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 代理命令行,以及您是否能够在机器上打开端口。这不是我之前尝试过的自动化(尽管我在nice
释放 Java 进程之前以手动方式使用了大致相似的方法来增加 Java 进程的灵活性),因此我可能忽略了其他问题。
我认为对您的问题最直接的答案是使用 pbind 绑定正在运行的 shell 进程,然后从该 shell 启动 Java。根据手册页,pbind 的效果由从绑定进程创建的进程继承。尝试这个:
% pbind -b 0 $$
% java ...
谷歌搜索,我发现你是对的,pbind将进程绑定到处理器。
更多信息和示例请访问:http ://docs.sun.com/app/docs/doc/816-5166/pbind-1m?a=view