MIRACLE
メールサービス申込 ユーザー登録 パートナー情報
お問い合わせ FAQ サイトマップ
MIRACLE LINUXの特長 製品紹介 サービス案内 購入 サポート 技術フォーラム

プロフィール

吉岡 弘隆 - よしおか ひろたか

日本OSS推進フォーラム ステアリングコミッティ委員
OSDL Board of Directorsを歴任
カーネル読書会主宰

2000年6月、ミラクル・リナックスの創業に参加。
95年~98年、米国OracleにてOracle RDBMSの開発をおこなっていた。
98年にNetscapeのソースコード公開(Mozilla)に衝撃をうけ、オープンソースの世界に飛びこみ、ついには会社も立ち上げてしまう。
2008年6月取締役CTOを退任し一プログラマとなった。

ミラクル関連リンク

なかのひと

サイト検索

2010年8月

1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        

« 第67回カーネル読書会、ビデオ公開 | メイン | コードを読むな、理解しろ »

Rubyのプロファイリング

カーネル読書会でmallocの話をしていただいたのだが、そのときの質疑でRubyの実装の話がでた。そこで思い立ちRubyをoprofileでプロファイルして見た。(matzさんにトラックバックを張っておく)

# cd /usr/src/ruby-1.8.4/test
# opcontrol --start; ruby runner.rb; opcontrol --stop

適当なRubyアプリケーションをしらなかったので、テストプログラムを実行してベンチマークとした。実行したマシンは1700MhzのPentium M、メモリ1GBのノートPC。

# opreport -l
CPU: CPU with timer interrupt, speed 0 MHz (estimated)
Profiling through timer interrupt
samples  %        app name                 symbol name
21380    29.7896  vmlinux                  acpi_processor_idle
17321    24.1340  libcrypto.so.0.9.7a      (no symbols)
3137      4.3709  ruby                     os_each_obj
1828      2.5470  ruby                     rb_eval
1407      1.9604  ruby                     ruby_yyparse
1198      1.6692  ruby                     st_lookup
1058      1.4742  ruby                     gc_mark_children
1009      1.4059  ruby                     rb_call0
1008      1.4045  ruby                     rb_thread_save_context
988       1.3766  libc-2.3.4.so            _int_malloc

ノートPCなのでacpi_processor_idelが出ているのと思うのだけど、libcrypto.soが出てくるのはなんでだろう?
まあ、気にしないことにする。CPUを回しきれていないのはチューニングの余地が大きいということだと思う。

# opreport -l|grep libc
17321    24.1340  libcrypto.so.0.9.7a      (no symbols)
988       1.3766  libc-2.3.4.so            _int_malloc
809       1.1272  libc-2.3.4.so            malloc_consolidate
436       0.6075  libc-2.3.4.so            free
300       0.4180  libc-2.3.4.so            _int_free
252       0.3511  libc-2.3.4.so            memcpy
233       0.3246  libc-2.3.4.so            malloc
127       0.1770  libc-2.3.4.so            strcmp
109       0.1519  libc-2.3.4.so            __ctype_b_loc
86        0.1198  libc-2.3.4.so            msort_with_tmp

libcを見てみると、malloc関係にコストがかかっていることがよくわかる。mallocかfreeかというとfree系の方がコストがコストがかかっている。malloc_consolidateというのはfreeするときにメモリをくっつけるという操作なので、free系である。

Rubyの大きめなアプリケーションがあるとそれをプロファイリングして見ると面白いと思う。何かいいベンチマークはないだろうか?

それとわたしのノートPCではキャッシュミスを測定できないので、Xeonのマシンでキャッシュミスを測定すると面白いと思った。GCの時ぼろぼろキャッシュミスが発生するということだが、それを巧みに減らすというのが課題になる。

トラックバック

このページのトラックバックURL:
http://www.typepad.jp/t/trackback/4447/6562639

このページへのトラックバック一覧 Rubyのプロファイリング:

» コードを読むな、理解しろ トラックバック ユメのチカラ
コードを読まないで理解するというと何やら心眼で読めとかテレパシーを使えとか、そー [続きを読む]

» BINARY HACKS トラックバック ユメのチカラ
高林さんに献本をいただく。本日到着しました。ありがとうございました。 昨年12 [続きを読む]

» RejectKaigi2007 トラックバック ユメのチカラ
RubyKaigi 2007がおわって撤収作業中に、RubyKaigiでreje [続きを読む]

» チューニング トラックバック ユメのチカラ
パフォーマンスチューニングというのも非常に重要な問題だ。黒魔術のようなかんじもし [続きを読む]

コメント

ささださんからの質疑にもありましたが、malloc_consolidateは遅延併合戦略によって小さいサイズはmalloc時にまで遅延されまする。
スクリプト言語だと、こっちにはまる事のほうが多いんじゃないでしょうか。
あと、わたし、Rubyは全然詳しくないのですが os_each_objがGCでのオブジェクト一周ちゃうんかいね。名前的に・・・
しかし、libcryptが大きすぎるのでベンチの選択に改良の余地アリとオモタ(^-^/

kosakiさん、コメントありがとうございます。libcryptが大きすぎるのはわたしの環境のせいかもしれないのですが、よくわかりません。なんか変なデーモンが動いているのかなあ?とほほ。

http://d.hatena.ne.jp/hyoshiok/20061002#p2
でRubyのキャッシュミスの計測結果を出しました。
ソースを見たら、これはprefetchでレイテンシーを隠蔽できるパターンなのでパッチを作ると面白いかも。(忙しい時に限って遊びたくなる)

コメントを投稿

会社情報 採用情報 個人情報保護方針 商標等取り扱い事項 English
Copyright(c)2000-2006 MIRACLE LINUX CORPORATION. All Rights Reserved.