Linux
在 Linux 核心中儲存大量數據
我有一個定制的 Linux 核心,它列印到 dmesg 和 syslog(使用 printk)關於系統中每個接收到的 MP-TCP 數據包的一些附加資訊。一切正常,但是我正在生成大量數據(使用
iperf
工具),大約 2 Gbps 的數據對應於非常多的數據包。由於 printk,我所有的 CPU 都 100% 載入到我的系統中(我有 4 個 CPU)。我擔心這可能會影響我係統中的數據包處理並導致其他問題和延遲。所以我的問題是有沒有其他方法可以在不增加 CPU 負載的情況下將我的數據儲存在 Liunx 核心中?舉一個數據大小的例子,對於 60 秒的 iperf 會話,`/var/log/syslog 的大小約為 1.2 GB。
讓我再補充一點,我不需要以線上方式處理 Linux Kernel 報告的數據。我將在離線模式下處理它們。
您可能應該查看ftrace,內置的 Linux 核心跟踪工具。例如,這篇稍微過時的LWN 文章說
**Ftrace 引入了一種名為trace_printk()**的新形式的 printk( ) 。它可以像 printk() 一樣使用,也可以在任何上下文中使用(中斷程式碼、NMI 程式碼和調度程式碼)。trace_printk ()的好處是它不會輸出到控制台。相反,它寫入 Ftrace 環形緩衝區,並且可以通過跟踪文件讀取。使用 trace_printk() 寫入環形緩衝區只需要大約十分之一微秒左右。
例如,您可以將這樣的內容添加到核心或模組中:
trace_printk("read foo %d out of bar %p\n", bar->foo, bar);
核心文件 ftrace.txt有詳細資訊。在目錄
/sys/kernel/debug/tracing/
中,您可以在偽文件中設置跟踪環緩衝區大小buffer_size_kb
。