我有一個應用程序,它擁有一組cpus的許可證,我希望能夠在檢查完成之前將java運行的cpus數量設置爲1。我正在運行Solaris並查看了pbind
,但認爲如果我啓動了應用程序,然後使用了pbind,它將在設置java可以使用的CPU數量之前檢查許可證。將java設置爲使用一個cpu
有誰知道在Solaris上使用一定數量的CPU啓動應用程序的方法嗎?
我有一個應用程序,它擁有一組cpus的許可證,我希望能夠在檢查完成之前將java運行的cpus數量設置爲1。我正在運行Solaris並查看了pbind
,但認爲如果我啓動了應用程序,然後使用了pbind,它將在設置java可以使用的CPU數量之前檢查許可證。將java設置爲使用一個cpu
有誰知道在Solaris上使用一定數量的CPU啓動應用程序的方法嗎?
使用谷歌搜索,我發現你是對的,pbind將進程綁定到處理器。
更多信息和例子在:http://docs.sun.com/app/docs/doc/816-5166/pbind-1m?a=view
這是一個解決辦法,但使用Solaris 10,你可以設置可用單個CPU的區域,然後運行區間內的應用程序。
如果你想要做的測試,而無需運行完整的應用程序,此Java位最有可能是他們使用獲得CPU的數量是什麼:
Runtime runtime = Runtime.getRuntime();
int nrOfProcessors = runtime.availableProcessors();
完整的例子here。
我會很有興趣知道如果使用pbind更改availableProcessors()的結果。 – 2009-05-27 13:12:06
這不是一個完整的解決方案,但可能足以發展成一個。確實存在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過程的鬆散度),所以可能會有其他問題被忽略。
我認爲你的問題最直接的答案是使用pbind綁定正在運行的shell進程,然後從該shell啓動Java。根據手冊頁,pbind的效果由從綁定進程創建的進程繼承。試試這個:
% pbind -b 0 $$
% java ...
是的,謝謝,但unfortunatley,並沒有真正回答我的問題。 – 2009-05-27 08:42:54