Skip to content
Newer
Older
100644 609 lines (494 sloc) 41.3 KB
96a515c @mkotha 6.6.1
authored
1 <?xml version="1.0" encoding="UTF-8"?>
2 <sect1 id="runtime-control">
3 <title>コンパイル済みプログラムを実行する</title>
4
5 <indexterm><primary>runtime control of Haskell programs</primary></indexterm>
6 <indexterm><primary>running, compiled program</primary></indexterm>
7 <indexterm><primary>RTS options</primary></indexterm>
8
9 <para>実行可能なプログラムを作るとき、GHCシステムはコードをコンパイルし、それを自明でないランタイムシステム(RTS)とリンクする。これは、記憶領域の管理や、プロファイルの取得などを行う。</para>
10
11 <para>特別なコマンド行引数をプログラムに渡すことで、RTSの振る舞いをいくらか制御することができる。</para>
12
13 <para>Haskellプログラムの実行が開始されるとき、RTSはコマンド行引数から<option>+RTS</option><indexterm><primary><option>+RTS</option></primary></indexterm>と<option>-RTS</option><indexterm><primary><option>-RTS</option></primary></indexterm>で囲まれた部分を自分用に抽出する。以下のような例を考える。</para>
14
15 <screen>
16 % ./a.out -f +RTS -p -S -RTS -h foo bar
17 </screen>
18
19 <para>RTSは<option>-p</option> <option>-S</option>を横取りし、プログラムが<function>System.getArgs</function>を読んだときには残りの引数である<literal>-f -h foo bar</literal>が渡される。</para>
20
21 <para>次の例のように、ランタイムシステムへのオプションがコマンド行の最後まで続くときは、<option>-RTS</option>オプションは必要ない。</para>
22
23 <screen>
24 % hls -ltr /usr/etc +RTS -A5m
25 </screen>
26
27 <para>残りのオプションを問答無用で(RTSでなく)プログラムに渡したいなら、<option>&ndash;&ndash;RTS</option><indexterm><primary><option>--RTS</option></primary></indexterm>を使うことができる。</para>
28
29 <para>いつもと同様、<replaceable>size</replaceable>を取るRTSオプションについては、以下が適用される。<replaceable>size</replaceable>の最後の文字がKまたはkなら、数値は1000倍される。Mまたはmなら、1,000,000倍される。GまたはG<!-- 訳注: たぶん誤り -->なら、1,000,000,000倍される。(カウンタのオーバーフローは<emphasis>あなたの</emphasis>責任である)</para>
30
31 <para><literal>+RTS -f</literal><indexterm><primary><option>-f</option></primary><secondary>RTS option</secondary></indexterm>オプションを与えれば、実際に利用可能なRTSオプションを表示することができる。(これはどのようにコンパイルされたかによって異なる)</para>
32
33 <para>注意: GHCはそれ自身GHCでコンパイルされているので、通常の<literal>+RTS ... -RTS</literal>の組み合わせを使ってRTSオプションを変更することができる。例えば、コンパイル時の最大ヒープサイズを128Mに増やすには、<literal>+RTS -M128m -RTS</literal>をコマンドラインに加えれば良い。</para>
34
35 <sect2 id="rts-optinos-environment">
36 <title>大域的なRTSオプションを設定する</title>
37
38 <indexterm><primary>RTS options</primary><secondary>from the environment</secondary></indexterm>
39 <indexterm><primary>environment variable</primary><secondary>for
40 setting RTS options</secondary></indexterm>
41
42 <para>RTSオプションは環境変数<envar>GHCRTS</envar><indexterm><primary><envar>GHCRTS</envar></primary></indexterm>からも採られる。例えば、GHCでコンパイルされた全てのプログラムについて最大ヒープサイズを128Mにするなら、次のようにすれば良い。(<literal>sh</literal>系のシェルを使っていると仮定する)</para>
43
44 <screen>
45 GHCRTS='-M128m'
46 export GHCRTS
47 </screen>
48
49 <para><envar>GHCRTS</envar>環境変数から採られたRTSオプションはコマンド行からオプションを与えることで上書きできる。</para>
50
51 </sect2>
52
53 <sect2 id="rts-options-misc">
54 <title>いろいろなRTSオプション</title>
55
56 <variablelist>
57 <varlistentry>
a2be81e @mkotha runtime_control.xml
authored
58 <term><option>-V<replaceable>secs</replaceable></option>
96a515c @mkotha 6.6.1
authored
59 <indexterm><primary><option>-V</option></primary><secondary>RTS
a2be81e @mkotha runtime_control.xml
authored
60 option</secondary></indexterm></term>
96a515c @mkotha 6.6.1
authored
61 <listitem>
a2be81e @mkotha runtime_control.xml
authored
62 <para>RTSの時計が進行する時間間隔を設定する。ランタイムは単一のタイマシグナルを使って時計を進行させる。コンテクストスイッチのタイマ(<xref linkend="using-concurrent"/>)およびヒーププロファイル時のタイマ(<xref linkend="rts-options-heap-prof"/>)を制御するのにはこれが使われる。また、時間プロファイルをとるときは、プロファイルの標本を記録するのにRTSのタイマシグナルを直接使うことになる。</para>
96a515c @mkotha 6.6.1
authored
63
64 <para>通常、<option>-V</option>オプションを直接指定する必要はない。<option>-C</option>や<option>-i</option>オプションで短い間隔が指定されたときは、自動的にRTSタイマの分解能も調整されるからである。しかし、時間プロファイルの分解能を増したいときには、<option>-V</option>を設定することが必要になる。</para>
a2be81e @mkotha runtime_control.xml
authored
65
66 <para>値0を使うと、RTSの時計は完全に無効にされ、それに依存したタイマも無効になる。コンテクストスイッチのタイマとプロファイルタイマである。それでもコンテクストスイッチは発生するが、決定的に、かつ通常よりずっと高い頻度で発生するようになる。インターバルタイマを無効にすると、実行時の非決定性の源が一つ除かれるわけであり、デバッグに便利である。</para>
96a515c @mkotha 6.6.1
authored
67 </listitem>
68 </varlistentry>
69
70 <varlistentry>
71 <term><option>--install-signal-handlers=<replaceable>yes|no</replaceable></option>
72 <indexterm><primary><option>--install-signal-handlers</option></primary><secondary>RTS
73 option</secondary></indexterm></term>
74 <listitem>
a2be81e @mkotha runtime_control.xml
authored
75 <para>yes(デフォルト)なら、RTSはctrl-Cの類を捕捉するためのシグナルハンドラを設置する。このオプションは、HaskellコードをDLLとして使っていて、自分でシグナルハンドラを設定したいときに特に有用である。</para>
96a515c @mkotha 6.6.1
authored
76 </listitem>
77 </varlistentry>
78 </variablelist>
79 </sect2>
80
81 <sect2 id="rts-options-gc">
82 <title>ガベッジコレクタを制御するためのRTSオプション</title>
83
84 <indexterm><primary>garbage collector</primary><secondary>options</secondary></indexterm>
85 <indexterm><primary>RTS options</primary><secondary>garbage collection</secondary></indexterm>
86
87 <para>ガベッジコレクタの挙動を精密に制御するために、いくつかのオプションが存在する。通常時には、これらはどれも使う必要がない(といいのだが)。それでも、最高の性能を得たいときのために、いくつかの箇所を調整することができるようになっている。</para>
88
89 <variablelist>
90
91 <varlistentry>
92 <term>
93 <option>-A</option><replaceable>size</replaceable>
94 <indexterm><primary><option>-A</option></primary><secondary>RTS option</secondary></indexterm>
95 <indexterm><primary>allocation area, size</primary></indexterm>
96 </term>
97 <listitem>
98 <para>&lsqb;デフォルト: 256k&rsqb;ガベッジコレクタが使う確保領域の大きさを設定する。確保領域(実際には世代0・段階0)は固定されており、大きさが変わることはない。(<option>-H</option>を使った場合はこの限りでない。下記参照)</para>
99
100 <para>確保領域の大きさを増すことは、性能の向上につながるかもしれないし、そうでないかもしれない。(より大きい確保領域を使うと、キャッシュの振舞は悪化するが、ガベッジコレクションの回数は減り、昇格(promotion)も少なくなる)</para>
101
102 <para>世代数が一しかないとき(<option>-G1</option>)は、<option>-A</option>オプションは最小の確保領域を指定する。これは、実際の確保領域の大きさがヒープ中のデータの量によって変動するからである。(下記の<option>-F</option>を見よ)</para>
103 </listitem>
104 </varlistentry>
105
106 <varlistentry>
107 <term>
108 <option>-c</option>
109 <indexterm><primary><option>-c</option></primary><secondary>RTS option</secondary></indexterm>
110 <indexterm><primary>garbage collection</primary><secondary>compacting</secondary></indexterm>
111 <indexterm><primary>compacting garbage collection</primary></indexterm>
112 </term>
113 <listitem>
114 <para>もっとも古い世代を回収するときにコンパクト化アルゴリズムを使う。デフォルトでは最古世代はコピーアルゴリズムで回収されるが、このオプションが使われると、その場でコンパクト化されるようになる。コンパクト化アルゴリズムはコピーアルゴリズムより遅いが、相当量のメモリを節約できることがある。</para>
115
116 <para>ヒープの大きさ(これは<option>-H</option>オプションで変えられる)が一定のとき、コンパクト化を使うことでかえってGCのコストが削減できるということがあり得る(GCの回数が減らせるかもしれないので)。ヒープの大きさに対する生存データの比が高いとき(>30%、例えば)には特にその傾向が強い。</para>
117
118 <para>注意: 現在、コンパクト化は、<option>-G1</option>で単一世代が指定されているときには動作しない。</para>
119 </listitem>
120 </varlistentry>
121
122 <varlistentry>
123 <term><option>-c</option><replaceable>n</replaceable></term>
124
125 <listitem>
126 <para>&lsqb;デフォルト: 30&rsqb; 生存データがヒープの大きさの上限(<option>-M</option>オプションを見よ)の<replaceable>n</replaceable>%を超えたときに自動的にコンパクト化を有効にする。デフォルトではヒープの大きさに上限はないので、<option>-M</option><replaceable>size</replaceable>でヒープの大きさの上限が指定されない限り、このオプションには効果がない。</para>
127 </listitem>
128 </varlistentry>
129
130 <varlistentry>
131 <term>
132 <option>-F</option><replaceable>factor</replaceable>
133 <indexterm><primary><option>-F</option></primary><secondary>RTS option</secondary></indexterm>
134 <indexterm><primary>heap size, factor</primary></indexterm>
135 </term>
136 <listitem>
137
138 <para>&lsqb;デフォルト: 2&rsqb; このオプションは、古い世代のために予約されるメモリの量(two-space GCのときは確保領域の大きさ)を、生存データの量との比で指定する。例えば、最後に最も古い世代が回収されたときに生存データが2Mあったとすると、デフォルトでは、4Mにまでなるのを待ってから再び回収する。</para>
139
140 <para>これについてはデフォルトがうまく働いているようである。潤沢なメモリがあるなら、通常、<option>-F</option><replaceable>factor</replaceable>を増やすよりも<option>-H</option><replaceable>size</replaceable>を使った方が良い。</para>
141
142 <para><option>-F</option>の値は、ヒープの最大の大きさ(<option>-M</option><replaceable>size</replaceable>で設定する)に近づいたときには、ガベッジコレクタによって自動的に減らされる。</para>
143 </listitem>
144 </varlistentry>
145
146 <varlistentry>
147 <term>
148 <option>-G</option><replaceable>generations</replaceable>
149 <indexterm><primary><option>-G</option></primary><secondary>RTS option</secondary></indexterm>
150 <indexterm><primary>generations, number of</primary></indexterm>
151 </term>
152 <listitem>
153 <para>&lsqb;デフォルト: 2&rsqb; ガベッジコレクタが使う世代の数を設定する。デフォルトの2は良い選択のようだが、ガベッジコレクタは任意の数の世代をサポートしている。プログラムが<emphasis>長い</emphasis>時間に渡って実行されるのでない限り、4程度より大きな値はおそらく良くない。最古の世代が一回も回収されないということになるからである。</para>
154
155 <para><option>+RTS -G1</option>で一世代を指定すると、当然、単純な2-spaceコレクタになる。2-spaceコレクタでは、<option>-A</option>オプション(上記参照)が指定するのは確保領域の<emphasis>最小の</emphasis>大きさである。これは、ヒープ中の生存データの量が増えるに従って確保領域も拡大されるからである。複数世代のコレクタでは確保領域の大きさは固定である。(<option>-H</option>オプションを使う場合はこの限りでない。下を見よ)</para>
156 </listitem>
157 </varlistentry>
158
159 <varlistentry>
5913a40 @mkotha update runtime_control.xml
authored
160 <term>
161 <option>-g</option><replaceable>threads</replaceable>
162 <indexterm><primary><option>-g</option></primary><secondary>RTS option</secondary></indexterm>
163 </term>
164 <listitem>
165 <para>&lsqb;デフォルト: 1&rsqb; &lsqb;GHC 6.10にて新出&rsqb; ガベッジコレクションに用いるスレッドの数を設定する。このオプションはプログラムが<option>-threaded</option>オプション付きでリンクされていた場合にのみ受け付けられる。<xref linkend="options-linker"/>を見よ。</para>
166
167 <para>ガベッジコレクタは、複数のOSスレッドを与えられた場合、並列に仕事を行うことができる。これは、三コア以上の場合、通常、性能の向上につながることが実験によって示されている。二コアでは負荷によって有益なこともそうでないこともある。大きいヒープの方が並列GCとよく合うので、<option>-H</option>の値を高く(最大内容量の三倍以上)するとよい。並列GCによって恩恵を受けているのかどうか確認するには、<option>+RTS -s</option>で時間統計情報を見ればよい。並列GCが直列GCよりも著しく(経過時間で計って)<emphasis>遅い</emphasis>場合は、バグとして報告していただきたい。</para>
168
169 <para><option>-N</option>オプションが使われた場合この値は自動的に設定されるので、<option>-g</option>を使う唯一の理由は、実行に使うスレッドの数とGCに使うスレッドの数を違う値にしたいときだろう。たとえば、厳密に単一スレッドのプログラムがあり、それでも並列GCの恩恵を受けたいなら、<option>-N</option>でなく<option>-g</option>を使うことに意味があるだろう。</para>
170 </listitem>
171 </varlistentry>
172
173 <varlistentry>
96a515c @mkotha 6.6.1
authored
174 <term>
175 <option>-H</option><replaceable>size</replaceable>
176 <indexterm><primary><option>-H</option></primary><secondary>RTS option</secondary></indexterm>
177 <indexterm><primary>heap size, suggested</primary></indexterm>
178 </term>
179 <listitem>
180 <para>&lsqb;デフォルト: 0&rsqb; このオプションはガベッジコレクタに「推奨されるヒープの大きさ」を提示する。プログラムのメモリ使用量が増加し、性能を保つためにヒープの大きさを増す必要が発生するまでは、ガベッジコレクタは指定された大きさの程度のメモリを使う。</para>
181
182 <para>デフォルトでは、ヒープは小さい状態から開始し、必要に応じて伸長・収縮する。これは性能に悪影響を及ぼすので、メモリが潤沢にあるなら、<option>-H</option><replaceable>size</replaceable>に大きな値を指定すると良い。GCの性能を向上させるには、通常、<option>-A</option><replaceable>size</replaceable>よりも<option>-H</option><replaceable>size</replaceable>を使った方が良い。</para>
183 </listitem>
184 </varlistentry>
185
186 <varlistentry>
187 <term>
188 <option>-I</option><replaceable>seconds</replaceable>
189 <indexterm><primary><option>-I</option></primary>
190 <secondary>RTS option</secondary>
191 </indexterm>
192 <indexterm><primary>idle GC</primary>
193 </indexterm>
194 </term>
195 <listitem>
196 <para>(デフォルト: 0.3) スレッド化された、またはSMP版のRTS(<option>-threaded</option>を見よ。<xref linkend="options-linker"/>)においては、ランタイムが一定期間待機状態である(Haskellの計算が実行されていない)とき、自動的にメジャーGCが実行される。GCが実行されるまでの時間を指定するのが<option>-I</option><replaceable>seconds</replaceable>オプションである。<option>-I0</option>を指定すると待機状態でのGCが無効になる。</para>
197
198 <para>対話的アプリケーションでは、待機時GCが多くの場合有効である。これは、Haskellの計算が起こっていない待機状態の間に、終了子を走らせたりデッドロックしたスレッドを感知したりできるからである。さらに、アプリケーションが忙しいときにGCが起こる可能性が減るので、反応性が向上するかもしれない。しかし、ヒープ中の生存データの割合があまりに高いと、待機時GCが重大な遅れを引き起こすことがある。また、時間間隔が短すぎると、対話的な反応性に悪影響を及ぼすことになるかもしれない。</para>
199
200 <para>これは実験的な機能である。問題が起きたり、改善案があるなら、知らせてほしい。</para>
201 </listitem>
202 </varlistentry>
203
204 <varlistentry>
205 <term>
206 <option>-k</option><replaceable>size</replaceable>
207 <indexterm><primary><option>-k</option></primary><secondary>RTS option</secondary></indexterm>
208 <indexterm><primary>stack, minimum size</primary></indexterm>
209 </term>
210 <listitem>
211 <para>&lsqb;デフォルト: 1k&rsqb; スレッドの初期スタックサイズを設定する。スレッドのスタック(主スレッドのスタックも含めて)はヒープ上にとられ、必要に応じて成長する。デフォルト値はたくさんの小さなスレッドを使う並行アプリケーションに適している。あなたのプログラムがこれに沿わないなら、このオプションを増加させると性能が向上するかもしれない。</para>
212
213 <para>通常、主スレッドはやや大きめのヒープで開始される。これは、プログラムが開始するときに起こる不必要なスタックの伸長を低減するためである。</para>
214 </listitem>
215 </varlistentry>
216
217 <varlistentry>
218 <term>
219 <option>-K</option><replaceable>size</replaceable>
220 <indexterm><primary><option>-K</option></primary><secondary>RTS option</secondary></indexterm>
221 <indexterm><primary>stack, maximum size</primary></indexterm>
222 </term>
223 <listitem>
224 <para>&lsqb;デフォルト: 8M&rsqb; 個々のスレッドの最大スタックサイズを<replaceable>size</replaceable>に設定する。このオプションは、プログラムが無限ループに陥ったときに利用可能なメモリを使い果たすことがないようするためだけに存在している。</para>
225 </listitem>
226 </varlistentry>
227
228 <varlistentry>
229 <term>
230 <option>-m</option><replaceable>n</replaceable>
231 <indexterm><primary><option>-m</option></primary><secondary>RTS option</secondary></indexterm>
232 <indexterm><primary>heap, minimum free</primary></indexterm>
233 </term>
234 <listitem>
235 <para>ヒープのうち確保可能な(訳注: 未使用な)部分の最小%を指定する。デフォルトは3%である。</para>
236 </listitem>
237 </varlistentry>
238
239 <varlistentry>
240 <term>
241 <option>-M</option><replaceable>size</replaceable>
242 <indexterm><primary><option>-M</option></primary><secondary>RTS option</secondary></indexterm>
243 <indexterm><primary>heap size, maximum</primary></indexterm>
244 </term>
245 <listitem>
246 <para>&lsqb;デフォルト: 無制限&rsqb; 最大ヒープサイズを<replaceable>size</replaceable>に設定する。ヒープは通常プログラムのメモリ要求に従って伸長したり収縮したりする。このオプションの唯一の存在理由は、ヒープが際限なく膨張してスワップ空間を使い果たす(結果として、少なくともプログラムが即座にOSに殺されることになる)のを防ぐことである。</para>
247
248 <para>ヒープの最大サイズは他のGCパラメタにも影響する。ヒープ中の生存データが最大ヒープサイズに対して一定の割合を越えると、最古の世代に対して自動的にコンパクト化回収が有効になり、最大ヒープサイズを越えることがないように<option>-F</option>パラメタが減少せしめられる。</para>
249 </listitem>
250 </varlistentry>
251
252 <varlistentry>
5913a40 @mkotha update runtime_control.xml
authored
253 <term>
254 <option>-t</option><optional><replaceable>file</replaceable></optional>
255 <indexterm><primary><option>-t</option></primary><secondary>RTS option</secondary></indexterm>
256 </term>
96a515c @mkotha 6.6.1
authored
257 <term>
5913a40 @mkotha update runtime_control.xml
authored
258 <option>-s</option><optional><replaceable>file</replaceable></optional>
96a515c @mkotha 6.6.1
authored
259 <indexterm><primary><option>-s</option></primary><secondary>RTS option</secondary></indexterm>
260 </term>
261 <term>
5913a40 @mkotha update runtime_control.xml
authored
262 <option>-S</option><optional><replaceable>file</replaceable></optional>
96a515c @mkotha 6.6.1
authored
263 <indexterm><primary><option>-S</option></primary><secondary>RTS option</secondary></indexterm>
264 </term>
265 <listitem>
5913a40 @mkotha update runtime_control.xml
authored
266 <para>これらのオプションはランタイムシステムの統計情報を生成する。プログラムを実行するのに使った時間、ガベッジコレクタで使った時間、確保されたメモリの量、ヒープの最大サイズ、といったものである。この三種類のオプションは、詳細さの度合いが異なる。<option>-t</option>は、GHCの<option>-Rghc-timing</option>オプションと同じ形式で一行だけの出力を生成する。<option>-s</option>はプログラムの最後にもっと詳細なまとめを生成し、<option>-S</option>はさらにガベッジコレクション一回一回について情報を生成する。</para>
267
268 <para>出力内容は<replaceable>file</replaceable>に置かれる。<replaceable>file</replaceable>が省略された場合、出力は<constant>stderr</constant>に送られる。</para>
269
270 <para>
271 <literal>-t</literal>フラグを使った場合、プログラムの終了時、次のようなものを見ることになるだろう。
272 </para>
273
274 <programlisting>
275 &lt;&lt;ghc: 36169392 bytes, 69 GCs, 603392/1065272 avg/max bytes residency (2 samples), 3M in use, 0.00 INIT (0.00 elapsed), 0.02 MUT (0.02 elapsed), 0.07 GC (0.07 elapsed) :ghc&gt;&gt;
276 </programlisting>
277
278 <para>
279 これは以下のことを伝えている。
280 </para>
281
282 <itemizedlist>
283 <listitem>
284 <para>プログラムによって確保されたバイトの総量。これはメモリ使用量の最大値よりも低いことがある。一部は開放されたかもしれないからである。
285 </para>
286 </listitem>
287 <listitem>
288 <para>発生したガベッジコレクションの合計回数。
289 </para>
290 </listitem>
291 <listitem>
292 <para>プログラムによって使われた空間の平均値および最大値。これは大GCのときにしか検査されないから、単なる近似値である。標本(sample)の数によって何回検査されたかが分かる。
293 </para>
294 </listitem>
295 <listitem>
296 <para>RTSがOSから確保したメモリの最大値。
297 </para>
298 </listitem>
299 <listitem>
300 <para>ランタイムシステムの初期化(INIT)、プログラム自体の実行(MUT, the mutator)、ガベッジコレクション(GC)それぞれのCPU時間と経過した実時間。
301 </para>
302 </listitem>
303 </itemizedlist>
304
305 <para><literal>-s</literal>フラグを使った場合、プログラムの終了時に次のようなものを目にすることになるだろう。(細部が厳密にどうなるかは使っているRTSの種類によって異なる。例えば、プロファイルのデータを見られるのはRTSがプロファイル用にコンパイルされている場合だけである)
306 </para>
307
308 <programlisting>
309 36,169,392 bytes allocated in the heap
310 4,057,632 bytes copied during GC
311 1,065,272 bytes maximum residency (2 sample(s))
312 54,312 bytes maximum slop
313 3 MB total memory in use (0 MB lost due to fragmentation)
314
315 Generation 0: 67 collections, 0 parallel, 0.04s, 0.03s elapsed
316 Generation 1: 2 collections, 0 parallel, 0.03s, 0.04s elapsed
317
318 INIT time 0.00s ( 0.00s elapsed)
319 MUT time 0.01s ( 0.02s elapsed)
320 GC time 0.07s ( 0.07s elapsed)
321 EXIT time 0.00s ( 0.00s elapsed)
322 Total time 0.08s ( 0.09s elapsed)
323
324 %GC time 89.5% (75.3% elapsed)
325
326 Alloc rate 4,520,608,923 bytes per MUT second
327
328 Productivity 10.5% of total user, 9.1% of total elapsed
329 </programlisting>
330
331 <itemizedlist>
332 <listitem>
333 <para>"bytes allocated in the heap"はプログラムによって確保されたバイトの総量である。これはメモリ使用量の最大値よりも低いことがある。一部は開放されたかもしれないからである。
334 </para>
335 </listitem>
336 <listitem>
337 <para>GHCはコピーGCを使っている。"bytes copied during GC"はガベッジコレクション中にコピーしなければならなかったバイトの数を示す。
338 </para>
339 </listitem>
340 <listitem>
341 <para>プログラムによって実際に使われた空間の最大値が"bytes maximum residency"の数値である。これは大GCのときにしか検査されないから、単なる近似値である。標本(sample)の数によって何回検査されたかが分かる。
342 </para>
343 </listitem>
344 <listitem>
345 <para>"bytes maximum slop"は、GHCがデータをいわゆる「megablock」に詰めることによって無駄になった空間の最大値である。
346 </para>
347 </listitem>
348 <listitem>
349 <para>"total memory in use"はRTSがOSから確保したメモリの最大値である。
350 </para>
351 </listitem>
352 <listitem>
353 <para>次に、行われたガベッジコレクションについての情報がある。それぞれの世代について、ガベッジコレクションが何回行われたか、そのうち何回が複数のスレッドを使っていたか、その世代をGCするために使われたCPU時間の合計、その世代をGCするために経過した実時間の合計、が示されている。
354 </para>
355 </listitem>
356 <listitem>
357 <para>次に、CPU時間と経過した実時間を、そのときランタイムシステムが何をしていたかによって項目分けしたものがある。INITはランタイムシステムの初期化である。MUTはmutator time、すなわち実際にあなたのコードを走らせるのに掛かった時間である。GCはガベッジコレクションを行うのに掛かった時間である。RPは維持原因プロファイルを行うのに掛かった時間である。PROFはその他のプロファイルを行うのに掛かった時間である。EXITはランタイムシステムの終了処理時間である。最後に、Totalは、もちろん、合計である。
358 </para>
359 <para>%GCは、GCが全体の何%を占めるかを表している。"Alloc rate"は"bytes allocated in the heap"をMUT CPU時間で割ったものである。"Productivity"はCPU時間および経過した実時間の合計の何%がmutator(MUT)で消費されたかである。
360 </para>
361 </listitem>
362 </itemizedlist>
363
364 <para><literal>-S</literal>フラグは、<literal>-s</literal>フラグと同じものを出力するのに加え、GCが発生するたびにそれについての情報を表示する。
365 </para>
366
367 <programlisting>
368 Alloc Copied Live GC GC TOT TOT Page Flts
369 bytes bytes bytes user elap user elap
370 528496 47728 141512 0.01 0.02 0.02 0.02 0 0 (Gen: 1)
371 [...]
372 524944 175944 1726384 0.00 0.00 0.08 0.11 0 0 (Gen: 0)
373 </programlisting>
374
375 <para>個々のガベッジコレクションについて、表示するのは以下のものである。
376 </para>
377
378 <itemizedlist>
379 <listitem>
380 <para>このGCで確保したバイト数。
381 </para>
382 </listitem>
383 <listitem>
384 <para>このGCでコピーしたバイト数。
385 </para>
386 </listitem>
387 <listitem>
388 <para>現在生存しているバイト数。
389 </para>
390 </listitem>
391 <listitem>
392 <para>このGCに掛かった時間(CPU時間および経過した実時間)。
393 </para>
394 </listitem>
395 <listitem>
396 <para>これまでにプログラムが実行された時間(CPU時間および経過した実時間)。
397 </para>
398 </listitem>
399 <listitem>
400 <para>このGCで起こったページフォールトの個数。
401 </para>
402 </listitem>
403 <listitem>
404 <para>直近のGCの終了以降に起こったページフォールトの個数。
405 </para>
406 </listitem>
407 <listitem>
408 <para>GC対象の世代。
409 </para>
410 </listitem>
411 </itemizedlist>
412
96a515c @mkotha 6.6.1
authored
413 </listitem>
414 </varlistentry>
415 </variablelist>
416
417 </sect2>
418
419 <sect2>
5913a40 @mkotha update runtime_control.xml
authored
420 <title>並行性と並列性に関するRTSオプション</title>
421
422 <para>並行実行に関わるRTSオプションは<xref linkend="using-concurrent"/>で、並列計算に関わる物は<xref linkend="parallel-options"/>で、それぞれ説明されている。</para>
423 </sect2>
424
425 <sect2 id="rts-profiling">
426 <title>プロファイルに関するRTSオプション</title>
96a515c @mkotha 6.6.1
authored
427
5913a40 @mkotha update runtime_control.xml
authored
428 <para>プロファイルについてのランタイムオプションの大部分は、プログラムをプロファイル用にコンパイルした場合にのみ利用可能である。(<xref linkend="prof-compiler-options" />を見よ、またランタイムオプションについては<xref linkend="rts-options-heap-prof" />を見よ)。ただし、通常の非プロファイル版実行ファイルでも利用できるプロファイルオプションがただ一つ存在する。</para>
429
430 <variablelist>
431 <varlistentry>
432 <term>
433 <option>-hT</option>
434 <indexterm><primary><option>-hT</option></primary><secondary>RTS
435 option</secondary></indexterm>
436 </term>
437 <listitem>
438 <para>基本的なヒーププロファイルを、<literal><replaceable>prog</replaceable>.hp</literal>というファイルに生成する。ヒーププロファイルのグラフを作成するには、<command>hp2ps</command>(<xref linkend="hp2ps" />を見よ)を使えばよい。この基本的なヒーププロファイルは、データ構築子ごとに分類され、その他の種類のクロージャは<literal>FUN</literal>や<literal>THUNK</literal>といった広い範疇ごとにまとめられている。より詳細なプロファイルを得るには、完全なプロファイルサポート(<xref linkend="profiling"/>)を使えばよい。</para>
439 </listitem>
440 </varlistentry>
441 </variablelist>
96a515c @mkotha 6.6.1
authored
442 </sect2>
443
444 <sect2 id="rts-options-debugging">
445 <title>ハックする者、デバッグする者、及び好奇心過剰な魂のためのRTSオプション</title>
446
447 <indexterm><primary>RTS options, hacking/debugging</primary></indexterm>
448
449 <para>これらのRTSオプションは、(a)&nbsp;GHCのバグを回避するために、(b)&nbsp;「何が実際に起きているか」を知るために、(c)&nbsp;なんとなくそうしたいから、という理由で使うことができる。素人にはおすすめできない。</para>
450
451 <variablelist>
452
453 <varlistentry>
454 <term>
455 <option>-B</option>
456 <indexterm><primary><option>-B</option></primary><secondary>RTS option</secondary></indexterm>
457 </term>
458 <listitem>
459 <para>GC(メジャー)が始まるたびにベルを鳴らす。</para>
460
461 <para>実に奇妙なことだが、実際にこのオプションを使う人々が存在する。ダラム(イギリス)にいる我々の仲間、ポール・キャラハンは次のように書いている。「ここには色んな目的のためにこれを使う人々がいる&mdash;これは本当だ&mdash;例えば、コード/機械が何かをしているということを確認したり、無限ループを発見したり、最近付け加えたコードのコストを量ったりだ。ある種の人々はビープのパターンからプログラムがどの段階にいるかを聞き分けることさえできる。しかし最も重要な使いかたは、同じオフィスにいる他の人を鬱陶しがらせることである&hellip;」</para>
462 </listitem>
463 </varlistentry>
464
465 <varlistentry>
466 <term>
467 <option>-D</option><replaceable>num</replaceable>
468 <indexterm><primary>-D</primary><secondary>RTS option</secondary></indexterm>
469 </term>
470 <listitem>
471 <para>RTSのデバッグフラグ。<replaceable>num</replaceable>のどのビットが立っているかによって出力の量が異なる。RTSが<option>DEBUG</option>オプション付きでコンパイルされているときのみ効果がある。</para>
472 </listitem>
473 </varlistentry>
474
475 <varlistentry>
476 <term>
477 <option>-r</option><replaceable>file</replaceable>
478 <indexterm><primary><option>-r</option></primary><secondary>RTS option</secondary></indexterm>
479 <indexterm><primary>ticky ticky profiling</primary></indexterm>
480 <indexterm><primary>profiling</primary><secondary>ticky ticky</secondary></indexterm>
481 </term>
482 <listitem>
483 <para>プログラムの実行終了時に「ticky-ticky」統計情報を生成する。<replaceable>file</replaceable>の扱いは<option>-S</option>RTSオプション(上にある)の場合と同じである。</para>
484
485 <para>「ticky-ticky」統計情報とは、種々のプログラムの動作(update、enter、など)の回数である。プログラムは<option>-ticky</option><indexterm><primary><option>-ticky</option></primary></indexterm>付きでコンパイルされていなければならなず、また、まともに使うには、適切なシステムライブラリとリンクされていなければならない。これは簡単な作業ではない。簡単に「ticky-ticky」プロファイルを使えるようにする方法についてはインストールの手引きを参照せよ。さらなる情報は、<xref linkend="ticky-ticky"/>を見よ。</para>
486 </listitem>
487 </varlistentry>
488
489 <varlistentry>
490 <term>
491 <option>-xc</option>
492 <indexterm><primary><option>-xc</option></primary><secondary>RTS option</secondary></indexterm>
493 </term>
494 <listitem>
495 <para>(プログラムがプロファイルを取れるようにコンパイルしてある場合のみ利用可能) プログラム中で例外が発生したとき、このオプションが指定されていると、現在のコスト集約点スタックが<literal>stderr</literal>に出力される。</para>
496
497 <para>これは特にデバッグ時に有用である。プログラムが<literal>head []</literal>エラーを起こすが、コードのどの部分が原因か分からないとき、<literal>-prof -auto-all</literal>を付けてコンパイルし、<literal>+RTS -xc -RTS</literal>を付けて実行すれば、エラーが発生した地点の呼び出しスタックが正確に分かる。</para>
498
499 <para>発生した例外一つにつき一行が出力される。(プログラムは、実行を通して、例外を複数回発生させたり捕捉したりし得る)。各行は以下の形を取る。</para>
500
501 <screen>
502 &lt; cc<subscript>1</subscript>, ..., cc<subscript>n</subscript> &gt;
503 </screen>
504 <para>それぞれの<literal>cc</literal><subscript>i</subscript>はプログラム中のコスト集約点(<xref linkend="cost-centres"/>を見よ)であり、この列は例外が発生した地点での「呼び出しスタック」を表している。最も右にあるのが最も外側の関数である。</para>
505
506 </listitem>
507 </varlistentry>
508
509 <varlistentry>
510 <term>
511 <option>-Z</option>
512 <indexterm><primary><option>-Z</option></primary><secondary>RTS option</secondary></indexterm>
513 </term>
514 <listitem>
515 <para>GC時の「update-frame-squeezing」を<emphasis>無効に</emphasis>する。(There's no particularly good reason to turn it off, except to ensure the accuracy of certain data collected regarding thunk entry counts.(訳注: 訳せません。助けて))</para>
516 </listitem>
517 </varlistentry>
518 </variablelist>
519
520 </sect2>
521
522 <sect2 id="rts-hooks">
523 <title>RTSの振る舞いを変更するためのフック</title>
524
525 <indexterm><primary>hooks</primary><secondary>RTS</secondary></indexterm>
526 <indexterm><primary>RTS hooks</primary></indexterm>
527 <indexterm><primary>RTS behaviour, changing</primary></indexterm>
528
529 <para>GHCでは、ランタイムシステムから呼ばれるフックをコンパイル時に含めることで、任意のプログラムのRTS設定をある程度制御することができる。RTSにはこれら全てのフックのスタブ定義が含まれているが、自分の版を書いてGHCのコマンド行からリンクすることで、デフォルトと異なるものを使える。</para>
530
531 <para>DLLリンクの気まぐれのせいで、これらのフックはWindowsでプログラムが動的リンクでビルドされるときには働かない。</para>
532
533 <para><literal>ghc_rts_opts</literal><indexterm><primary><literal>ghc_rts_opts</literal></primary></indexterm>というフックを使うと、特定のプログラムのRTSオプションを恒久的に設定することができる。よくある使いかたは、プログラムのヒープやスタックをデフォルトより大きくすることである。例えば、<literal>-H128m -K1m</literal>を設定するには、まず以下の定義をCソースファイルに置く。</para>
534
535 <programlisting>
536 char *ghc_rts_opts = "-H128m -K1m";
537 </programlisting>
538
539 <para>このCファイルをコンパイルし、できたオブジェクトファイルを、Haskellプログラムをリンクするときのコマンド行に加えれば良い。</para>
540
541 <para>これらのフラグは、<literal>GHCRTS</literal>環境変数やコマンド行のフラグよりも先に解釈される。</para>
542
543 <para>ランタイムシステムがどうしようもなくなったとき(例えばスタックオーバーフロー)に表示される文言を変更することもできる。このためのフックは以下である。</para>
544
545 <variablelist>
546
547 <varlistentry>
548 <term>
549 <function>void OutOfHeapHook (unsigned long, unsigned long)</function>
550 <indexterm><primary><function>OutOfHeapHook</function></primary></indexterm>
551 </term>
552 <listitem>
553 <para>ヒープオーバーフローのメッセージ。</para>
554 </listitem>
555 </varlistentry>
556
557 <varlistentry>
558 <term>
559 <function>void StackOverflowHook (long int)</function>
560 <indexterm><primary><function>StackOverflowHook</function></primary></indexterm>
561 </term>
562 <listitem>
563 <para>スタックオーバーフローのメッセージ。</para>
564 </listitem>
565 </varlistentry>
566
567 <varlistentry>
568 <term>
569 <function>void MallocFailHook (long int)</function>
570 <indexterm><primary><function>MallocFailHook</function></primary></indexterm>
571 </term>
572 <listitem>
573 <para><function>malloc</function>が失敗したときに表示されるメッセージ。</para>
574 </listitem>
575 </varlistentry>
576 </variablelist>
577
578 <para>これらのフックの使いかたの例としては、GHCソースツリーの<filename>ghc/compiler/parser/hschooks.c</filename>にあるGHC自身のものを見よ。</para>
579 </sect2>
a2be81e @mkotha runtime_control.xml
authored
580
581 <sect2>
582 <title>RTSに関する情報を取得する</title>
583
584 <indexterm><primary>RTS</primary></indexterm>
585
586 <para>RTSに、自分自身の情報をいくらか表示させることが可能である。これをするには<option>--info</option>フラグを使う。例えば次のように。</para>
587 <screen>
588 $ ./a.out +RTS --info
589 [("GHC RTS", "Yes")
590 ,("GHC version", "6.7")
591 ,("RTS way", "rts_p")
592 ,("Host platform", "x86_64-unknown-linux")
593 ,("Build platform", "x86_64-unknown-linux")
594 ,("Target platform", "x86_64-unknown-linux")
595 ,("Compiler unregisterised", "NO")
596 ,("Tables next to code", "YES")
597 ]
598 </screen>
599 <para>この情報は、<literal>[(String, String)]</literal>型の値として読めるように整形されている。</para>
600 </sect2>
96a515c @mkotha 6.6.1
authored
601 </sect1>
602
603 <!-- Emacs stuff:
604 ;;; Local Variables: ***
605 ;;; mode: xml ***
606 ;;; sgml-parent-document: ("users_guide.xml" "book" "chapter" "sect1") ***
607 ;;; End: ***
608 -->
Something went wrong with that request. Please try again.