2

有没有任何提示或方法可以避免内核日志丢失或日志缓冲区溢出?如何避免在Linux内核中的printk日志丢失

我已将日志缓冲区大小增加到最大值,并且代码更改如下。我只在高端设备上运行。但是,当我想从我的驱动程序(写入大量日志)中获取完整日志时,我发现printk日志有时会丢失。我用KERN_INFO使用printk,通过动态调试(dprintk)启用。

更改我做的:

--- a/kernel/printk.c 
+++ b/kernel/printk.c 
@@ -55,7 +55,7 @@ void asmlinkage __attribute__((weak)) early_printk(const char *fmt, ...) 
{ 
} 

-#define __LOG_BUF_LEN (1 << CONFIG_LOG_BUF_SHIFT) 
+#define __LOG_BUF_LEN (1 << 17) 

命令我使用写入文件:

cat "/proc/kmsg">/sdcard/klog.txt 

仅在调试时,我没事,如果性能处于降级我但是,我不想丢弃任何日志。我知道我们不能让工作队列/线程等到打印完成。但是,还有什么方法可以保证,日志不会丢失。

+0

'#tail -f/var/log/messages> /tmp/tmplog.txt&'是解决此问题的一种简单方法。 – 2014-10-16 21:58:10

回答

0

两种方式:

  1. 执行cat/proc/kmsg>某些文件的位置&

  2. 这是更复杂的: 由于采伐过度,不使用dmesg缓冲区呢?

A>在您的驱动初始化,分配单独的缓冲器空间为所希望的尺寸(较大的缓冲液)

B的测井>创建一个单独的函数来记录它说my_log_buf(“调试检查点1”) ;其登录到上述缓冲

C>给一个读取系统接口和使用cat/SYS /(一些暴露接口)读取它

1

简单,只需要添加“printk.synchronous = 1”到内核CMDLINE。

printk()现在已经完全异步了。你可以添加printk.synchronous = 1让printk()同步。

参考补丁“的printk:请printk的()完全异步”:

目前,中printk()有时等待消息被打印到 控制台,有时不(当console_sem举行通过一些 其他过程)。如果printk()获取console_sem并开始将 打印到控制台,它会从内核printk缓冲区输出消息,直到 缓冲区为空。当连接串行控制台时,打印速度较慢,因此当打印一个CPU时,系统中的其他CPU有足够的时间将新的 消息附加到缓冲区。因此,CPU可以在console_unlock()中花费无限的时间进行打印。 如果在中断被禁用的情况下调用了printk()调用 console_unlock(),则这是特别严重的问题。

实际上用户已经观察到了CPU可以花几十秒在console_unlock( 打印)(通常在数百 SCSI设备被发现在引导过程中)造成RCU摊位(CPU做 打印不达到静止状态很长一段时间),softlockup 报告(打印CPU的IPI没有得到服务,因此其他 CPU正在等待打印CPU处理IPI),并最终导致机器死亡(作为来自失速和锁定的消息将 附加到printk缓冲区比我们能够打印的更快)。因此,这些机器 无法使用连接的串行控制台进行引导。另一个观察到的 问题在于,由于printk速度较慢,因此在内核管理发现所有连接的硬件之前,硬件发现速度较慢并且超时。在人工压力测试期间, SATA磁盘从系统 中消失,因为其中断服务时间太长。

此修补程序使printk()完全异步(类似于迄今为止所做的 printk_deferred())。它将消息附加到内核 printk缓冲区和wake_up()是一个特殊的专用k线程,以便将 打印到控制台。这具有以下优点:总是从可调度的情节发生 ,因此我们不锁定任何特定的CPU或甚至中断。另外它的优点是,printk()是快速的,因此内核启动不会因缓慢的 串行控制台而减慢。这种方法的缺点是,在发生故障 时,重要消息不会出现在控制台 输出中(我们可能需要将工作计划打印到控制台)。 如果oops正在进行,我们通过将printk切换为原始的 立即打印到控制台的方法来稍微缓解此风险。

异步printk暂时被认为是不太可靠的 比同步的,所以默认情况下我们保持printk在 同步模式下运行。有一个printk.synchronous内核参数 允许选择同步/异步模式作为引导参数或稍后从 用户空间通过sysfs旋钮。

的printk()预计不同的条件下和在 不同的使用状况,包括OOM的角落情况下,当所有的 工人正在忙碌(如内存分配),从而中printk()使用它自己 专用打印KTHREAD ,而不是依赖于工作队列(即使 与WQ_MEM_RECLAIM位设置,我们可能会收到 打印的延迟,直到工作队列声明 - > mayday,如Tetsuo Handa所述)。