Home

moratorium

Java ProcessBuilderでデッドロック

id:nobu-qが踏んだバグ。Twitterにて、kosaki先生に凄く色々アドバイスを頂いた。革命の日々の1000エントリ目のネタゲット!

やりたいこととしては、C++のマルチスレッドプログラムから、HDFS(Hadoop Distributed File system)にアクセスしたい。そのために、libhdfsを使用している。

HadoopはJavaで記述されているために、libhdfsは内部でJavaのコードを呼び出している。このJavaのクライアントライブラリが、ユーザー名などを取得するために”whoami”コマンドを呼び出しており、fork(2)を行う。その際にデッドロックが起きていた。

コードの階層は次のようになる。mallocの実装には、tcmalloc 1.2を使用していた。

C++ Server
  C++ libhdfs
    Java HDFSClient
      Java ProcessBuilder
        JavaVM
          JavaVM C Layer
            tcmalloc

デッドロックが起こっている箇所は、tcmallocの内部だった。よくよく調べてみると、Java VMがfork(2)とexec(2)の間に、親プロセスが開いている全てのファイルディスクリプタを閉じるために/proc/self/fdをopendir(3)している。ここでmallocが呼ばれている。

- UNIXProcess_md.c
- bug 6336770

最初は、tmallocがpthread_atforkでmutexをきちんと処理していないので、こちらが悪いと思っていた。が、kosaki先生によるとそもそもfork(2)
とexec(2)の間ではasync-signal safeな関数しか呼んではいけないらしい(これはPOSIXの仕様???)。mallocの実装は関係が無い。

解決策としては、まずアプリを動かすためだけなら、Hadoop側を改変してProcessBuilderを使わないようにすれば良い。

JVMの方を直すには、一番理想的にはFD_CLOSEEXECを使う方法だけど、これは変更範囲が大きそうだし漏れが有りそう。

なので、async-signal safeな関数だけを用いて、現在開いている全てのファイルディスクリプタ番号を取得する方法が必要となる。で、どうするかを今調べているところ。SolarisとかBSD系でも動かないといけないので、どうしたもんかなあ。

MPICH2内のコードを変える時のTIPS

MPICH2のコードを1箇所いじると、やたらビルドに時間がかかって鬱陶しい…と言ってたら、色々切ると良いというのを教えてもらった。


$ ./configure --enable-romio --disable-mpe --disable-f77 --disable-f90 --disable-cxx --enable-dependencies

特にMPEと各種言語サポートを切ると、ビルド時間が飛躍的に変わります。誰の役にも立たないTIPSエントリ。

修論中間発表終了

修士論文のための中間発表が終了しました。といっても10分だったので、詳細には全く踏み込めませんでしたが。プレゼンはSlideShareにupしました。

同期の発表終わった人、お疲れ様でした~明日の人は頑張って~

あと、土日は天下一カウボーイ大会2009で発表してきました。2年ぶり。元MS古川さんにコメント頂けたり、個人的にもちょっとお話出来たりして、パワーを頂きました。

またGaucheのshiroさんにもついにリアルでお会いする事が出来ました!ちょうどワイキキに行ってきたばかりだったので、あそこに住んでいるとか羨ましすぎ…。

会自体は、普段参加しているイベントとは少し違う感じで、非常に楽しかったです。alty partyは飯うま過ぎ。ゲストの人は良く知らなかったので、そのスキに飯食ってました。すいません。主催者のUEI、Ascii Media Worksの皆さま、altyさん、お疲れ様でした!

Scalaでヒープサイズを増加させる方法

最近Scala本を買って、勉強しています。

で、少しプログラムを書いていたのですが、ちょっと大規模なデータを扱うとOutOfMemoryError例外で落ちてしまいました。

java.lang.OutOfMemoryError: Java heap space

これを解決する方法をメモします。scalaコマンドは実はjavaを実行するシェルスクリプトみたいです。

% file `which scala`
/opt/scala-2.7.5.final/bin//scala: POSIX shell script text executable

で、このスクリプトを見ると、以下のような記述が見つかります。

[ -n "$JAVA_OPTS" ] || JAVA_OPTS="-Xmx256M -Xms32M"

なので、以下のように実行すればヒープサイズを増やす事ができます。

$ export JAVA_OPTS="-Xmx4G -Xms1G"
$ scala -cp . Application

少し調べても出てこなかったので、メモ的エントリでした。

Consensus Protocol

Consensus Protocolについて分かりやすいブログ記事が有ったので、メモ。Clouderaの方みたいです。

ソースはhighscalability.comの以下の記事。”Popular with financial institutions”とか有って結構面白い。

Home

お薦め本
広告
Archives
Categories

Return to page top