日本語 man コマンド類 (ja-man-1.1j_5) と日本語 man ドキュメント (ja-man-doc-5.4 (5.4-RELEASE 用) など) をインストールすると、以下のような man コマンド閲覧、キーワード検索が コンソールからできるようになります。
4.11-RELEASE-K, 5.4-RELEASE-K, 5.5-RELEASE-K, 6.0-RELEASE-K から 6.4-RELEASE-K, 7.0-RELEASE-K から 7.4-RELEASE-K, 8.0-RELEASE-K から 8.4-RELEASE-K, 9.0-RELEASE-K から 9.3-RELEASE-K, 10.0-RELEASE-K から 10.3-RELEASE-K, 11.0-RELEASE-K から 11.4-RELEASE-K, 12.0-RELEASE-K, 12.1-RELEASE-K は、 プライベート版 (小金丸が編集してまとめたもの) ですが、 より多くの翻訳したファイルが含まれています。 (5.4-RELEASE-K から 6.4-RELEASE-K, 7.0-RELEASE-K から 7.4-RELEASE-K, 8.0-RELEASE-K から 8.4-RELEASE-K, 9.0-RELEASE-K から 9.3-RELEASE-K, 10.0-RELEASE-K から 10.3-RELEASE-K, 11.0-RELEASE-K から 11.4-RELEASE-K, 12.0-RELEASE-K から 12.4-RELEASE-K, 13.0-RELEASE-K から 13.3-RELEASE-K, 14.0-RELEASE-K から 14.1-RELEASE-K は、全翻訳済み)
13.3-STABLE-K, 15.0-CURRENT-K は現在、作成中で日々更新されています。
Table of Contents
DEVSTAT(9) FreeBSD カーネル開発者マニュアル DEVSTAT(9) 名称 devstat, devstat_add_entry, devstat_end_transaction, devstat_end_transaction_bio, devstat_remove_entry, devstat_start_transaction -- デバイス統計値を保持するためのカーネルインタ フェース 書式 #include <sys/devicestat.h> void devstat_add_entry(struct devstat *ds, const char *dev_name, int unit_number, uint32_t block_size, devstat_support_flags flags, devstat_type_flags device_type, devstat_priority priority); void devstat_remove_entry(struct devstat *ds); void devstat_start_transaction(struct devstat *ds); void devstat_end_transaction(struct devstat *ds, uint32_t bytes, devstat_tag_type tag_type, devstat_trans_flags flags); void devstat_end_transaction_bio(struct devstat *ds, struct bio *bp); 解説 devstat サブシステムは、その名前が意味するように、記録デバイスの統計のた めのインタフェースです。目的は、それらを記録するために CPU 時間の最小の量 を利用する間に、適度に詳細な統計値を保持することです。したがって、統計値 の計算は、devstat コードのカーネル部分で実際に実行されません。代わりに、 それは、ユーザプログラムが扱うために残されています。 devstat_add_entry() は、devstat サブシステムでデバイスを登録します。呼び 出し側は、既に割り付けられ、この関数を呼び出す前に devstat 構造体を 0 ク リアされていると期待されます。devstat_add_entry() は、いくつかの引数を取 ります: ds クライアントによって割り付けられ、0 クリアされた devstat 構 造体。 dev_name デバイス名、例えば、da、cd、sa。 unit_number デバイスユニット番号。 block_size サポートされているなら、デバイスのブロックサイズ。デバイスが ブロックサイズをサポートしないなら、またはデバイスが devstat リストに追加される時点で、ブロックサイズが未知であるなら、そ れは、0 に設定されるべきです。 flags 操作がデバイスによってサポートされるか、またはサポートされな いことを示すフラグ。詳細については、以下を参照してください。 device_type デバイスタイプ。これは、次の 3 つのセクションに分かれててい ます: 基本的なデバイスタイプ (例えば、ダイレクトアクセス、 CDROM、シーケンシャルアクセス)、インタフェースタイプ (IDE、 SCSI または他のもの) とパススルーデバイスを示すパススルーフ ラグ。タイプの完全なリストについては、下記を参照してくださ い。 priority デバイスの優先度。優先度は、デバイスが devstat のデバイスの リスト内でどのようにソートされるかを決定するために使用されま す。デバイスは、優先度 (最高から最低に) によって最初にソート され、次に、アタッチされた順序でソートされます。利用可能な優 先度の完全なリストについては、下記を参照してください。 devstat_remove_entry() は、devstat サブシステムからデバイスを削除します。 それは、引数として問題のデバイスのための devstat 構造体を取ります。 devstat 世代番号は、増加され、デバイスの数は、減少されます。 devstat_start_transaction() は、devstat サブシステムでトランザクションの 開始を登録します。ビジーカウントは、各トランザクションの開始で増加されま す。デバイスがアイドルからビジーに移行するとき、システムの uptime (アップ タイム) は、devstat 構造体の start_time フィールドに記録されます。 devstat_end_transaction() は、devstat サブシステムでトランザクションの終 りを登録します。それは、次の 4 つの引数を取りります: ds 問題のデバイスのための devstat 構造体。 bytes このトランザクションで転送されたバイトの数。 tag_type トランザクションのタグのタイプ。タグのタイプについては、下記を 参照してください。 flags トランザクションが読み込みだったか、書き込みだったか、または データが転送できなかったかどうかを示すトランザクションフラグ は、 devstat_end_transaction_bio() は、biodone() のために準備されている struct bio からすべての情報を引き出す devstat_end_transaction() のためのラッパで す。 devstat 構造体は、次のフィールドから成っています: dev_links 各 devstat 構造体は、登録されるとき、リンクされたリス トに置かれます。dev_links フィールドは、devstat 構造体 のリストの次のエントリへのポインタを含んでいます。 device_number デバイス番号は、各デバイスのためのユニークな識別子で す。デバイス番号は、登録される個々の新しいデバイスのた めに増加されます。デバイス番号は、現在、単なる 32 ビッ トの整数ですが、40 億を超えるデバイス到着のイベントが あるシステムがあるなら、それは、拡張されるかもしれませ ん。 device_name デバイス名は、それ自体を識別するためにドライバを登録す ることによって与えられるテキスト文字列です。(例えば、 ``da'', ``cd'', ``sa'', など。) unit_number ユニット番号は、問題の周辺ドライバの特定のインスタンス を識別します。 bytes_written これは、デバイスに書き込まれたバイトの数です。この数 は、現在、符号なしの 64 ビット整数です。これは、32 ビット整数が使用されたなら、いくつかのシステムで非常に 速く生じるカウンタのラップをできれば除外します。 bytes_read これは、デバイスから読み込まれたバイトの数です。 bytes_freed これは、デバイスで解放された/削除されたバイトの数で す。 num_reads これは、デバイスからの読み込みの数です。 num_writes これは、デバイスへの書き込みの数です。 num_frees これは、デバイスの解放/削除操作の数です。 num_other これは、読み込みでも書き込みでもないデバイスへのトラン ザクションの数です。例えば、SCSI ドライバは、しばしば テストユニットレディ (test unit ready) コマンドを SCSI デバイスに送ります。テストユニットレディコマンドは、あ らゆるデータを読み込みも書き込みもしません。それによっ て、単にデバイスは、その状態を返します。 busy_count これは、デバイスのための未解決のトランザクションの現在 の数です。これは、決して 0 以下になるべきでなく、アイ ドルのデバイスにおいて、それは、0 であるべきです。これ らの条件の 1 つがいずれも真でないなら、それは、 devstat_start_transaction() と devstat_end_transaction() がクライアントのコードで呼び 出されている方法の問題を示しています。唯一のトランザク ションの開始イベントと各トランザクションに対して 1 つ のトランザクションの終了イベントがあるべきです。 block_size これは、デバイスにブロックサイズがあるなら、デバイスの ブロックサイズです。 tag_types これは、デバイスに送られる様々なタグのタイプの数を記録 するカウンタの配列です。タグのタイプのリストについて は、以下を参照してください。 dev_creation_time これは、デバイスが登録された getmicrotime() によって報 告されるような時間です。 busy_time これは、デバイスのビジーカウントが 0 を超えていた時間 の量です、これは、ビジーカウントが 0 に返るときのみ、 更新されます。 start_time これは、デバイスのビジーカウントが 0 から 1 の状態に なった getmicrouptime() によって報告されるような時間で す。 last_comp_time これは、トランザクションが最後に完了して getmicrouptime() によって報告されるような時間です。そ れは、デバイスのビジー時間を計算するために start_time とともに使用されます。 flags これらのフラグは、どの統計値の測定が特定のデバイスに よってサポートされるかを示します。これらのフラグは、統 計値を解釈するユーザランドのプログラムの助けとなるよう に役目を果たすことを主として目的としています。 device_type これは、デバイスのタイプです。それは、次の 3 つの部分 から成ります: デバイスタイプ (例えば、ダイレクトアクセ ス、CDROM、シーケンシャルアクセス、など)、インタフェー ス (IDE、SCSI またはその他) そして、問題のデバイスがパ ススルードライバであるかどうか。デバイスのタイプの完全 なリストについては、以下を参照してください。 priority これは、優先度です。これは、devstat リストに、どこでデ バイスを挿入するか決定するために使用される最初のパラ メータです。2 番目のパラメータは、アタッチの順序です。 利用可能な優先度のリストについては、以下を参照してくだ さい。 各デバイスに、デバイスのタイプを与えます。パススルーデバイスには、それら がそのためのインタフェースを提供するデバイスのような同じ基本的なデバイス のタイプとインタフェースがありますが、それらには、設定されたパススルーフ ラグもあります。基本のデバイスのタイプは、SCSI デバイスのタイプ番号と同一 ですので、SCSI 周辺デバイスで、問い合わせから返されたデバイスのタイプは、 適切であるなら、SCSI インタフェースのタイプとパススルーフラグで通常、論理 和 (OR) されます。デバイスタイプのフラグは、次の通りです: typedef enum { DEVSTAT_TYPE_DIRECT = 0x000, DEVSTAT_TYPE_SEQUENTIAL = 0x001, DEVSTAT_TYPE_PRINTER = 0x002, DEVSTAT_TYPE_PROCESSOR = 0x003, DEVSTAT_TYPE_WORM = 0x004, DEVSTAT_TYPE_CDROM = 0x005, DEVSTAT_TYPE_SCANNER = 0x006, DEVSTAT_TYPE_OPTICAL = 0x007, DEVSTAT_TYPE_CHANGER = 0x008, DEVSTAT_TYPE_COMM = 0x009, DEVSTAT_TYPE_ASC0 = 0x00a, DEVSTAT_TYPE_ASC1 = 0x00b, DEVSTAT_TYPE_STORARRAY = 0x00c, DEVSTAT_TYPE_ENCLOSURE = 0x00d, DEVSTAT_TYPE_FLOPPY = 0x00e, DEVSTAT_TYPE_MASK = 0x00f, DEVSTAT_TYPE_IF_SCSI = 0x010, DEVSTAT_TYPE_IF_IDE = 0x020, DEVSTAT_TYPE_IF_OTHER = 0x030, DEVSTAT_TYPE_IF_MASK = 0x0f0, DEVSTAT_TYPE_PASS = 0x100 } devstat_type_flags; デバイスには、それらが、devstat リストのどこに置かれるか大ざっぱに制御す る、それらに関連している優先度があります。優先度は、次の通りです: typedef enum { DEVSTAT_PRIORITY_MIN = 0x000, DEVSTAT_PRIORITY_OTHER = 0x020, DEVSTAT_PRIORITY_PASS = 0x030, DEVSTAT_PRIORITY_FD = 0x040, DEVSTAT_PRIORITY_WFD = 0x050, DEVSTAT_PRIORITY_TAPE = 0x060, DEVSTAT_PRIORITY_CD = 0x090, DEVSTAT_PRIORITY_DISK = 0x110, DEVSTAT_PRIORITY_ARRAY = 0x120, DEVSTAT_PRIORITY_MAX = 0xfff } devstat_priority; 各デバイスには、どの操作がサポートされるか、またはサポートされないかを示 すために、それに関連されたフラグがあります。devstat_support_flags 値は、 次の通りです: DEVSTAT_ALL_SUPPORTED すべての統計のタイプは、デバイスよってサポートさ れています。 DEVSTAT_NO_BLOCKSIZE このデバイスには、ブロックサイズがありません。 DEVSTAT_NO_ORDERED_TAGS このデバイスは、順序付けられたタグをサポートして いません。 DEVSTAT_BS_UNAVAILABLE このデバイスは、ブロックサイズをサポートしていま すが、それは、現在、利用不可能です。このフラグ は、ほとんどの場合、リムーバブルメディアのドライ ブで使用されます。 デバイスへのトランザクションは、devstat_end_transaction() に渡された flags で表わされる、3 つのカテゴリの 1 つに分類されます。トランザクション のタイプ処は、次の通りです: typedef enum { DEVSTAT_NO_DATA = 0x00, DEVSTAT_READ = 0x01, DEVSTAT_WRITE = 0x02, DEVSTAT_FREE = 0x03 } devstat_trans_flags; devstat_end_transaction() の tag_type 引数のために、次の 4 つの指定できる 値があります: DEVSTAT_TAG_SIMPLE そのトランザクションには、単純なタグがありました。 DEVSTAT_TAG_HEAD トランザクションには、キューのタグの先頭がありまし た。 DEVSTAT_TAG_ORDERED トランザクションには、順序付けられたタグがありまし た。 DEVSTAT_TAG_NONE デバイスは、タグをサポートしていません。 タグのタイプの値は、SCSI タグ定義の下位の 4 ビットに対応します。例えば、 CAM で、CCB からの tag_action は、devstat_end_transaction() に渡すタグの タイプを決定するために 0xf で論理和 (OR) されます。 <sys/devicestat.h> で定義されている、マクロ DEVSTAT_VERSION があります。 これは、devstat サブシステムの現在のバージョンで、devstat 統計にアクセス するユーザランドのプログラムの再コンパイルを要求する変更が行なわれるごと に、それは、増加されるべきです。ユーザランドのプログラムは、それらがカー ネルの devstat 構造体と同期しているかどうかを判断するために kern.devstat.version sysctl 変数によって、このバージョンを使用します。 関連項目 systat(1), devstat(3), iostat(8), rpc.rstatd(8), vmstat(8) 歴史 devstat 統計システムは、FreeBSD 3.0 で登場しました。 作者 Kenneth Merry <ken@FreeBSD.org> バグ 例えば、誰かが kern.devstat.all sysctl 変数を取って来ている間に、デバイス のリストが変更されないことを保証するために、devstat リスト操作コードのい くらかのまわりの spl() 保護の必要性があるかもしれません。 それは、1 つのトランザクションごとに時間を正確に測定するために現在の devstat アーキテクチャで不可能です。トランザクションごとに時間を正確に測 定する実現可能な唯一の方法は、トランザクションごとにタイムスタンプを記録 するそれが、個々のトランザクションのためにタイムスタンプを格納する、シス テムの性能とコスト空間に悪影響を及ぼすように、この測定は、恐らくほとんど の人々にとって有益ではありません。 FreeBSD 11.4 May 22, 1998 FreeBSD 11.4