1

そのため、組み込みの jetty と maven アプリ アセンブラー プラグインを使用して Web サーバーを実行しています。アプリ アセンブラー アプリを (ルートとして実行して) 直接呼び出すと、サーバーは正常に起動します。Nohup で実行しても、Web サーバーは完全に正常に起動します。

アプリ アセンブラー スクリプトを init.d スクリプト (Runlevels 235 / Start pri 98 / Stop pri 20 ) として登録し、service コマンドを使用して init.d スクリプトを実行すると、Web サーバーが起動中にハングします。

アプリケーションがハングする場所は、Struts 2 規約プラグインでのクラスパス スキャン中です。

「kill -QUIT」を使用して Web サーバーを強制終了すると、コードは Unix ファイルシステムでスタックしているように見えます。

"main" prio=10 tid=0x09add800 nid=0xb33 runnable [0xb7361000]
   java.lang.Thread.State: RUNNABLE
        at java.io.UnixFileSystem.getBooleanAttributes0(Native Method)
        at java.io.UnixFileSystem.getBooleanAttributes(UnixFileSystem.java:228)
        at java.io.File.isDirectory(File.java:754)

いくつかの調査を行ったところ、NFS、Java、およびファイル システム アクセスにパフォーマンスの問題があるようです。

私が抱えている問題は、サーバーで NFS を実行していないことと、私が知る限り、同じユーザーが同じ方法でアプリを実行していることです。

service コマンドの動作を模倣する (スクリプトの開始前に「env -i」を実行する) 場合でも、スクリプトを直接実行してもハングしません。

この問題を解決するためのアドバイスや指針、またはそれを回避する方法を探しています。

更新 (2012 年 4 月 8 日)

Sun(Oracle) JDK 1.6.0_31 を使用しています

/usr/java/latest/bin/java -version  
java version "1.6.0_31"  
Java(TM) SE Runtime Environment (build 1.6.0_31-b04)  
Java HotSpot(TM) Server VM (build 20.6-b01, mixed mode)
4

1 に答える 1

0

それで、私は問題を理解しました。スレッドがファイルシステム操作でスタックしているときに見た問題は、Javaが無期限に続く再帰的なシンボリックリンクが原因のようです。シンボリックリンクをたどってUnixシステムのルートからスキャンすると、同じ問題が発生するはずです(CPU使用率が100%で、ファイルスキャンがハングします)。

最終的な問題は、サービススクリプトがルートから実行され、スクリプトの呼び出しが現在の作業ディレクトリから直接開始されることでした。起動スクリプトを変更して、実行前にアプリでアセンブルされたスクリプトのルートを移動しましたが、すべて問題ありません。

于 2012-04-09T18:43:20.170 に答える