我正在尝试从内核记录大量数据输出。本质上,我试图记录内核中所有进程上下文切换的方式。即使是 1 分钟的分析记录的数据也会很大,我该怎么做呢?我必须打开一个巨大的缓冲区,将数据记录在其中,然后将其发送到用户空间进行进一步分析。
编辑:为了澄清下面的“大”有多大是我试图解决大约 10000 行输出的确切问题
我正在尝试从内核记录大量数据输出。本质上,我试图记录内核中所有进程上下文切换的方式。即使是 1 分钟的分析记录的数据也会很大,我该怎么做呢?我必须打开一个巨大的缓冲区,将数据记录在其中,然后将其发送到用户空间进行进一步分析。
编辑:为了澄清下面的“大”有多大是我试图解决大约 10000 行输出的确切问题
我的建议是使用 linux 内核用于捕获数据包的相同想法,特别是数据包环形缓冲区(搜索:PACKET_RX_RING)。
这个想法很简单,在你的用户空间程序中,分配环。然后将此环传递给“驱动程序”(您的内核模块),然后您的驱动程序可以简单地将数据点写入环,您的用户空间程序可以读取这些数据。因为它是一个环,您可以简单地继续写入,客户端可以继续读取 - 如果客户端落后,您的驱动程序可能会超车(一旦它绕过环),但我相信你可以适当调整戒指的大小。
环中的每个插槽都应该包含您的“序列化”数据,用户空间程序可以简单地读取这些数据。这种类型的环应该很容易实现无锁,并且很可能您希望您的客户端旋转以查看是否有数据。
好吧,导出这么多数据的“标准”方式是使用 debugfs。你可以看看 ftrace (kernel/trace/ftrace.c) 是如何做到这一点的。
而且,对于更多数据,您可以使用 relayfs 接口 (kernel/relay.c)。你可以看看 blktrace (kernel/trace/blktrace.c) 是如何做到这一点的。