PERFMON(4)

名称
perfmon - CPU の性能モニタリングをするインタフェース

書式
cpu "I586_CPU" cpu "I686_CPU" options PERFMON

解説
perfmon ドライバにより Intel の Pentium と Pentium Pro の CPU 内部の性能モニタリング機能にアクセスできます。 これらのプロセッサには多彩なイベントについて発生回数または (CPU サイクルでの) 持続時間のどちらかを測定するように設定できる 2 個の内部カウンタと、同じくクロックサイクルを数える 1 個のサイクルカウンタが実装されています。 perfmon ドライバではこれらの機能に対してデバイス形式によるインタフェースを提供 します。

性能モニタリングをするカウンタへの全てのアクセスは デバイス型特殊ファイルの “/dev/perfmon” を媒介として処理されます。 このデバイスが提供する ioctl(2) リクエストは多くあり <machine/perfmon.h> の中で定義され、このファイルの中には Pentium と Pentium Pro プロセッサの両方の色々なカウンタの定義もあります。

注意事項: 利用可能なイベントの集合はプロセッサ毎に異なります。 使用されるイベントコードが測定される CPU の型式に対して 適正であることを確認することはプログラマの責任です。

以下の ioctl(2) リクエストが定義されています:

PMIOSETUP
    (struct pmc) 構造体に定義されているパラメータとフラグでカウンタを設定します。 以下のフィールドが struct pmc に定義されています:

    int pmc_num
        指定するカウンタ番号です。 NPMC (現在は 2) より小さくなければなりません。

    u_char pmc_event
        モニタすべき特定のイベントコードで、 <machine/perfmon.h> に定義されています。

    u_char pmc_unit
        イベントの型に対応する装置のマスクの値です ( Intel の文書を参照)。

    u_char pmc_flags
        カウンタの働きを変更するフラグ (下記参照) です。

    u_char pmc_mask
        カウンタのマスクの値です。つまり、本来、この値は指定された数のクロック 以上 (又は以下) の間継続するイベントにカウントを制限する為に使用されるしきい値 です。

    次のような pmc_flags の値が定義されています:
    PMCF_USR
        イベントをユーザモードでカウントします。
    PMCF_OS
        イベントをカーネルモードでカウントします。
    PMCF_E
        イベントを持続時間ではなくその数でカウントします。
    PMCF_INV
        カウンタのマスクの比較の意味を逆転します。

PMIOGET
    (struct pmc) 指定されたカウンタの現在の設定を返します。

PMIOSTART

PMIOSTOP
    (int) 指定したカウンタを起動 (停止) します。ハードウェアの欠陥により、番号順に 起動と停止をしなければなりません。 (即ち、カウンタ 0 は必ずまずカウンタ 1 を停止してから停止しなければなりません)。 ドライバではこの制約を 強制していません (と言うのも将来の CPU ではこの制約はなくなるかも知れません)。

PMIORESET
    (int) 指定されたカウンタを 0 にリセットします。カウンタはリセットする前に PMIOSTOP により停止されなければなりません。全てのカウンタは自動的に PMIOSETUP によってリセットされます。

PMIOREAD
    (struct pmc_data) カウンタの現在の値を取り出します。 pmc_data 構造体には次のような 2 個のフィールドが定義されています:

    int pmcd_num
        読み出すカウンタの番号。
    int pmcd_value
        64 ビットの符号付き整数での終了値。

    将来、 Pentium Pro プロセッサから カウンタを直接読み出す為に RDPMC 命令を使用出来る様になるでしょう。

PMIOTSTAMP
    (struct pmc_tstamp) タイムスタンプカウンタを読み出します。 pmc_tstamp 構造体では 2 個のフィールドが定義されています:

    int pmct_rate
        カウンタの MHz でのおおよその速度です。
    quad_t pmct_value
        64 ビット整数でのカウンタの現在の値です。

    pmct_rate フィールドに与えられるカウンタの速度は、 校正が困難な事やクロックの進行が不完全な為に、 往々にして正確ではないことに注意する事が大切です。 このフィールドについては クロックが刻む速度を実際に表示するものというよりも 手がかりか又は適正さの検査くらいに考えるべきです。

関連ファイル
/dev/perfmon
    カウンタへの文字型デバイスのインタフェース
/usr/include/machine/perfmon.h
    構造体とイベントコードを定義しているインクルードファイル
/usr/share/examples/perfmon
    全ての ioctl() コマンドの使用を具体的に例示したサンプルのソースコード

関連項目
ioctl(2) Intel Corporation, Pentium Pro Family Developer's Manual, January 1996, vol. 3, Operating System Writer's Manual. インテルジャパン株式会社, Pentium Pro ファミリー ディベロッパーズ マニュアル, January 1996, 下巻, オペレーティング システム ライターズ マニュアル.

歴史
The perfmon デバイスは FreeBSD 2.2 で初めて現れました。

作者
perfmon ドライバは Garrett A. Wollman, MIT Laboratory for Computer Science が書きました。