zlog日志打印时间有些乱序

killer007 发布于 2012/08/24 14:34
阅读 1K+
收藏 0

NGINX社区官方微服务训练营,深入了解K8s网络,线上课程+专家答疑,立即加入>>>

您好!

zlog会出现下面的情况:时间上好像有些乱序,请问是什么原因? 是否是因为小弟没有设置相关参数:

日志截图

以下是问题补充:

@killer007:多线程情况下 (2012/08/24 15:04)
加载中
0
拉菲一箱
拉菲一箱
估计是多线程
0
killer007
killer007
是在多线程情况下出现的此问题,时间乱序毕竟对问题定位不利
0
难易
难易

这是有可能的,因为在写一次日志的过程中,取时间是其中一步

......

get_time

write_file

......

如果AB两个线程在时间上是这么执行的话

 

A  get_time

B  get_time

B  write_file

A  write_file

于是后面的时间就会比前面的时间先打印。

如果要严格规避这个问题,目前我想到的办法有

需要让每条写日志的语句都是原子性的,在一个进程内,代价太大。

或者可以把多个线程的日志分开来写,可以保证不乱序。

难易
难易
原子就要锁,要锁就意味着A线程什么时候写日志要等待B线程,如果B线程卡住了,那么A线程也一起卡住。。。
killer007
killer007
如果将取时间与写操作做为原子操作是否可以解决此问题
killer007
killer007
个人觉得这个问题还是要解决一下,大家一起想一个兼顾速度与开销的方案,把zlog做的更加完善!
0
难易
难易

这个问题的解决等价于要排序,多线程先获取时间的先写文件,也就是说有个线程要已经获取了时间,但要等待别的线程写完文件后再写。

任何等待是需要开销的,CPU空转,或其他之类的,要和别的线程通信。

所以从库的角度出发,如果要解决这个问题,必然要牺牲工作线程的性能,用于等待其他线程,而得到的好处是日志排序的细微改进。所以我觉得意义不大,不过你提这个问题还是很好的。

如果为了追求精确性,可以在事后排序,用sort过一遍日志文件。

 

0
killer007
killer007
刚才试验了一下log4cplus在多线程下打印无乱序现象,但它是C++实现,不知是否有参考价值
刘畅1987
刘畅1987
个人感觉无需进行排序,在多进程下,这样很正常,若要追踪错误,应该根据PID 进行日志筛选,这样就不会有时间错位了把。
难易
难易
要么是它太慢了,以至于无法观察到这种现象。。 要么是它每次写日志都要加全局的进程锁,这也同样会导致慢。 zlog也不会每次都出现这种情况的。
0
wallwind
wallwind
ACE里的日志打印基本没有时间乱序问题。可以参考一下他。
0
难易
难易
回头来说其实可以不用锁,用一个无锁的消息队列来搞就可以了。。。
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部