如何在内核中记录大量数据

时间:2012-11-17 17:40:19

标签: c process linux-kernel buffer

我正在尝试记录内核的巨大数据输出。本质上,我试图记录内核中进程上下文切换的所有方式。即使是1分钟的分析,记录的数据也是巨大的,我该怎么做。我必须打开一个巨大的缓冲区,记录其中的数据,然后将其发送到用户空间进行进一步分析。

编辑:澄清下面“BIG”的大小是我试图解决其大约10000行输出的确切问题

2 个答案:

答案 0 :(得分:6)

我的建议是使用linux内核用来捕获数据包的相同想法,特别是数据包环缓冲区(搜索:PACKET_RX_RING)。

这个想法很简单,在你的用户空间程序中,分配环。然后将此环传递给“驱动程序”(您的内核模块),然后您的驱动程序可以简单地将数据点写入环,并且您的用户空间程序可以读取这些。因为它是一个响铃,你可以继续写作,客户端可以继续阅读 - 如果客户端落后,你的驱动程序有可能过度接受(一旦它在环上),但我相信你可以适当调整戒指尺寸。

环中的每个插槽都应包含用户空间程序可以读取的“序列化”数据。这种类型的环应该很容易实现无锁,很可能你希望你的客户端旋转以查看是否有数据。

答案 1 :(得分:0)

嗯,导出这么多数据的“标准”方法是使用debugfs。你可以看看ftrace(kernel / trace / ftrace.c)是如何做到这一点的。

而且,对于更多数据,您可以使用relayfs接口(kernel / relay.c)。你可以看看blktrace(kernel / trace / blktrace.c)是如何做到这一点的。