dmesg 时间误差现象

Posted edisonfish

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了dmesg 时间误差现象相关的知识,希望对你有一定的参考价值。

案例现象

这天收到监控平台发来的告警,说有台机器程序崩溃了

 

因为以前也有过相关的错误,根据经验,用 dmesg命令看下内核信息

 

发现有点不对劲,报错信息的时间跟告警时间不一致,正常来讲报错时间应该跟告警时间一致

 

使用 date 命令查看一下当前系统时间

 

然后我们查看一下系统日志

 

由上面的输出可以看到:

dmesg 显示错误信息的时间跟系统日志 /var/log/messages显示错误信息的时间不一致

 

定位问题

 

我们知道, dmesg  和  /var/log/messages 都是用来记录服务器启动、运行期间的日志的

 

当机器出现问题时,运维人员可以从这两个日志输出中进行初步排查

 

我们来看下 dmesg 输出和 /var/log/messages 的区别

  • dmesg 显示内核和内核模块的相关信息,/var/log/messages 不但显示内核信息,还显示系统活动信息

  • 可以说 dmesg 输出的信息是 /var/log/messages 的子集, dmesg 输出的信息在 ring buffer 中维护,大小有限制

  • /var/log/messages包含所有系统消息以及dmesg 中的信息

 

那为什么这台机器上 dmesg 显示错误信息的时间跟系统日志 /var/log/messages显示错误信息的时间不一致呢?

 

由上面得知,我在查看 dmesg 信息的时候使用了 -T 参数,我们来看一下这个参数的含义

 

这个 -T 参数可以直接转换为人类可读时间(即年月日时分秒),但是不一定精确,如果系统挂起或者恢复之后,日志使用的时间源是不会更新的

 

也就是说,dmesg -T 输出的内核信息并不能保证时间的准确性

 

又因为 dmesg -T 中记录的时间是系统启动时间到事件发生时间的时间差,这台机器每天都会进行 NTP 时间同步以及每隔一段时间会进行重启

 

所以就会出现内核日志的时间与系统日志时间不一致的现象

 

解决方案

关于dmesg -T 时间戳不精确的情况,我查了好多资料都说没有解决方法

 

 

 

所以在这里我建议大家如果想要获得准确的时间信息,就去查看系统日志——/var/log/messages

 

如果有小伙伴知道该如何解决的,可以告诉我

 

最后附上相关 issue 链接:

  1. https://serverfault.com/questions/576139/dmesg-time-vs-system-time-time-isnt-correct

  2. https://bugzilla.redhat.com/show_bug.cgi?id=895909

  3. https://blog.tankywoo.com/2015/02/03/about-timestamp-in-dmesg.html

 

 


感谢阅读,喜欢作者就动动小手[一键三连],关注公众号【咸鱼运维杂谈】,这是我写作最大的动力

 

模型评估与选择

  首先谈谈什么是“经验误差”与“过拟合”。我们把学习器的实际预测输出与样本的真实输出之间的差异称为“误差”,学习器在训练集上的误差称为“训练误差”或“经验误差”;而在新样本上的误差称为“泛化误差”,显然,我们希望得到泛化误差小的学习器,但是若学习的太好是,就有可能把训练样本自身的一些特点当做了所有潜在样本都会具有的一般性质,这样就会导致泛化性能下降,这种现象称为“过拟合”,而与之相对的是“欠拟合”,即指对训练样本的一般性质尚未学好。

  关于评估方法:即通过一个“测试集”来测试学习器对新样本的判别能力,然后以测试集上的“测试误差”作为泛化误差的近似。那么,如何划分训练集和测试集呢?第一种称为“留出法”,即将一个数据集划分两个部分,一个作为“训练集”,另一个作为“测试集”,至于怎么划分,这里就看比例了,而且不同比例的划分就会导致不同的误差的不同,所以一般对于留出法而言,一般要采用若干次随机划分、重复进行试验评估后取平均值作为留出法的评估结果;常见的做法是将数据集的2/3~4/5作为训练集,剩余的作为测试集。

以上是关于dmesg 时间误差现象的主要内容,如果未能解决你的问题,请参考以下文章

String to Double出现误差

如何将 dmesg 时间戳转换为自定义日期格式?

Best名品腕表:腕表走时误差大的几个常见原因

求一篇关于 平面度误差的测量和评定 相关的外文翻译,字数在两千字左右,若符合要求,给五十分。

[JAVA面试题]为什么会出现4.0-3.6=0.3999999999这种现象?

从内核模块读取 dmesg