profile プロバイダは、オペレーティングシステム内の任意の分解能のタイマーを使用します。任意の分解時間ベースの割り込みを完全にサポートしないアーキテクチャでは、周波数が、カーネル変数 hz で指定されたシステムクロックのクロック周波数によって制限されます。こうしたアーキテクチャーでは、hz より周波数が高いプローブは、1/hz 秒ごとに何回か起動します。たとえば、こうしたアーキテクチャで hz が 100 に設定されている場合、1000 ヘルツの profile プローブは、10 ミリ秒ごとに連続してすばやく 10 回起動します。任意の分解能をサポートするプラットフォームでは、1000 ヘルツの profile プローブは、ミリ秒ごとに 1 回ずつ起動します。
以下は、アーキテクチャの分解能をテストする例です。
profile-5000 { /* * We divide by 1,000,000 to convert nanoseconds to milliseconds, and * then we take the value mod 10 to get the current millisecond within * a 10 millisecond window. On platforms that do not support truly * arbitrary resolution profile probes, all of the profile-5000 probes * will fire on roughly the same millisecond. On platforms that * support a truly arbitrary resolution, the probe firings will be * evenly distributed across the milliseconds. */ @ms = lquantize((timestamp / 1000000) % 10, 0, 10, 1); } tick-1sec /i++ >= 10/ { exit(0); }
任意の分解能の profile プローブをサポートするアーキテクチャでは、このスクリプトを実行すると、 結果は均一の分布になります。
# dtrace -s ./restest.d dtrace: script './restest.d' matched 2 probes CPU ID FUNCTION:NAME 0 33631 :tick-1sec value ------------- Distribution ------------- count < 0 | 0 0 |@@@ 10760 1 |@@@@ 10842 2 |@@@@ 10861 3 |@@@ 10820 4 |@@@ 10819 5 |@@@ 10817 6 |@@@@ 10826 7 |@@@@ 10847 8 |@@@@ 10830 9 |@@@@ 10830 |
任意の分解能の profile プローブをサポートしないアーキテクチャでは、このスクリプトを実行すると、 結果は均一の分布になりません。
# dtrace -s ./restest.d dtrace: script './restest.d' matched 2 probes CPU ID FUNCTION:NAME 0 28321 :tick-1sec value ------------- Distribution ------------- count 4 | 0 5 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 107864 6 | 424 7 | 255 8 | 496 9 | 0 |
こうしたアーキテクチャで、実効プロファイルの分解能を改善するには、/etc/system ファイルを手作業で編集して、hz の値をチューニングします。
現在、すべての UltraSPARC (sun4u) は、任意の分解能の profile プローブをサポートしています。多くの x86 アーキテクチャ (i86pc) も、任意の分解能の profile プローブをサポートしていますが、バージョンの古いものの中には、一部サポートしないものもあります。