原文はこちら。
https://blogs.oracle.com/linuxkernel/tracing-nfs%3a-beyond-tcpdump
このブログエントリはLinuxカーネル開発者のChuck Leverによるものです。歴史的に、tcpdumpとrpcdebugはNFSクライアントのトラブルシューティングで使われてきましたが、さすがに古くなってきました。Oracleでは、既存のツールをチェックし、タイミングに影響を与えたり、キャプチャ情報の損失を招くことなく、高負荷のワークロードや高性能ネットワーク・ファブリック上でNFSクライアントの動作を監視できる新しいツールを提供したいと考えています。
これはNFS開発者が使用できる最も貴重なツールの1つですが、いくつかの欠点があります。
Linuxには、NFSクライアントとRPCクライアントとサーバースタックに組み込まれた内部トレースメカニズムがあります。これは "rpcdebug"ファシリティとして知られています。これを有効にすると、NFS READの送信やRPCの各実行ステップなどの特定のイベントに対するメッセージをカーネルログ(通常は/var/log/messages)に追加します。
このメカニズムは、ネットワークキャプチャと同様の欠点を抱えています。より批判的に言えば、ユーザファイルではなくカーネルログやシステムコンソールに書き込むため、以下のような重大な欠点があります。
これらのトレースポイントは、開発者がソースコードの固定部分に追加した、重要な情報(RPC XID、ユーザーID、I/Oのサイズ、エラーコードなど)を取得できるポイントです。トレースポイントは常に使用可能であり、有効にしてもオーバーヘッドは低いままです。さらに、必要に応じて個々のトレースポイントのオン/オフを切り替えることができます。トレース・データはユーザー・ファイルに送られ、コンパクトな形式で保管されます。ユーザーデータはトレースポイントで公開されないので、キャプチャデータのサイズはずっと小さくなります。
LinuxカーネルのNFSクライアントには、すでに複数のNFSトレースポイントがあり、NFSクライアントおよびRPC層の操作のさまざまな運用時の情報を取得します。しかし、Oracleは最近、特にNFS I/O操作をキャプチャする一連のトレース・ポイントを提供しました。新しいトレースポイントは、v4.14 LinuxカーネルのNFSクライアントで初めて登場しました。
これには、すべてのNFS READ、WRITE、COMMIT操作の開始と操作の引数(データペイロードを除く)、終了、そしてそれぞれの操作で発生したエラーが含まれます。これらの6つのトレースポイントのそれぞれを個別に有効にすることも、一度に有効にすることもできます。生成される各イベントには、タイムスタンプ情報と、操作を要求したCPUコアおよびプロセスに関する情報が含まれます。
これらのトレースポイントを以下のような洗練された方法で使用できます。
https://blogs.oracle.com/linuxkernel/tracing-nfs%3a-beyond-tcpdump
このブログエントリはLinuxカーネル開発者のChuck Leverによるものです。歴史的に、tcpdumpとrpcdebugはNFSクライアントのトラブルシューティングで使われてきましたが、さすがに古くなってきました。Oracleでは、既存のツールをチェックし、タイミングに影響を与えたり、キャプチャ情報の損失を招くことなく、高負荷のワークロードや高性能ネットワーク・ファブリック上でNFSクライアントの動作を監視できる新しいツールを提供したいと考えています。
Historical NFS and RPC Debugging Facilities
ネットワークトラフィックが暗号化されていない限り、NFSの操作はNFSクライアントとNFSサーバーの間でネットワークをスヌーピングするすべての人から見えてしまいます。NFSの操作は、tcpdump、wireshark、またはsnoopなどを使い、クライアントまたはサーバーのいずれかで利用できるスヌーピングツールで取得できます。これらのツールには、ネットワークキャプチャやpcapファイルに含まれるNFSの操作を解析し、後で解析するためにファイルに保存したり、人間が読める解析形式で表示する機能があります。これはNFS開発者が使用できる最も貴重なツールの1つですが、いくつかの欠点があります。
- 最も有用なデータをキャプチャするためには、問題が発生したときに、ツールが実行されている必要があります。問題が発生した後にキャプチャされたデータは、一般に役に立ちません。
- キャプチャツールは膨大な量のデータを非常に迅速に生成できます。パケット・フィルタリングとパケット・キャプチャを旨く使ってファイルに束ねることで、解析対象のデータを軽減できます。
- データレートが高いため、このツールではキャプチャ実行中のシステムに大きなオーバーヘッドが発生する可能性がありますが、問題の再現を避けるため、タイミングを変更できます。そうしない場合、システムが追いつくのに十分なパフォーマンスがないために、重要なパケットがキャプチャされない可能性があります。
- ユーザーデータもこのツールでキャプチャされるため、結果として得られるキャプチャファイルのサイズが大きくなり、機密データの保存にNFSを使用している場合にはプライバシーの問題が発生します。
Linuxには、NFSクライアントとRPCクライアントとサーバースタックに組み込まれた内部トレースメカニズムがあります。これは "rpcdebug"ファシリティとして知られています。これを有効にすると、NFS READの送信やRPCの各実行ステップなどの特定のイベントに対するメッセージをカーネルログ(通常は/var/log/messages)に追加します。
このメカニズムは、ネットワークキャプチャと同様の欠点を抱えています。より批判的に言えば、ユーザファイルではなくカーネルログやシステムコンソールに書き込むため、以下のような重大な欠点があります。
- システムコンソールは、実際のシリアルポートであることことが多々あるため、デバッグメッセージの生成速度が制限され、NFS操作が遅くます。大量のNFSワークロードを実行している本番システムでrpcdebugを使用することは適切ではありません。
- 最近のLinuxディストリビューションでは、カーネルログにレート制限が組み込まれているため、短期間に数百のデバッグメッセージが表示された後、レートリミッタによって新しいメッセージが送信されます。問題の再現時には、問題が再現される前にレート制限が頻繁に発生します。
Introducing static trace points
大規模なワークロードや、NFSの同時ユーザーが多いシステム、またはますます高速なネットワークでNFSを頻繁に使用する場合、従来のデバッグ・メカニズムはもはや実行可能ではなく、代わりに、低いオーバヘッドと柔軟なイベント・フィルタリングを持つメカニズムが必要です。Linux NFSコミュニティは、この目的のために静的トレースポイントを採用しています。これらのトレースポイントは、開発者がソースコードの固定部分に追加した、重要な情報(RPC XID、ユーザーID、I/Oのサイズ、エラーコードなど)を取得できるポイントです。トレースポイントは常に使用可能であり、有効にしてもオーバーヘッドは低いままです。さらに、必要に応じて個々のトレースポイントのオン/オフを切り替えることができます。トレース・データはユーザー・ファイルに送られ、コンパクトな形式で保管されます。ユーザーデータはトレースポイントで公開されないので、キャプチャデータのサイズはずっと小さくなります。
LinuxカーネルのNFSクライアントには、すでに複数のNFSトレースポイントがあり、NFSクライアントおよびRPC層の操作のさまざまな運用時の情報を取得します。しかし、Oracleは最近、特にNFS I/O操作をキャプチャする一連のトレース・ポイントを提供しました。新しいトレースポイントは、v4.14 LinuxカーネルのNFSクライアントで初めて登場しました。
これには、すべてのNFS READ、WRITE、COMMIT操作の開始と操作の引数(データペイロードを除く)、終了、そしてそれぞれの操作で発生したエラーが含まれます。これらの6つのトレースポイントのそれぞれを個別に有効にすることも、一度に有効にすることもできます。生成される各イベントには、タイムスタンプ情報と、操作を要求したCPUコアおよびプロセスに関する情報が含まれます。
これらのトレースポイントを以下のような洗練された方法で使用できます。
- 一連の個々のNFS READ操作を記録し、記録されたタイムスタンプを使用して外れ値分析を生成する
- 本番ワークロードで、特定のエラー状態のNFS WRITE結果を監視する
- 負荷の大きいワークロードでも、サーバーの再起動時にNFS COMMITが正しく動作することを確認する
- NFSv4の状態回復がNFS I / O操作に与える影響を調べる
を使用して、カーネルNFSクライアントに関連するトレースポイントを検出します。v4.14のNFSクライアントに導入されたトレースポイントには以下のものが含まれます。trace-cmd list | grep nfs:
- nfs:nfs_initiate_read
- nfs:nfs_readpage_done
- nfs:nfs_initiate_write
- nfs:nfs_writeback_done
- nfs:nfs_initiate_commit
- nfs:nfs_commit_done