在Linux内核中存储海量数据

在Linux内核中存储海量数据

我有一个定制的 Linux 内核,它将有关系统中每个收到的 MP-TCP 数据包的一些附加信息打印到 dmesg 和 syslog(使用 printk)。一切工作完美,但是我正在生成大量数据(使用iperf工具),大约 2 Gbps 的数据,这对应于极高数量的数据包。由于 printk,我的系统中所有 CPU 都已 100% 加载(我有 4 个 CPU)。我担心这可能会影响我系统中的数据包处理并导致额外的问题和延迟。所以我的问题是有没有其他方法可以在不增加 CPU 负载的情况下将数据存储在 Liunx 内核中?

举一个数据大小的例子,对于 60 秒的 iperf 会话,`/var/log/syslog 的大小约为 1.2 GB。

让我补充一件事,我不需要通过Linux内核以在线方式处理报告的数据。我将在离线模式下处理它们。

答案1

你可能应该看看追踪,内置的Linux内核跟踪工具。例如,这个有点过时了绿网文章

Ftrace 引入了一种新形式的 printk() ,称为跟踪打印()。它可以像 printk() 一样使用,也可以在任何上下文中使用(中断代码、NMI 代码和调度程序代码)。有什么好的跟踪打印()是它不输出到控制台。相反,它写入 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

相关内容