Linuxカーネルに大量のデータを保存する

Linuxカーネルに大量のデータを保存する

システムから受信したすべてのMP-TCPパケットに関するいくつかの追加情報をdmesgおよびsyslog(printkを使用)に印刷するカスタムLinuxカーネルがあります。すべてが完全に機能しますが(iperfツールを使用して)、非常に多数のパケットに対応する約2Gbpsのデータを生成しています。私のシステムのすべてのCPUはprintkのために100%ロードされました(CPUは4つです)。これは私のシステムのパケット処理に影響を与え、追加の問題と遅延を引き起こす可能性があることを心配しています。だから私の質問は、CPU負荷を増やすことなくLiunxカーネルにデータを保存する別の方法はありますか?

データサイズの例として、60秒のiperfセッションの場合、 `/var/log/syslog サイズは約1.2GBです。

ちなみに、報告されたデータをLinuxカーネルを介してオンラインで処理する必要はありません。オフラインモードで作業します。

答え1

おそらく確認してみるべきだと思います。、組み込みLinuxカーネル追跡ツール。たとえば、これは少し昔ながらです。グリーンネット記事説明する

Ftraceは次のような新しい形式のprintk()を導入しました。トレース印刷()。 printk()のように使用することも、任意のコンテキスト(割り込みコード、NMIコード、およびスケジューラコード)で使用することもできます。何がいいトレース印刷()はい、コンソールに出力されません。代わりに、Ftrace リングバッファに書き込み、トレースファイルから読み取ることができます。 Trace_printk() を使用してリングバッファに書き込むには約 10 分の 1 秒しかかかりません。

たとえば、カーネルまたはモジュールに次のようなものを追加できます。

trace_printk("read foo %d out of bar %p\n", bar->foo, bar);

これカーネル文書 ftrace.txt詳細があります。ディレクトリ内の/sys/kernel/debug/tracing/擬似ファイルのトレースリングバッファサイズを設定できますbuffer_size_kb

関連情報