TCmallocを使用したRubyのメモリ割り当てのプロファイリング
Rubyではメモリ割り当てはどのように機能しますか?
Rubyはページと呼ばれるチャンクでメモリを取得し、新しいオブジェクトはここに保存されます。
次に…
これらのページがいっぱいになると、より多くのメモリが必要になります。
Rubyは、malloc
を使用してオペレーティングシステムからより多くのメモリを要求します 機能。
このmalloc
関数はオペレーティングシステム自体の一部ですが、使用できる代替の実装があります。
それらの実装の1つは、Googleのtcmallocです。
TCmallocはGoogleパフォーマンスツールスイートの一部です。
これらのツールを使用して、Rubyがメモリを割り当てる方法を正確に調べることができます。
そして、LD_PRELOAD
に感謝します 環境変数(Linuxの場合)システムのmalloc
を置き換えることができます tcmallocで機能します。
このように :
LD_PRELOAD ="/ usr / lib / libtcmalloc.so" ruby -e "puts 123"
ただし、これはライブラリをロードするだけで、データ収集はまだ有効になりません。
それがどのように行われるか見てみましょう。
プロファイラーの有効化
追加の環境変数(HEAPPROFILE
を使用してtcmallocのプロファイラーを有効にできます 。
LD_PRELOAD ="/ usr / lib / libtcmalloc.so" HEAPPROFILE =/ tmp / profile ruby -e "puts 123"
これにより、次の出力が生成されます。
heap123Dumpingヒーププロファイルの/tmp/profile.0001.heapへの追跡を開始します(終了、2 MB使用中)
ここに、プロファイラーが有効になっていることの確認が表示されます。
次に表示されます :
- プログラムの出力
- ファイル名(
profile.0001.heap
) - プログラムで使用されているメモリの量(
2 MB
)
このファイルを読むには、tcmallocに含まれている別のツールが必要です。
pprof --text `which ruby` /tmp/profile.0001.heap |頭-10
これにより、次の出力が生成されます。
合計:2.4 MB 1.1 44.7%44.7%1.1 44.7%0x00005570fa4df074 0.7 27.8%72.5%0.7 27.8%0x00005570fa4e0c09 0.4 15.3%87.8%0.4 15.3%0x00005570fa4db460 0.1 5.9%93.7%0.1 5.9%0x00005570fa4df19f 0.1 3.2%96.9%0.1 3.2 %0x00005570fa6349a0 0.0 1.4%98.3%0.0 1.4%0x00005570fa589924 0.0 0.3%98.6%0.0 0.3%0x00005570fa59c4f2 0.0 0.3%98.8%0.0 0.3%0x00005570fa4db48a 0.0 0.2%99.0%0.0 0.2%0x00005570fa4dbaa5 0.0 0.2%99.1%0.0 0.2%_>>ええと、それは単なるメモリアドレスの集まりです!関数名を表示できるようにするには、デバッグシンボルを備えたバージョンのRubyが必要です。
次に、この出力が表示されます :
ローカルファイルrubyの使用。ローカルファイルの使用/tmp/profile.0001.heap.Total:2.9 MB 1.0 36.2%36.2%1.0 36.2%objspace_xmalloc0 0.7 26.1%62.4%0.7 26.1%aligned_malloc 0.5 18.8%81.1%0.5 18.8% objspace_xcalloc 0.3 9.9%91.0%0.3 9.9%stack_chunk_alloc 0.1 3.7%94.7%0.1 3.7%objspace_xrealloc 0.1 2.7%97.4%0.1 2.7%Init_Method 0.0 1.3%98.7%0.0 1.7%onig_new_with_source 0.0 0.4%99.2%0.8 26.6%heap_page_allocate 0.0 0.2%99.4 %0.0 0.2%add_bitsetここに表示されるのは、MRIの機能によって割り当てられたメモリの量です。
aligned_malloc
を知っているのは興味深いことです Rubyオブジェクトに新しいページを割り当てるために使用される関数stack_chunk_alloc
マーキングフェーズ中にGC自体によって使用され、objspace_xmalloc0
/objspace_xcalloc
RVALUE
に収まらない文字列、配列、その他のデータにスペースを割り当てます 構造体。今:
TCmallocはRubyオブジェクトについて何も知りません。それが行うのは、malloc、calloc、およびreallocへの呼び出しを追跡して、要求されているメモリの量を確認することだけです。
Rubyレベルでヒープダンプを取得する場合は、
ObjectSpace.dump_all
を使用できます。 。これにより、アプリケーション内のすべてのライブオブジェクトとそのメモリサイズを含むJSONファイルが得られます。しかし、
tcmalloc
は、メモリを要求することになるすべてのC関数を視覚化したものであることを示すことができます。pprof --web `which ruby` /tmp/profile.0001.heapこれにより、次のようなSVGファイルでChromeまたはFirefoxが開きます。
TCmallocは、この優れたプロファイリング機能を提供するだけでなく、それを使用して、アプリケーションのパフォーマンスを4〜9%向上させることもできます。
jemalloc
を試すこともできます 、これは別のmalloc
プロファイラーも含む実装。概要
gperftools(Google Performance Tools)を使用して、Rubyインタープリターのメモリ使用量を視覚化および分析する方法を学習しました。
読んでくれてありがとう! 🙂
-
TCmallocを使用したRubyのメモリ割り当てのプロファイリング
Rubyではメモリ割り当てはどのように機能しますか? Rubyはページと呼ばれるチャンクでメモリを取得し、新しいオブジェクトはここに保存されます。 次に… これらのページがいっぱいになると、より多くのメモリが必要になります。 Rubyは、mallocを使用してオペレーティングシステムからより多くのメモリを要求します 機能。 このmalloc 関数はオペレーティングシステム自体の一部ですが、使用できる代替の実装があります。 それらの実装の1つは、Googleのtcmallocです。 TCmallocはGoogleパフォーマンスツールスイートの一部です。 これらのツールを使用し
-
Rubyでパーサーを構築する方法
構文解析は、一連の文字列を理解し、それらを理解できるものに変換する技術です。正規表現を使用することもできますが、必ずしもその仕事に適しているとは限りません。 たとえば、HTMLを正規表現で解析することはおそらく良い考えではないことは一般的な知識です。 Rubyには、この作業を実行できるnokogiriがありますが、独自のパーサーを作成することで多くのことを学ぶことができます。始めましょう! Rubyでの解析 パーサーの中核はStringScannerです クラス。 このクラスは、文字列のコピーと位置ポインタを保持します。ポインタを使用すると、特定のトークンを検索するために文字列をトラバ