moratorium
Java ProcessBuilderでデッドロック
- 2009-09-15 (Tue)
- Uncategorized

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系でも動かないといけないので、どうしたもんかなあ。
- Comments: 0
- Trackbacks: 0
MPICH2内のコードを変える時のTIPS
- 2009-09-02 (Wed)
- 研究


MPICH2のコードを1箇所いじると、やたらビルドに時間がかかって鬱陶しい…と言ってたら、色々切ると良いというのを教えてもらった。
$ ./configure --enable-romio --disable-mpe --disable-f77 --disable-f90 --disable-cxx --enable-dependencies
特にMPEと各種言語サポートを切ると、ビルド時間が飛躍的に変わります。誰の役にも立たないTIPSエントリ。
- Comments: 0
- Trackbacks: 0
修論中間発表終了
- 2009-09-01 (Tue)
- 研究

修士論文のための中間発表が終了しました。といっても10分だったので、詳細には全く踏み込めませんでしたが。プレゼンはSlideShareにupしました。
同期の発表終わった人、お疲れ様でした~明日の人は頑張って~
あと、土日は天下一カウボーイ大会2009で発表してきました。2年ぶり。元MS古川さんにコメント頂けたり、個人的にもちょっとお話出来たりして、パワーを頂きました。
またGaucheのshiroさんにもついにリアルでお会いする事が出来ました!ちょうどワイキキに行ってきたばかりだったので、あそこに住んでいるとか羨ましすぎ…。
会自体は、普段参加しているイベントとは少し違う感じで、非常に楽しかったです。alty partyは飯うま過ぎ。ゲストの人は良く知らなかったので、そのスキに飯食ってました。すいません。主催者のUEI、Ascii Media Worksの皆さま、altyさん、お疲れ様でした!
- Comments: 1
- Trackbacks: 0
Scalaでヒープサイズを増加させる方法
- 2009-08-28 (Fri)
- 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
少し調べても出てこなかったので、メモ的エントリでした。
- Comments: 0
- Trackbacks: 0
Consensus Protocol
- 2009-08-25 (Tue)
- 研究

Consensus Protocolについて分かりやすいブログ記事が有ったので、メモ。Clouderaの方みたいです。
- A Brief Tour of FLP Impossibility
- A brief history of Consensus, 2PC and Transaction Commit
- Consensus Protocols: Two-Phase Commit
- Consensus Protocols: Three-phase Commit
- Consensus with lossy links: Establishing a TCP connection
- Consensus Protocols: Paxos
- Consensus Protocols: A Paxos Implementation
ソースはhighscalability.comの以下の記事。”Popular with financial institutions”とか有って結構面白い。
- Comments: 0
- Trackbacks: 0
-
- May 2010
- February 2010
- December 2009
- November 2009
- October 2009
- September 2009
- August 2009
- July 2009
- June 2009
- May 2009
- April 2009
- March 2009
- February 2009
- January 2009
- December 2008
- November 2008
- October 2008
- September 2008
- August 2008
- July 2008
- June 2008
- May 2008
- April 2008
- March 2008
- February 2008
- January 2008
- December 2007
- November 2007
- October 2007
- September 2007
- August 2007
- July 2007
- June 2007
- May 2007
- April 2007
- March 2007
- February 2007
- January 2007
- December 2006
- November 2006
- October 2006
- September 2006
- August 2006
- July 2006

