カーネルからの膨大なデータ出力を記録しようとしています。基本的に、カーネル内でプロセスのコンテキストがどのように切り替わるかをすべてログに記録しようとしています。1 分間のプロファイリングでも、記録されるデータは膨大になります。これを行うにはどうすればよいでしょうか。巨大なバッファーを開いてデータを記録し、さらに分析するためにユーザー空間に送信する必要があります。
編集:以下の「BIG」の大きさを明確にするために、約10000行の出力を解決しようとしている正確な問題です
カーネルからの膨大なデータ出力を記録しようとしています。基本的に、カーネル内でプロセスのコンテキストがどのように切り替わるかをすべてログに記録しようとしています。1 分間のプロファイリングでも、記録されるデータは膨大になります。これを行うにはどうすればよいでしょうか。巨大なバッファーを開いてデータを記録し、さらに分析するためにユーザー空間に送信する必要があります。
編集:以下の「BIG」の大きさを明確にするために、約10000行の出力を解決しようとしている正確な問題です
私の提案は、Linux カーネルがパケット、特にパケット リング バッファ (検索: PACKET_RX_RING) をキャプチャするために使用するのと同じ考え方を使用することです。
アイデアは非常に単純です。ユーザー空間プログラムで、リングを割り当てます。次に、このリングを「ドライバー」(カーネルモジュール)に渡すと、ドライバーはデータポイントをリングに書き込むだけで、ユーザー空間プログラムはこれらを読み取ることができます。それはリングなので、あなたは単純に書き続けることができ、クライアントは読み続けることができます - クライアントが遅れをとった場合、あなたのドライバーが(リングを回った後)引き継ぐ可能性がありますが、私はあなたができると確信していますリングを適切なサイズにします。
リングの各スロットには、ユーザー空間プログラムが簡単に読み取ることができる「シリアル化された」データが含まれている必要があります。このタイプのリングは、ロックフリーで実装するのがかなり簡単で、データがあるかどうかを確認するためにクライアントを回転させたいと思うでしょう。
このような大量のデータをエクスポートする「標準的な」方法は、debugfs を使用することです。ftrace (kernel/trace/ftrace.c) がこれを行う方法を確認できます。
さらに多くのデータについては、relayfs インターフェイス (kernel/relay.c) を使用できます。blktrace (kernel/trace/blktrace.c) でこれを行う方法を確認できます。