2009-05-27 89 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 ... 
相關問題